İndikatör adı: CMFG

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using Matriks.Data.Identifiers;
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;
namespace Matriks.Lean.Algotrader
{
	//Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır.
	//Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries
	[IndicatorInformationAttribute("CMFG", IndicatorDrawingArea.NewWindow)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformationAttribute(new []
		{
			"CMFG(0)"
		})]

	public class CMFG : MatriksIndicator
	{
		//Indicator opsiyon panelinde değerleri değiştirebildiğimiz parametreler. Int, Bool, Decimal ve Enum değerleri alabilir.Tüm değişken tiplerini DefaultValue ile tanımlarız. 
		[DefaultValue(21)]
		public int Period
		{
			get; set;
		}

		MOV movVolume, movMFV;

		public sealed override void OnInit()
		{
			movVolume = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Volume, Period, MovMethod.Simple);
			movMFV = new MOV(Period, MovMethod.Simple);
		}

		/// <summary>
		/// Seçilen sembolün bardata'ları güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="currentBar">Güncellenen bardata'nın indexteki sırası</param>
		/// <param name="inputValue">Seçilen OHLC tipine göre gelen bardata'nın o anki değeri</param>
		/// <param name="barDateTime">Bardata'ya gelen güncelleme zamanı</param>
		public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
		{
			SetLine(currentBar, 0);

			//Seçilen sembolün bardatasına Instrument.SymbolBarData şeklinde ulaşabiliriz.
			var barDataModel = Instrument.SymbolBarData;

			//Money Flow Multiplier = ((Close value – Low value) – (High value – Close value)) / (High value – Low value)
			decimal mfm = ((barDataModel.Close[currentBar] - barDataModel.Low[currentBar]) - (barDataModel.High[currentBar] - barDataModel.Close[currentBar])) / (barDataModel.High[currentBar] - barDataModel.Low[currentBar]);

			//Money Flow Volume = Money Flow Multiplier x Volume for the Period
			decimal mfv = mfm * barDataModel.Volume[currentBar];
			movMFV.Update(mfv, currentBar, barDateTime);

			if (currentBar < Period)
			{
				return ;
			} else
			{
				//CMF = 21-day Average of the Daily Money Flow / 21-day Average of the Volume
				decimal cmf = movMFV.Value[0][currentBar] / movVolume.Value[0][currentBar];
				SetLine(currentBar, cmf);
			}

		}
	}
}