Üstel hareketli ortalama (EMA), daha güncel verilere daha fazla ağırlık vererek fiyat değişimlerine daha hızlı tepki verir. Bu özelliği sayesinde, EMA genellikle trend takibi ve ani piyasa hareketlerini yakalamak amacıyla kullanılır.

EMA indikatöründe, fiyat çubuğu EMA bandının üstüne kırdığı anda alım,
altına kırdığı anda satım sinyali üretilir.
Emirler piyasa fiyatından gönderilir.
Emir gönderildiğinde, strateji raporunun Debug sekmesinde
“Alış emri gönderildi.” ve “Satış emri gönderildi.” ifadeleri yer alır.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using Matriks.Data.Tick;
using Matriks.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;
using Newtonsoft.Json;



namespace Matriks.Lean.Algotrader
{
	public class EMAStrategy : MatriksAlgo
	{
		// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
		// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.

		[SymbolParameter("GARAN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min5)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(100)]
		public decimal BuyOrderQuantity;

		[Parameter(100)]
		public decimal SellOrderQuantity;
		
		[Parameter(22)]
		public int EmaPeriod;
		
		EMA ema;
		 
		public override void OnInit()
		{
			ema = EMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, EmaPeriod);

			AddSymbol(Symbol, SymbolPeriod);

			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(true);
		}

		/// <summary>
		/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var barDataModel = GetBarData();
			if (CrossAbove(barDataModel, ema, OHLCType.Close))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri gönderildi.");
				Debug("Close = " + barData.BarData.Close);
				Debug("Ema = " + ema.CurrentValue);
			}
			if (CrossBelow(barDataModel, ema, OHLCType.Close))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gönderildi.");
				Debug("Close = " + barData.BarData.Close);
				Debug("Ema = " + ema.CurrentValue);
			}
		}

		/// <summary>
		/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
		/// </summary>
		public override void OnStopped()
		{
		}
	}
}