12.07.2023
4
0
0
0
Anıl Özekşi'nin OTT-Stochastic-Higestgigh indikatörü ile oluşturmuş olduğu veri terminali sisteminin IQ'ya uyarlanmış halidir.
Sadece LONG işlem yapmaktadır.
Strateji BIST - VIOP - BINANCE SPOT için uygundur.
ZamanKullanilsinMI parametresi EVET seçildiğinde zamana göre çalışır. Hayır seçildiğinde zamandan bağımsız olrak çalışır.
MAJOR trend parametresi bir kez girilmektedir.

𝕿𝖗𝖆𝖓𝖘𝖑𝖆𝖙𝖊𝖉 𝓑𝔂 ⒶⓀⒾⓃ ℍü𝓃𝑒𝓇𝓁𝒾
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
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;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;

namespace Matriks.Lean.Algotrader
{
	public class AnilOzeksi1 : MatriksAlgo
	{
		/*
		 Anıl Özekşi'nin OTT-Stochastic-Higestgigh indikatörü ile oluşturmuş olduğu veri terminali sisteminin IQ'ya uyarlanmış halidir.
		 Sadece LONG işlem yapmaktadır.
		 Strateji  BIST - VIOP - BINANCE SPOT için uygundur.
		 ZamanKullanilsinMI parametresi EVET seçildiğinde zamana göre çalışır. Hayır seçildiğinde zamandan bağımsız olrak çalışır.
		 MAJOR trend parametresi bir kez girilmektedir.
		
		_____________________________/  AL  \_______________
		if(MOV(C,30,VAR)>OTT(C,30,8),
		MOV(C,40,VAR)>OTT(C,40,0.6) AND 
		STOSK(500,200,111,VAR)>STOSD(500,200,111,VAR) AND 
		H>REF(HHV(H,OPT1),-1),
		MOV(C,30,VAR)>OTT(C,30,0.9) AND 
		STOSK(500,300,111,VAR)>STOSD(500,300,111,VAR) AND 
		H>REF(HHV(H,OPT2),-1)) 
		_____________________________/  SAT  \__________________
		if(MOV(C,30,VAR)>OTT(C,30,8),
		MOV(C,20,VAR)<OTT(C,20,1) AND  
		STOSK(500,200,111,VAR)<STOSD(500,200,111,VAR) AND  
		L<REF(LLV(L,OPT3),-1),
		MOV(C,30,VAR)<OTT(C,30,0.9) AND 
		STOSK(500,300,111,VAR)<STOSD(500,300,111,VAR) AND  
		L<REF(LLV(L,OPT4),-1))
	 																		Parametre Girişleri 4 bölge olarak girilmektedir.	*/
		[SymbolParameter("THYAO")]
			public string Symbol1;
		[Parameter(SymbolPeriod.Min)]
			public SymbolPeriod SymbolPeriod1;

		//_______________________________________/ MAJOR TREND \_______________________
		//MOV(C,30,VAR)>OTT(C,30,7)
		[Parameter(30)]
			public int MajorTrend_period;
		[Parameter(8)]
			public decimal MajorTrend_OttOpt;
		//_______________________________________/ 1. bölge \_______________________

		// MOV(C,40,VAR)>OTT(C,40,0.6)
		[Parameter(40)]
			public int Bolge1_OttPeriod;
		[Parameter(0.6)]
			public decimal Bolge1_OttOpt;

		// STOSK(500,200,111,VAR)>STOSD(500,200,111,VAR) 

		[Parameter(500)]
			public int Bolge1_StochasticslowPeriodK;
		[Parameter(200)]
			public int Bolge1_StochasticslowPeriodSlowK;
		[Parameter(111)]
			public int Bolge1_StochasticslowPeriodD;
		// H>REF(HHV(H,20),-1),

		[Parameter(20)]
			public int Bolge1_HighesthighPeriod;
		//_______________________________________/ 2. bölge \_______________________
		//  MOV(C,30,VAR)>OTT(C,30,0.9) 

		[Parameter(30)]
			public int Bolge2_OttPeriod;
		[Parameter(0.9)]
			public decimal Bolge2_OttOpt;

		// STOSK(500,300,111,VAR)>STOSD(500,300,111,VAR) 

		[Parameter(500)]
			public int Bolge2_StochasticslowPeriodK;
		[Parameter(300)]
			public int Bolge2_StochasticslowPeriodSlowK;
		[Parameter(111)]
			public int Bolge2_StochasticslowPeriodD;

		// H>REF(HHV(H,22),-1)) 

