0 beğenilme 0 beğenilmeme
1,462 kez görüntülendi
al

if(MOV(C,opt1,VAR)>OTT(C,opt1,8),
MOV(C,opt1,VAR)>OTT(C,opt1,opt2) AND
STOSK(opt3,opt4,111,VAR)>STOSD(opt3,opt4,111,VAR) AND
H>REF(HHV(H,20),-1),
MOV(C,opt1,VAR)>OTT(C,opt1,opt2) AND
STOSK(opt3,opt4,111,VAR)>STOSD(opt3,opt4,111,VAR) AND
H>REF(HHV(H,20),-1)) AND
((HOUR()=10 AND MINUTE()>=03) OR HOUR()>=11) AND ((HOUR()=17 AND MINUTE()<=58) OR HOUR ()<=16)

 

sat

if(MOV(C,opt1,VAR)>OTT(C,opt1,8),
MOV(C,opt1,VAR)<OTT(C,opt1,opt2) AND
STOSK(opt3,opt4,111,VAR)<STOSD(opt3,opt4,111,VAR) AND
H>REF(HHV(H,20),-1),
MOV(C,opt1,VAR)<OTT(C,opt1,opt2) AND
STOSK(opt3,opt4,111,VAR)<STOSD(opt3,opt4,111,VAR) AND
H>REF(HHV(H,20),-1)) AND
((HOUR()=10 AND MINUTE()>=03) OR HOUR()>=11) AND ((HOUR()=17 AND MINUTE()<=58) OR HOUR ()<=16)
Algoritmik Trading kategorisinde (14 puan) tarafından | 1,462 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

Merhabalar,

Dilerseniz aşağıdaki sistemi inceleyebilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;

namespace Matriks.Lean.Algotrader
{
	public class SablonAnılOzeksiV1 : MatriksAlgo
	{
		[SymbolParameter("FGARAN")]
		public string Symbol;

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

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(false)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

		[Parameter(yon.Farketmez)]
		public yon HangiIslemleBaslasin;

		[Parameter(3)]
			public int KaldiracOrani;

		[Parameter(20)]
			public int Opt1;

		[Parameter(7.3)]
			public decimal Opt5;

		[Parameter(0.4)]
			public decimal Opt2;

		[Parameter(3.4)]
			public decimal Opt6;

		[Parameter(500)]
			public int opt3;

		[Parameter(111)]
			public int StochasticslowPeriodD1;

		[Parameter(300)]
			public int opt4;

		[Parameter(MovMethod.VAR)]
			public MovMethod StochasticslowMovMethod1;

		[Parameter(MovMethod.VAR)]
			public MovMethod OttMovMethod1;

		[Parameter(true)]
			public bool OttSupportLine1;

		[Parameter(20)]
			public int opt7;

		[Parameter(10)]
			public int opt8;

		[Parameter(10)]
			public int opt9;

		[Parameter(10)]
			public int opt10;

		OTT ott;
		OTT ott2;
		OTT ott3;

		StochasticSlow stochasticSlow;

		HighestHigh HHV;
		HighestHigh HHV1;
		LowestLow LLV;
		LowestLow LLV1;




		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var barData1 = GetBarData(Symbol, SymbolPeriod);

			var h = GetSelectedValueFromBarData(barData1, OHLCType.High);
			var l = GetSelectedValueFromBarData(barData1, OHLCType.Low);

