MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
1 beğenilme 0 beğenilmeme
142 kez görüntülendi

İyi günler, Matriks Prime için yazmış olduğum Ichimoku stratejisini MatriksIQ nun şartlarında yazmayı denedim, ancak 113 satırdaki hatanın ne olduğunu anlayamadığım için sonunu getiremiyorum. Yardımcı olursanız çok memnun olurum. İyi çalışmalar...

Matris Prime daki Al-Sat Stratejisi (Prime da bu kod problemsiz çalışmakta)!!!

TNK:=Tenkansen(9,26,OPT1,52,OPT2);
KIJ:=Kijunsen(9,26,OPT1,52,OPT2);
CHI:=ChikouSpan(9,26,OPT1,52,OPT2);
SSA:=SenkouSpanA(9,26,OPT1,52,OPT2);
SSB:=SenkouSpanB(9,26,OPT1,52,OPT2);

MAW:=MOV(C,3,E);

SIT2:=C>=REF(SSA,-OPT2) AND C>REF(SSB,-OPT2) AND REF(SSA,-OPT2)>REF(SSB,-OPT2);
SIT3:=CHI>=REF(C,-OPT1);
SIT4:=(C<=REF(SSA,-OPT2) AND C>REF(SSB,-OPT2)) AND (REF(SSA,-OPT2)>REF(SSB,-OPT2));
SIT5:=(C<=REF(SSB,-OPT2) AND C>REF(SSA,-OPT2)) AND (REF(SSB,-OPT2)>REF(SSA,-OPT2));

SIT:= SIT2 AND SIT3;
SITA:=SIT3 AND (SIT4 OR SIT5);

LB1:= Cross(C,MAW)  OR  Cross(C,KIJ);
LB2:=Cross(C,TNK)  OR  Cross(TNK,KIJ);
LB3:=Cross(C,SSA)  OR Cross(C,SSB);

LB:=LB1 OR LB2;
LBA:=LB1 OR LB2 OR LB3;

LONG:=(SIT AND LB) OR (SITA AND LBA);

LONG



TNK:=Tenkansen(9,26,OPT1,52,OPT2);
KIJ:=Kijunsen(9,26,OPT1,52,OPT2);
CHI:=ChikouSpan(9,26,OPT1,52,OPT2);
SSA:=SenkouSpanA(9,26,OPT1,52,OPT2);
SSB:=SenkouSpanB(9,26,OPT1,52,OPT2);

MAW:=MOV(C,3,E);


SIT2:=C>REF(SSA,-OPT2) AND C>REF(SSB,-OPT2) AND REF(SSA,-OPT2)>REF(SSB,-OPT2);
SIT3:=CHI<=REF(C,-OPT1);

SIT:=SIT2 AND SIT3;

LB1:= Cross(MAW,C)  OR  Cross(KIJ,C);
LB2:=Cross(TNK,C)  OR  Cross(KIJ,TNK);

LB:=LB1 OR LB2;

SHORT:=SIT AND LB;

SHORT

 

