İ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");
}
}
}
}


VxC bu olacaktı doğru satırı silip geri eklemeyi unutmuşum ancak yine de hatayı almayı devam ediyorum kaynağı bu değil ya da başka bir sorun daha var sanırsam.
Hatanın kaynağı HullMA indikatörünün periyodunu sayısal değer girmek yerine HullMAPeriod kullanmam yaratıyormuş, tek tek deneyerek eledim sorunu ve buldum ancak şimdi de backtest yaptığımda kod çalışmasına rağmen 0 gözüküyor her şey hiç bir işlem olmuyor, bunun sorunu nerede olabilir acaba?