0 beğenilme 0 beğenilmeme
442 kez görüntülendi
Selamlar,

aşağıda kodları verilmiş olan SOTT stratejisine açığa satış özelliğide ekleyebilirmisiniz. bu özellik backtestte açılıp kapatılabilmeli

 

teşekkürler

 

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;

using Matriks.AI;

using Matriks.AI.AiParameters;

using Matriks.AI.Data;

using Matriks.Trader.Core.TraderModels;

 

namespace Matriks.Lean.Algotrader

{

public class SOTT_Strategy : 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(500)]

public int PeriodK;

 

[Parameter(200)]

public int PeriodSlowK;

 

[Parameter(MovMethod.VAR)]

public MovMethod StosKMethod;

 

[Parameter(2)]

public int OttPeriod;

 

[Parameter(0.5)]

public decimal OttOpt;

 

[Parameter(MovMethod.VAR)]

public MovMethod OttMethod;

 

[Parameter(1)]

public decimal BuyOrderQuantity;

 

[Parameter(1)]

public decimal SellOrderQuantity;

 

MatriksIndicator SOTT_IQ;

 

public override void OnInit()

{

SOTT_IQ = new SOTT_IQ();

 

SOTT_IQ.SetIndicatorParameters("PeriodK", PeriodK);

SOTT_IQ.SetIndicatorParameters("PeriodSlowK", PeriodSlowK);

SOTT_IQ.SetIndicatorParameters("StosKMethod", StosKMethod);

SOTT_IQ.SetIndicatorParameters("OttPeriod", OttPeriod);

SOTT_IQ.SetIndicatorParameters("OttOpt", OttOpt);

SOTT_IQ.SetIndicatorParameters("OttMethod", OttMethod);

RegisterUserIndicator(SOTT_IQ, Symbol, SymbolPeriod, OHLCType.Close, 5);

 

 

 

SendOrderSequential(true, Side.Buy);

//WorkWithPermanentSignal(true);

 

//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.

// SetTimerInterval(3600);

 

//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsSymbol(Symbol);

 

//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsKeyword("KAP");

}

 

/// <summary>

/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir

/// </summary>

public override void OnInitComplated()

{

 

}

 

/// <summary>

/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.

/// </summary>

public override void OnTimer()

{

 

}

 

/// <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)

{

 

}

 

/// <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(BarDataEventArgs barData)

{

if (CrossAbove(SOTT_IQ, SOTT_IQ, 0, 1))

{

SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);

}

if (CrossBelow(SOTT_IQ, SOTT_IQ, 0, 1))

{

SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);

}

 

}

 

/// <summary>

/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.

/// </summary>

/// <param name="barData">Emrin son durumu</param>

public override void OnOrderUpdate(IOrder order)

{

}

 

}

}
Algoritmik Trading kategorisinde (200 puan) tarafından | 442 kez görüntülendi

1 cevap

2 beğenilme 0 beğenilmeme
En İyi Cevap

Merhabalar,

Strateji istediğiniz şekilde revize edilmiştir.

Lütfen inceleyiniz.

***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***

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;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;