			if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
			{
				if (ott2.Value[1][ott2.CurrentIndex] > ott2.Value[0][ott2.CurrentIndex]
					&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] > stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
					&& h>HHV.Value[0][HHV.CurrentIndex -1])
				{
					FX_Alis(Symbol, BuyOrderQuantity);
				}
			}
			else
			{
				if (ott3.Value[1][ott3.CurrentIndex] > ott3.Value[0][ott3.CurrentIndex]
					&& ott2.Value[1][ott2.CurrentIndex] > ott2.Value[0][ott2.CurrentIndex]
					&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] > stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
					&& h>HHV1.Value[0][HHV1.CurrentIndex -1])
				{
					FX_Alis(Symbol, BuyOrderQuantity);
				}
			}

			if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
			{
				if (ott2.Value[1][ott2.CurrentIndex] < ott2.Value[0][ott2.CurrentIndex]
					&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] <stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
					&& l<LLV.Value[0][LLV.CurrentIndex -1])
				{
					FX_Satis(Symbol, SellOrderQuantity);
				}
			}

			else
			{
				if (ott2.Value[1][ott2.CurrentIndex] < ott2.Value[0][ott2.CurrentIndex]
					&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] < stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
					&& l<LLV1.Value[0][LLV1.CurrentIndex -1])
				{
					FX_Satis(Symbol, SellOrderQuantity);
				}
			}
		}



		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			ott = OTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Opt1, Opt5, OttMovMethod1, OttSupportLine1);
			ott2 = OTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Opt1, Opt2, OttMovMethod1, OttSupportLine1);
			stochasticSlow = StochasticSlowIndicator(Symbol, SymbolPeriod, OHLCType.Close, opt3, StochasticslowPeriodD1, opt4, StochasticslowMovMethod1);
			ott3 = OTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Opt1, Opt6, OttMovMethod1, OttSupportLine1);

			HHV = HighestHighIndicator(Symbol, SymbolPeriod, opt7);
			HHV1 = HighestHighIndicator(Symbol, SymbolPeriod, opt8);
			LLV = LowestLowIndicator(Symbol, SymbolPeriod, opt9);
			LLV1 = LowestLowIndicator(Symbol, SymbolPeriod, opt10);

			// Gerekli açığa satış
			WorkWithPermanentSignal(true);

			if (HangiIslemleBaslasin == yon.Alis)
			{
				SendOrderSequential(true, Side.Buy);
			}else if (HangiIslemleBaslasin == yon.Satis)
			{
				SendOrderSequential(true, Side.Sell);
			}else
			{
				SendOrderSequential(true, Side.All);
			}

			SendOrderSequentialForShort(true, Side.All);
			// #Gerekli açığa satış

			// kaldıraç oranı
			SetLeverage(Symbol, KaldiracOrani);
			// kaldıraç tipi – true isolated, false cross
			SetLeverageType(Symbol, false);
			// Gerekli

			// Gerekli - Timestamp
			SetTimerInterval(1);
			// #Gerekli - Timestamp

		}

		// Gerekli açığa satış
		public enum yon
		{
			Alis, Satis, Farketmez
		}

		public void FX_Alis(string sembol, decimal quantity)
		{
			decimal _quantity = 0;

			if (LastOrderSide.Obj != Side.Buy)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
					_quantity = quantity;
				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity;
					}else
					{
						SendMarketOrder(Symbol, quantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity * 2;
					}
				}

				Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSide.Obj = Side.Buy;
				LastOrderSideForShort.Obj = Side.Buy;
			}
		}

		public void FX_Satis(string sembol, decimal quantity)
		{
			decimal _quantity = 0;

			if (LastOrderSide.Obj != Side.Sell)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
					_quantity = quantity;
				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity;

					}else
					{
						SendMarketOrder(Symbol, quantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity * 2;
					}
				}

				Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSide.Obj = Side.Sell;
				LastOrderSideForShort.Obj = Side.Sell;
			}
		}


		public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
		{
			if (sOrder.EnableOrderSending)
			{
				LastOrderSide.Obj = Side.All;
				Debug("Sentetik emir tetiklendi");
			}
		}
		// #Gerekli açığa satış

		// Gerekli - Timestamp
		public class OrderListTimestamp
		{
			public string ID;
			public string Sembol;
			public decimal Adet;
			public decimal Fiyat;
			public OrdType EmirTipi;
			public OrderSide orderSide;
			public string EmirYonu;
			public DateTime TetiklenmeZamani;
			public int Sayac;
			public bool AktifMI;
		}

		Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();

		[Parameter(3)]
		public int AyniEmirKacSeferGonderilsin;

		[Parameter(10)]
		public int KacSaniyeSonraTekrarGonderilsin;

		string orderIDTimestamp = string.Empty;
		// #Gerekli - Timestamp

		public override void OnTimer()
		{
			// Gerekli - Timestamp
			var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);

			if (tutt.Count() >0)
			{
				foreach (var deger in tutt)
				{
					LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;

					if (deger.Value.EmirTipi.Obj == OrdType.Limit)
					{
						orderIDTimestamp = SendLimitOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
						Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
					}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
					{
						orderIDTimestamp = SendMarketOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide);
						Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
					}

					deger.Value.ID = orderIDTimestamp;
					deger.Value.AktifMI = false;
					timestampDict[orderIDTimestamp] = deger.Value;
					timestampDict.Remove(deger.Key);

				}
			}
			// #Gerekli - Timestamp
		}

		public override void OnOrderUpdate(IOrder order)
		{
			// Gerekli - Timestamp
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				if (timestampDict.ContainsKey(order.CliOrdID))
				{
					timestampDict.Remove(order.CliOrdID);
					Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
				}
			}

			if (order.OrdStatus.Obj == OrdStatus.Rejected)
			{
				if (!timestampDict.ContainsKey(order.CliOrdID))
				{
					OrderListTimestamp orderList = new OrderListTimestamp();
					orderList.ID = order.CliOrdID;
					orderList.Sembol = order.Symbol;
					orderList.Adet = order.OrderQty;
					orderList.Fiyat = order.Price;
					orderList.EmirTipi = order.OrdType;
					orderList.TetiklenmeZamani = DateTime.Now;
					orderList.Sayac = 0;
					orderList.AktifMI = false;

					if (order.Side.Obj == Side.Buy)
					{
						orderList.orderSide = OrderSide.Buy;
						orderList.EmirYonu = "Alış";
					}else
					{
						orderList.orderSide = OrderSide.Sell;
						orderList.EmirYonu = "Satış";
					}

					timestampDict[order.CliOrdID] = orderList;
				}

				if (order.Text.Contains("Timestamp"))
				{
					if (timestampDict.ContainsKey(order.CliOrdID))
					{
						if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
						{
							timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
							timestampDict[order.CliOrdID].Sayac++;
							timestampDict[order.CliOrdID].AktifMI = true;

							Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");
						}else
						{
							timestampDict.Remove(order.CliOrdID);
							Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");
						}
					}
				}
			}
			// #Gerekli - Timestamp			
		}
	}
}