Bu da yukarıdaki kodun MatriksIQ versiyonu ama 112. satırda hata veriyor. (public override void OnDataUpdate kısmı)

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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
{
	[IndicatorInformationAttribute("ninja", IndicatorDrawingArea.NewWindow)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformationAttribute(new []
		{
			"ninja(0)"
		})]
	public class LAST_NINJA_ICHI : MatriksAlgo
	{
		// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
		// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.

		[SymbolParameter("GARAN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Day)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(10)]
		public decimal BuyOrderQuantity;//Alım miktarı için kullanacağımız parametre

		[Parameter(10)]
		public decimal SellOrderQuantity;//Satım miktarı için kullanacağımız parametre

		[Parameter(26)]
		public int Chiko;

		[Parameter(26)]
		public int Cloud;

		[Parameter(3)]
		public int Mov;

		MOV MAW;

		MOV mov1;

		MOV mov2;

		MOV mov3;

		MOV mov4;

		MOV mov5;


		IchiMoku ichiMoku;

		MOV movC;


		/// <summary>
		/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
		/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. 
		/// </summary>
		public override void OnInit()
		{
			movC = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, 1, MovMethod.Simple);

			MAW = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, Mov, MovMethod.Simple);
			
			ichiMoku = IchiMokuIndicator(Symbol, SymbolPeriod, 9, 26, Chiko, 52, Cloud);

			mov1 = new MOV(1, MovMethod.Simple);

			mov2 = new MOV(1, MovMethod.Simple);

			mov3 = new MOV(1, MovMethod.Simple);

			mov4 = new MOV(1, MovMethod.Simple);

			mov5 = new MOV(1, MovMethod.Simple);

			AddSymbol(Symbol, SymbolPeriod);

			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız 
			//veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			WorkWithPermanentSignal(true);

			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(true);
		}



		/// <summary>
		/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
		/// 
		

		public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime, BarDataEventArgs barData)
		{
			var bardata = GetBarData();
						
			decimal ten = ichiMoku.TenksanSenValue;
			decimal kij = ichiMoku.KijunSenValue;
			decimal chi = ichiMoku.ChikouSpanValue;
			decimal sa = ichiMoku.SenkouSpanAValue;
			decimal sb = ichiMoku.SenkouSpanBValue;

			mov1.Update(ten, currentBar, barDateTime);
			mov2.Update(kij, currentBar, barDateTime);
			mov3.Update(chi, currentBar, barDateTime);
			mov4.Update(sa, currentBar, barDateTime);
			mov5.Update(sb, currentBar, barDateTime);
			
			
			if ((movC >= Ref(mov4, - Cloud) && movC>Ref(mov5, - Cloud) && Ref(mov4, - Cloud) >Ref(mov5, - Cloud) && mov3 >= Ref(movC, - Chiko)) && (CrossAbove(movC, MAW) || CrossAbove(movC, mov2) || CrossAbove(movC, mov1) || CrossAbove(mov1, mov2)))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Long Position Opened");
			}

			if (((movC <= Ref(mov4, - Cloud) && movC>Ref(mov5, - Cloud) && Ref(mov4, - Cloud) >Ref(mov5, - Cloud)) || (movC <= Ref(mov5, - Cloud) && movC>Ref(mov4, - Cloud) && Ref(mov5, - Cloud) >Ref(mov4, - Cloud)) && mov3 >= Ref(movC, - Chiko)) && (CrossAbove(movC, MAW) || CrossAbove(movC, mov2) || CrossAbove(movC, mov1) || CrossAbove(mov1, mov2) || CrossAbove(movC, mov4) || CrossAbove(movC, mov5)))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Long Position Opened");
			}

			if ((movC>Ref(mov4, - Cloud) && movC>Ref(mov5, -Cloud) && Ref(mov4, -Cloud) >Ref(mov5, - Cloud) && mov3 <= Ref(movC, - Chiko)) && (CrossBelow(movC, MAW) || CrossBelow(movC, mov2) || CrossBelow(movC, mov1) || CrossBelow(mov1, mov2)))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Long Position Closed");
			}	

			
		}
	}
}

İkinci bir sorum da "Long Position Opened" Debug 'lı satırlar ile ilgili (Bunları or seçeneği ile birleştirmek için bir kısayol önerebilir misiniz? Yani tek if emri ile "Long Position Opened" olması için bu satırları OR (||) ile birleştirmeye kalkınca çok uzun oluyor dolayısıyla komut karmakarışık bir hal alıyor. Yazarken hata yapma riski artıyor. Son olarak ileride gerekli komutları yazıp bu strateji ile short yöndede pozisyon açmak istersem eğer, (ancak Short Pozisyon Aç-Kapat Stratejileri Programın Hazır Stratejilerindeki gibi aynı komutları içermeyecek (Short Position Open = Long Position Close, Short Position Close=Long Position Open şeklinde olmayacak.), böyle bir durumda "SendOrderSequential()" olan emirlerin sırayla gönderilmesi satırı (Long Pozisyon Aç, Long Pozisyon Kapat, Short Pozisyon Aç, Short Pozisyon Kapat) "true" mu "false" olarak mı ayarlanmalıdır? İyi çalışmalar dilerim...

 

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

Bu soruya cevap vermek için lütfen giriş yapınız veya kayıt olunuz.

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.



1,917 soru
1,819 cevap
1,766 yorum
1,313 kullanıcı