İlk defa Matriks IQ kullanıp, C#'de kodlama yapıyorum. Elimden geldiğince bu stratejiyi yarattım ancak backtest/çalıştırma yapamıyorum çünkü Sıfırla bölme girişiminde bulunuldu diye hata alıyorum.
Hatam nerede birisi gösterirse sevinirim.
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
{
	public class Attrition : MatriksIndicator
	{
		[SymbolParameter("BTC_USDT_BIN")]
		public string Symbol;
		[Parameter(SymbolPeriod.Min15)]
		public SymbolPeriod AttritionPeriod;
		[Parameter(1)]
		public decimal SellOrderQuantity;
		[Parameter(1)]
		public decimal BuyOrderQuantity;
		HullMA hullMA;
		VPT vpt;
		SMA sma20, smabb, smafinal;
		EMA EmaVCFast, EmaVCSlow, EmaVFash, EmaVSlow, EmaVWMacd, emafinal;
		MOM mom;
		AwesomeOscillator ao;
		ROC roc;
		CCI cci;
		DI di;
		//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(5)]
		public int Period
		{
			get; set;
		}
		[DefaultValue(22)]
		public int HullMAPeriod
		{
			get; set;
		}
		[DefaultValue(12)]
		public int FastPeriod
		{
			get; set;
		}
		[DefaultValue(26)]
		public int SlowPeriod
		{
			get; set;
		}
		[DefaultValue(9)]
		public int SignalPeriod
		{
			get; set;
		}
		public int Length = 30;
		RSI rsi;
		public sealed override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);
			di = DIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 5);
			cci = CCIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 21);
			roc = ROCIndicator(Symbol, SymbolPeriod, OHLCType.Close, 20);
			ao = AwesomeOscillatorIndicator(Symbol, SymbolPeriod, OHLCType.Close, 5, 34);
			mom = MOMIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);
			EmaVFash = EMAIndicator(Symbol, SymbolPeriod, OHLCType.Volume, FastPeriod);
			EmaVSlow = EMAIndicator(Symbol, SymbolPeriod, OHLCType.Volume, SlowPeriod);
			emafinal = EMAIndicator(Symbol, SymbolPeriod, OHLCType.Close);
			smafinal = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close);
			EmaVCFast = new EMA(FastPeriod);
			EmaVCSlow = new EMA(SlowPeriod);
			EmaVWMacd = new EMA(SignalPeriod);
			smabb = new SMA(Length);
			sma20 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, 20);
			vpt = VPTIndicator(Symbol, SymbolPeriod, OHLCType.Close);
			hullMA = HullMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, HullMAPeriod);
			WorkWithPermanentSignal(true);
			SendOrderSequential(true);
		}
		decimal fastMA, slowMA, VxC, vwmacd, signal, hist;
		public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
		{
			var barDataModel = GetBarData();
			var kaynak = Instrument.SymbolBarData.Close[currentBar];
			var kapanis = kaynak;
			var prev = Value[0][currentBar -1];
			var hac = Instrument.SymbolBarData.Volume[currentBar];
			var op = Instrument.SymbolBarData.Open[currentBar];
			var hi = Instrument.SymbolBarData.High[currentBar];
			var lo = Instrument.SymbolBarData.Low[currentBar];
			var hilo = hi - lo;
			var openclose = (kaynak - op) * 100;
			decimal smapoint = 0;
			decimal histpoint = 0;
			if (kaynak > sma20)
			{
				smapoint = smapoint + 3;
			}
			else if (sma20 <= kaynak)
			{
				smapoint = smapoint -3;
			}
			var aopoint = ao > 0 ? 3 : ao < 0 ? -3 : 0;
			var mompoint = mom > 0 ? 3 : mom < 0 ? -3 : 0;
			var hmapoint = kaynak > hullMA ? 3 : -3;
			var rocpoints = roc > 0 ? 3 : -3;
			var ccipoints = cci > 0 ? 3 : -3;
			var dmipoints = di > 0 ? 3 : -3;
			EmaVCFast.Update(VxC, currentBar, barDateTime);
			EmaVCSlow.Update(VxC, currentBar, barDateTime);
			fastMA = EmaVCFast.CurrentValue / EmaVFash.CurrentValue;
			slowMA = EmaVCSlow.CurrentValue / EmaVSlow.CurrentValue;
			vwmacd = fastMA - slowMA;
			EmaVWMacd.Update(vwmacd, currentBar, barDateTime);
			var signal = EmaVWMacd.CurrentValue;
			hist = vwmacd - signal;
			histpoint = hist > 0  ? 3 : -3;
			decimal r1 = 0;
			decimal r2 = 0;
			decimal bull = 0;
			decimal bear = 0;
			if (prev < op)
			{
				r1 = Maximum((op - prev), (hi - lo));
				r2 = hi - lo;
			}
			else if (prev > op)
			{
				r1 = hi - lo;
				r2 = Maximum((prev - op), (hi - lo));
			}
			if (kapanis == op | (hi - kapanis == kapanis - lo | prev > op))
			{
				bull = Maximum((hi - op), (kapanis - lo));
			}
			else
			{
				bull = r1;
			}
			if (kapanis == op | (hi - kapanis == kapanis - lo | prev < op))
			{
				bear = Maximum((op - lo), (hi - kapanis));
			}
			else
			{
				bear = r2;
			}
			if (hi - kapanis > kapanis - lo | prev<op)
			{
				bull = Maximum((hi - prev), Maximum((kapanis - lo), (hi - op)));
			}
			else
			{
				bull = r1;
			}
			if (hi - kapanis > kapanis - lo)
			{
				bear = r2;
			}
			else if (prev > op)
			{
				bear = Maximum(op - lo, Maximum((prev - lo), (hi - kapanis)));
			}
			if (kapanis < op | prev < op)
			{
				bull = Maximum(Maximum((hi - op), (kapanis - lo)), (Maximum((hi - prev), (kapanis - lo))));
			}
			else
			{
				bull = r1;
			}
			if (kapanis < op | prev > op)
			{
				bear = Maximum(Maximum((prev - lo), (hi - kapanis)), (Maximum((op - lo), (hi - kapanis))));
			}
			else
			{
				bear = r2;
			}
			var trend = (bull - bear);
			smabb.Update(trend, currentBar, barDateTime);
			var smabbpuan = smabb.CurrentValue;
			var bbpoint = smabbpuan > 0 ? 3 : -3;
			var rsipoint = 0;
			if (rsi.CurrentValue >= 33 | rsi.CurrentValue <= 67)
			{
				rsipoint = 3;
			}
			else if (rsi.CurrentValue >= 75 | rsi.CurrentValue <= 25)
			{
				rsipoint = -3;
			}
			var totalpoints = bbpoint + rsipoint + aopoint + ccipoints + smapoint + dmipoints + histpoint + hmapoint + rocpoints + mompoint + smabbpuan;
			var piz = 1;
			smafinal.Update(totalpoints, currentBar, barDateTime);
			var p = EMAIndicator(smafinal, piz);
			var f = (Ref(smafinal, 1) + Ref(p, 1));
			emafinal.Update(f, currentBar, barDateTime);
			var x = EMAIndicator(emafinal, piz);
			if (CrossAbove(x, 0) && x>0)
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
				Debug("Alış Emri Gönderildi");
			}
			if (CrossBelow(x, 0))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
				Debug("Satış Emri Gönderildi");
			}
		}
	}
}