		[Parameter(22)]
			public int Bolge2_HighesthighPeriod;
		//_______________________________________/ 3. bölge \_______________________
		//MOV(C,20,VAR)<OTT(C,20,1)
		[Parameter(20)]
			public int Bolge3_OttPeriod;
		[Parameter(1)]
			public decimal Bolge3_OttOpt;
		//STOSK(500,200,111,VAR)<STOSD(500,200,111,VAR)
		[Parameter(500)]
			public int Bolge3_StochasticslowPeriodK;
		[Parameter(200)]
			public int Bolge3_StochasticslowPeriodSlowK;
		[Parameter(111)]
			public int Bolge3_StochasticslowPeriodD;
		// L<REF(LLV(L,23),-1)
		[Parameter(23)]
			public int Bolge3_LowestlowPeriod;
		//_______________________________________/ 4. bölge \_______________________
		// MOV(C,30,VAR)<OTT(C,30,0.9) 
		[Parameter(30)]
			public int Bolge4_OttPeriod;
		[Parameter(0.9)]
			public decimal Bolge4_OttOpt;
		// STOSK(500,300,111,VAR)<STOSD(500,300,111,VAR)
		[Parameter(500)]
			public int Bolge4_StochasticslowPeriodK;
		[Parameter(300)]
			public int Bolge4_StochasticslowPeriodSlowK;
		[Parameter(111)]
			public int Bolge4_StochasticslowPeriodD;
		//L<REF(LLV(L,24),-1)
		[Parameter(24)]
			public int Bolge4_LowestlowPeriod;

