0 beğenilme 0 beğenilmeme
879 kez görüntülendi

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

			}

		}
	}
}


 

Algoritmik Trading kategorisinde (12 puan) tarafından | 879 kez görüntülendi

1 cevap

2 beğenilme 0 beğenilmeme
Açıkçası indicator ile strateji harmanlamışsın. Bu şekilde sağlıklı bir çalışacağını sanmıyorum. İndicator'ünü oluşturduktan sonra o indikatörü kullanan bir  strateji oluşturman daha doğru bir yöntem.

Hataya gelince

EmaVCFast.Update(VxC, currentBar, barDateTime);

EmaVCSlow.Update(VxC, currentBar, barDateTime)

fastMA = EmaVCFast.CurrentValue / EmaVFash.CurrentValue;

slowMA = EmaVCSlow.CurrentValue / EmaVSlow.CurrentValue;

 

bu satırlarda Vxc hiç bir yerde hesaplamamışsın. Hep 0 veriyorsun. Doğal olarak ortalamalar 0 oluyor. 0/0 işlemi yapıyorsun. Vxc hesaplamayı unutmuşsun sanırım
(77 puan) tarafından
0 0
VxC = Instrument.SymbolBarData.Volume[currentBar] * Instrument.SymbolBarData.Close[currentBar];

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?

0 0
if (currentBar < KullanılanEnUzunPeryot)

{

return ;

}

 

OnDataUpdate'e ilk olarak bunu eklemelisin. Böylece var prev = Value[0][currentBar -1]; gibi hatalardan kurtulursun. Burada currentBar=0 olduğunda diziden -1 getirmeye çalışırsın ki bu hata verecektir.

Örneğin ema peryot 20. Fakat elinde o 20 tane değer olmadan ema hesaplamaya çalışmış oluyorsun. Burada hata alman kaçınılmaz. Bu yüzden OnDataUpdate'i  if (currentBar < KullanılanEnUzunPeryot) ile başlatıp return ederek fonksiyondan çıkmak doğru yöntem olacaktır
0 0
0 'a bölme hatasını aynı satırda ilk işlemde alıyorsun büyük ihtimalle. Zaten klodunda başka bir yerde bölme işlemi göremedim.

fastMA = EmaVCFast.CurrentValue / EmaVFash.CurrentValue;

slowMA = EmaVCSlow.CurrentValue / EmaVSlow.CurrentValue;

Bu satırlarda EmaVFash.CurrentValue; ve EmaVSlow.CurrentValue; değerleri 0 ise işlem yaptırmamalısın.
Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



8,636 soru
8,590 cevap
4,821 yorum
19,790 kullanıcı