İyi çalışmalar.

(11,059 puan) tarafından
0 0
Merhaba,

Soruda yer alan işlem zaman sınırlaması sanırım kod içinde yer almamış. Bunu da koda ekleyebilir misiniz?
0 0
Ayyyy, teşekkürler. Nedense bunu sormak aklıma gelmemiş. IQ için kutsal kase olmuş bu :)

Hemen deniyorum. Çok teşekkürler
0 0
opt4 sonrası olanlar nereyi temsil ediyor acaba? örn opt5, formuldeki 8 e denk geliyor tahminimç
kod derleme başarısız uyarısı alıyorum
1 0
Merhaba,

Burada if kurgusu eksik olabilir mi? Formülde 4 bölge bulunmakta ve her bölgedeki opt'ler testler sonucunda farklı çıkabilmektedir. Formülü MatriksIQ da çalıştırdığımızda tüm bölgeler aynı opt ile çalışmaktadır. Sadece HHV LLV için farklı. Dolayısı ile buradaki formül ile sadece ham testi yapabiliriz. Bölgelerin  ayrı ayrı testlerini yapamayız ve her bölge için bulacağımız farklı değerlerde stratejiyi çalıştıramayız.

Bu formülü algoritma sihirbazı ile kurguladığımda  ''if'' kurgusunu yapamadım. Buradaki if kurgusunu algoritma sihirbazı ile yapabilmenin bir yolu var mıdır.
8,639 soru
8,593 cevap
4,826 yorum
19,844 kullanıcı