		[Parameter(1)]
			public decimal OrderQuantity1;
		// Gerekli zaman aralığı
		public enum ZamanKullanilsinMI
		{
			EVET,
			HAYIR

		}
		[Parameter(ZamanKullanilsinMI.HAYIR)]
		public ZamanKullanilsinMI Zaman;
		public bool ZamanKontrol;
		[Parameter("10:03:00")]
		public string Baslangic;
		[Parameter("17:58:00")]
		public string Bitis;
		public bool FX_ZamanindaMI(DateTime zaman)
		{
			var bas = TimeSpan.Parse(Baslangic);
			var bit = TimeSpan.Parse(Bitis);
			return (zaman.TimeOfDay >= bas && zaman.TimeOfDay <= bit);
		}
		// # Gerekli zaman aralığı    
		OTT ott;
		OTT ott2;
		StochasticSlow stochasticSlow;
		HighestHigh highestHigh;
		OTT ott3;
		StochasticSlow stochasticSlow2;
		HighestHigh highestHigh2;
		OTT ott4;
		StochasticSlow stochasticSlow3;
		LowestLow lowestLow;
		OTT ott5;
		StochasticSlow stochasticSlow4;
		LowestLow lowestLow2;
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var ZamanKontrol = Zaman == ZamanKullanilsinMI.EVET ? FX_ZamanindaMI(barData.BarData.Dtime) == true? true:false: true;
			var barData1 = GetBarData(Symbol1, SymbolPeriod1);
			var H = GetSelectedValueFromBarData(barData1, OHLCType.High);
			var L = GetSelectedValueFromBarData(barData1, OHLCType.Low);
			//AL
			if (ZamanKontrol)
			{
				if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
				{
					if (LastOrderSide.Obj != Side.Buy
				&& ott2.Value[1][ott2.CurrentIndex] > ott2.Value[0][ott2.CurrentIndex]
				&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] > stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
				&& H >highestHigh.Value[0][highestHigh.CurrentIndex - 1])
					{
						SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false); 
					}
				}else if (LastOrderSide.Obj != Side.Buy
				&& ott3.Value[1][ott3.CurrentIndex] > ott3.Value[0][ott3.CurrentIndex]
				&& stochasticSlow2.Value[0][stochasticSlow2.CurrentIndex] > stochasticSlow2.Value[1][stochasticSlow2.CurrentIndex]
				&& H >highestHigh2.Value[0][highestHigh2.CurrentIndex - 1])
				{
					SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false); 
				}
				//SAT
				if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
				{
					if (LastOrderSide.Obj != Side.Sell
				&& ott4.Value[1][ott4.CurrentIndex] < ott4.Value[0][ott4.CurrentIndex]
				&& stochasticSlow3.Value[0][stochasticSlow3.CurrentIndex] < stochasticSlow3.Value[1][stochasticSlow3.CurrentIndex]
				&& L < lowestLow.Value[0][lowestLow.CurrentIndex - 1])
					{
						SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Sell, includeAfterSession:false); 
					}
				}else if (LastOrderSide.Obj != Side.Sell
				&& ott5.Value[1][ott5.CurrentIndex] < ott5.Value[0][ott5.CurrentIndex]
				&& stochasticSlow4.Value[0][stochasticSlow4.CurrentIndex] < stochasticSlow4.Value[1][stochasticSlow4.CurrentIndex]
				&& L < lowestLow2.Value[0][lowestLow2.CurrentIndex - 1])
				{
					SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Sell, includeAfterSession:false); 
				}

			}
		}
		public override void OnInit()
		{
			ott = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MajorTrend_period, MajorTrend_OttOpt, MovMethod.VAR, true);
			ott2 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge1_OttPeriod, Bolge1_OttOpt, MovMethod.VAR, true);
			stochasticSlow = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge1_StochasticslowPeriodK, Bolge1_StochasticslowPeriodD, Bolge1_StochasticslowPeriodSlowK, MovMethod.VAR);
			highestHigh = HighestHighIndicator(Symbol1, SymbolPeriod1, Bolge1_HighesthighPeriod);
			ott3 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge2_OttPeriod, Bolge2_OttOpt, MovMethod.VAR, true);
			stochasticSlow2 = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge2_StochasticslowPeriodK, Bolge2_StochasticslowPeriodD, Bolge2_StochasticslowPeriodSlowK, MovMethod.VAR);
			highestHigh2 = HighestHighIndicator(Symbol1, SymbolPeriod1, Bolge2_HighesthighPeriod);
			ott4 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge3_OttPeriod, Bolge3_OttOpt, MovMethod.VAR, true);
			stochasticSlow3 = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge3_StochasticslowPeriodK, Bolge3_StochasticslowPeriodD, Bolge3_StochasticslowPeriodSlowK, MovMethod.VAR);
			lowestLow = LowestLowIndicator(Symbol1, SymbolPeriod1, Bolge3_LowestlowPeriod);
			ott5 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge4_OttPeriod, Bolge4_OttOpt, MovMethod.VAR, true);
			stochasticSlow4 = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge4_StochasticslowPeriodK, Bolge4_StochasticslowPeriodD, Bolge4_StochasticslowPeriodSlowK, MovMethod.VAR);
			lowestLow2 = LowestLowIndicator(Symbol1, SymbolPeriod1, Bolge4_LowestlowPeriod);

			SendOrderSequential(true, Side.All);
			WorkWithPermanentSignal(true);
			// ------------ Timestamp OnInit ------------
			SetTimerInterval(1);
			// ------------ Timestamp OnInit ------------
		}

		/// <summary>
		/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
		/// </summary>
		public override void OnInitCompleted()
		{

		}



		/// <summary>
		/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="newsId">Gelen haberin id'si</param>
		/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
		public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
		{

		}

		// ------------ Timestamp Tanımlar ------------
		int KacSaniyeSonraTekrarGonderilsin = 10;
		int AyniEmirKacSeferGonderilsin = 3;
		Dictionary<string, IOrder> RejectedOrderList = new Dictionary<string, IOrder>();
		// ------------ Timestamp Tanımlar ------------

		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				// ------------ Timestamp OnOrderUpdate Filled ------------
				var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);

				if (sorgu.Key != null)
				{
					Debug("İptal olan  emir gerçekleşti. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + sorgu.Value.Text);
				}
				// ------------ Timestamp OnOrderUpdate Filled ------------
			}

			if (order.OrdStatus.Obj == OrdStatus.Rejected)
			{
				// ------------ Timestamp OnOrderUpdate Rejected ------------
				var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);

				if (sorgu.Key == null)
				{
					order.BitmexPostOnly = true;
					order.MinPosition = AyniEmirKacSeferGonderilsin;
					order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);

					RejectedOrderList[order.CliOrdID] = order;

					Debug("Emir iptal oldu. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + order.Text);
				}else
				{
					sorgu.Value.BitmexPostOnly = true;
				}
				// ------------ Timestamp OnOrderUpdate Rejected ------------
			}
		}

		public override void OnTimer()
		{
			// ------------ Timestamp OnTimer ------------
			var sorgu = RejectedOrderList.Where(x => x.Value.BitmexPostOnly == true && DateTime.Now >= x.Value.ExpireDate && x.Value.MinPosition>0);
			var oncekiYon = LastOrderSide.Obj;

			foreach (var deger in sorgu)
			{
				var order = deger.Value;
				LastOrderSide.Obj = Side.All;
				var orderID = SendOrder(order.Symbol, order.OrderQty, order.Price, order.Side, order.OrdType, order.TimeInForce, order.TransactionType, order.ChartIcon);
				order.MinPosition--;
				order.BitmexPostOnly = false;
				order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
				order.CliOrdID = orderID;
				Debug("İptal olan emir tekrar gönderildi. Detay -> CliOrdID: " + order.CliOrdID + " Yon: " + order.Side.Obj.ToString() + " kalan: " + order.MinPosition);
			}

			LastOrderSide.Obj = oncekiYon;
			// ------------ Timestamp OnTimer ------------
		}

		/// <summary>
		/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
		/// </summary>
		public override void OnStopped()
		{
		}
	}
}

4 Yorum

Merhaba, Bu sadeleştirilmiş ve katsayılandırılmış sisteme, Fırsatçı Trend ve mümkünse opsiyonel olarak dahil ve hariç bırakılabilir ROTT ekleme imkanınız varmıdır. Teşekkürler

  • 29.10.2023 11:54
  • 0

Merhaba, Anıl Hoca tarafından geliştirilen standart sistemler üzerinde değişiklik yapılmamaktadır.

  • 31.10.2023 11:20
  • 0

Merhaba Optimizasyon için nasıl bir yardımınız olur? hangi parametleri hangi aralıklarda taratıp optimize edebiliriz?

  • 27.12.2023 23:24
  • 0

Merhaba, Sistem ve Optimizasyon ile ilgili bilgileri anıl hocanın eğitimlerinde bulabilirsiniz.

  • 28.12.2023 11:32
  • 0