namespace Matriks.Lean.Algotrader
{
	public class SOTT_Strategy : 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(500)]
			public int PeriodK;

		[Parameter(200)]
			public int PeriodSlowK;

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

		[Parameter(2)]
			public int OttPeriod;

		[Parameter(0.5)]
			public decimal OttOpt;

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

		[Parameter(1)]
			public decimal BuyOrderQuantity;

		[Parameter(1)]
			public decimal SellOrderQuantity;

		MatriksIndicator SOTT_IQ;

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			SOTT_IQ = new SOTT_IQ();

			SOTT_IQ.SetIndicatorParameters("PeriodK", PeriodK);
			SOTT_IQ.SetIndicatorParameters("PeriodSlowK", PeriodSlowK);
			SOTT_IQ.SetIndicatorParameters("StosKMethod", StosKMethod);
			SOTT_IQ.SetIndicatorParameters("OttPeriod", OttPeriod);
			SOTT_IQ.SetIndicatorParameters("OttOpt", OttOpt);
			SOTT_IQ.SetIndicatorParameters("OttMethod", OttMethod);
			RegisterUserIndicator(SOTT_IQ, Symbol, SymbolPeriod, OHLCType.Close, 5);


			// Gerekli			
			WorkWithPermanentSignal(true);

			if (AcigaSatisYapilsin)
			{
				SendOrderSequential(true, Side.All);
				SendOrderSequentialForShort(true, Side.All);
			}else
			{
				SendOrderSequential(true, Side.Buy);
			}
			// #Gerekli
		}
		
			// Gerekli
		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

		List<string> orderIDList = new List<string>();

		string orderID;

		public override void OnInitComplated()
		{
			FX_PiyasaTipi();
		}

		public void FX_Alis()
		{
			if (LastOrderSide.Obj != Side.Buy)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
					orderIDList.Add(orderID);
					Debug("Alış emri gönderildi.[ " + BuyOrderQuantity + " adet ]");
				}else
				{
					if (piyasaTipleri == PiyasaTipleri.BISTPP)
					{
						// Açık pozisyonu kapat
						orderID = SendMarketCloseShortOrder(Symbol, BuyOrderQuantity);
						orderIDList.Add(orderID);
						Debug("Açık pozisyonlar kapatıldı.[ " + BuyOrderQuantity + " adet ]");

						// Al
						orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						orderIDList.Add(orderID);
						Debug("Alış emri gönderildi.[ " + BuyOrderQuantity + " adet ]");
					}else
					{
						// pozsiyon kapat ve al
						orderID = SendMarketOrder(Symbol, BuyOrderQuantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						orderIDList.Add(orderID);
						Debug("Alış emri gönderildi.[ " + (BuyOrderQuantity * 2) + " adet ]");
					}
				}
				LastOrderSide.Obj = Side.Buy;
			}
		}

		public void FX_Satis()
		{
			if (LastOrderSide.Obj != Side.Sell)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					if (piyasaTipleri == PiyasaTipleri.BISTPP)
					{
						if (AcigaSatisYapilsin)
						{
							orderID = SendShortSaleMarketOrder(Symbol, SellOrderQuantity);
							orderIDList.Add(orderID);
							Debug("Açığa satış yapıldı.[ " + (SellOrderQuantity) + " adet ]");
						}else
						{
							orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
							orderIDList.Add(orderID);
							Debug("Satış emri gönderildi.[ " + (SellOrderQuantity) + " adet ]");
						}
					}else
					{
						orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						orderIDList.Add(orderID);
						Debug("Satış emri gönderildi.[ " + (SellOrderQuantity) + " adet ]");
					}

				}else
				{
					if (piyasaTipleri == PiyasaTipleri.BISTPP)
					{
						orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						orderIDList.Add(orderID);
						Debug("Satış emri gönderildi.[ " + (SellOrderQuantity) + " adet ]");

						orderID = SendShortSaleMarketOrder(Symbol, SellOrderQuantity);
						orderIDList.Add(orderID);
						Debug("Açığa satış yapıldı.[ " + (SellOrderQuantity) + " adet ]");
					}else
					{
						orderID = SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						orderIDList.Add(orderID);
						Debug("Satış emri gönderildi.[ " + (SellOrderQuantity * 2) + " adet ]");
					}
				}
				LastOrderSide.Obj = Side.Sell;
			}
		}

		[Output]
		public string Sembol1 = "";

		[Output]
		public string Sembol2 = "";

		enum PiyasaTipleri
		{
			BISTPP,
			BISTVIOP,
			KRIPTOBINANCE,
			KRIPTOBINANCEFUTURE,
			KRIPTOBITMEX,
			KRIPTOBTCTURK
		}

		PiyasaTipleri piyasaTipleri = PiyasaTipleri.BISTPP;

		public void FX_PiyasaTipi()
		{
			Sembol1 = Symbol;
			Sembol2 = Symbol;

			var SymbolDetail = GetSymbolDetail(Symbol);

			if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTPP.ToString())
			{
				piyasaTipleri = PiyasaTipleri.BISTPP;
			}else if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTVIOP.ToString())
			{
				piyasaTipleri = PiyasaTipleri.BISTVIOP;
			}else if (SymbolDetail.ExchangeDetail.ExchangeCode == "")
			{
				Sembol1 = Symbol.Split('_')[0];
				Sembol2 = Symbol.Split('_')[1];

				var _split = Symbol.Split('_');

				if (_split.Count() == 3)
				{
					if (Symbol.Split('_')[2].Contains("BIN"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCE;
					} else if (Symbol.Split('_')[2].Contains("FBIN"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCEFUTURE;
						Sembol1 = Symbol;
						Sembol2 = Symbol;

					}else if (Symbol.Split('_')[2].Contains("BMEX"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBITMEX;
					}
				}else
				{
					piyasaTipleri = PiyasaTipleri.KRIPTOBTCTURK;
				}

			}
		}



		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(SOTT_IQ, SOTT_IQ, 0, 1))
			{
				FX_Alis();
			}
			if (CrossBelow(SOTT_IQ, SOTT_IQ, 0, 1))
			{
				FX_Satis();
			}

		}


		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled && !orderIDList.Contains(order.CliOrdID) && AcigaSatisYapilsin)
			{
				if (order.Side.Obj == Side.Buy)
				{
					Debug("Sentetik emir tetiklendi ");
					LastOrderSide.Obj = Side.Sell;

					orderID = SendMarketOrder(Symbol, order.OrderQty, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
					orderIDList.Add(orderID);
					LastOrderSide.Obj = Side.Buy;

					Debug("Sentetik emrin kalan kısmı için alış emri gönderildi.[ " + order.OrderQty + " adet ]");

				}else
				{
					Debug("Sentetik emir tetiklendi ");
					LastOrderSide.Obj = Side.Buy;

					if (piyasaTipleri == PiyasaTipleri.BISTPP)
					{
						orderID = SendShortSaleMarketOrder(Symbol, order.OrderQty);
						orderIDList.Add(orderID);
					}else
					{
						orderID = SendMarketOrder(Symbol, order.OrderQty, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						orderIDList.Add(orderID);
					}
					LastOrderSide.Obj = Side.Sell;

					Debug("Sentetik emrin kalan kısmı için satış emri gönderildi.[ " + order.OrderQty + " adet ]");
				}
			}
		}

	}
}

İyi çalışmalar.

(11,069 puan) tarafından
tarafından seçilmiş
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.



7,516 soru
7,519 cevap
4,405 yorum
8,752 kullanıcı