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