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

Öncelikle burada yardımcı olan ve olacak olan arkadaşlara çok teşekkür ediyorum.

1.Sorum:

TOOT sitemini binance futures de çalıştırmak istiyorum. Ancak algoritma sihirbazında  izsüren stop eklemek istediğimde aktivasyon fiyatı istiyor.  burada aktivasyon fiyatı olarak en son long veya short pozisyonuna giriş fiyatı aktiviasyon fiyatı olması lazım diye düşünüyorum. Devamlı çalışacak bir staratejide aktivasyon fiyatı her işlemde değişecetkir. Ama ayrıca forum içinde kodun içine eklenecek kodlar paylaşmıs arkadaşlar ama onu da ben henüz başaramadım. bununla alaklaı video da bulamadım.

yukarıda sorunu anlattım. Yapmak istediğim de şudur. Binace futures de toot stratejisini  çalıştırarak  her  pozisyonda yüzde x karla pozisyonu kapatıp diğer sinyali beklemesini istiyorum.binance futures de mümkünmü?

2. sorum stratejide çalışan ott bantlarında ortalamanın kesişimini sitem virgülden sonra  2 haneye göre yapıyor. Daha hassas sinyaller için örneğin virgülden sonra 4 veya 5 hanelik olarak ayarlamak mümkün müdür?

örnek:son barda  mov= 1,2285 ottup=1.2245 olduğunda  kırmış kabul etsin gibi
Algoritmik Trading kategorisinde (176 puan) tarafından | 959 kez görüntülendi

1 cevap

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

Merhabalar,

İstediğiniz strateji örneğini aşağıda görebilirsiniz.

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.AI;
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 TOTBINANCETEST : 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.Min5)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(40)]
		public int TOTTPeriod;

		[Parameter(1)]
		public decimal TOTTOpt;

		[Parameter(0.001d)]
		public decimal TwinOttCoef;

		[Parameter(MovMethod.Variable)]
		public MovMethod TottMovMethod;

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;
		[Parameter(3)]
			public int Kaldirac;
		[Parameter(3)]
			public decimal KarAl;

		// Gerekli
		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

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

		string orderID;
		// #Gerekli


		// indikator tanımları.
		TOTT tott;


		/// <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()
		{
			AddSymbol(Symbol, SymbolPeriod);
			tott = TOTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, TOTTPeriod, TOTTOpt, TwinOttCoef, TottMovMethod);


			SendOrderSequential(true, Side.Buy);

			// Gerekli                                
			WorkWithPermanentSignal(true);

			if (AcigaSatisYapilsin)
			{
				SendOrderSequential(true, Side.All);
				SendOrderSequentialForShort(true, Side.All);
			}else
			{
				SendOrderSequential(true, Side.Buy);
			}
			// #Gerekli
			// #Gerekli

			// kaldıraç oranı
			SetLeverage(Symbol, Kaldirac);
			// kaldıraç tipi - true isolated, false cross
			SetLeverageType(Symbol, true);

			//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
			//SetTimerInterval(3);

			//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 OnInitCompleted()
		{

		}

		/// <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(tott.Mov, tott.OttUp))
			{
				FX_Alis();
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, KarAl);
				Debug("Alış Emri Gönderildi");
			}

			if (CrossBelow(tott.Mov, tott.OttDown))
			{
				FX_Satis();

				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, KarAl);
				Debug("Satış Emri Gönderildi");
			}
		}

		// Gerekli

		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 OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				

			}

			//			if (order.OrdStatus.Obj == OrdStatus.Filled && !orderIDList.Contains(order.CliOrdID) && AcigaSatisYapilsin)
			//			{
			//				LastOrderSide.Obj = Side.All;
			//			}
		}
		// #Gerekli
	}
}

İkinci sorunuza gelecek olursak,

Herhangi iki indikatörün kesişimi ön planda sadece iki basamak olarak görünse de arka planda o indikatörün alabileceği maksimum basamak sayısını alıp hesaplama yapıyor.

Ama eğer isterseniz Debug fonksiyonu ile indikatörünüzün virgülden sonra 4 ya da 5 basamağını ekrana yazdırabilirsiniz.

Aşağıda örneği verilmiştir.

Debug("Most.ExMov:" +  Math.Round(most.ExMOV.CurrentValue,4));

(11,059 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.



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