0 beğenilme 0 beğenilmeme
288 kez görüntülendi
Merhabalar Pmax indikatörünü kullanarak ve elimdeki bakiyenin tamamını istedigim kaldıraç seviyesinde binance futures de işleme sokmak istiyorum fakar bu konuda önceden sorulmus soruların cevaplarını da test etmeme rağmen tam olarak çözüm bulamadım. Bu konuda yardımcı olabilir misiniz? Teşekkür ederim.
Algoritmik Trading kategorisinde (12 puan) tarafından | 288 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Bakiyeye göre pmax stratejisi için lütfen aşağıdaki linki inceleyiniz.

https://destek.matriksdata.com/?qa=2126/pmax-indikat%C3%B6r%C3%BCne-bakiye-ve-enstruman-say%C4%B1s%C4%B1-giri%C5%9Fi&show=2126#q2126

Hem kaldıraç kullanarak hem de bakiyenin tamamı ile işlem yapılamıyor.

Pmax Kaldıraçlı Strateji için ise 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;
/*
___ Kripex ---
Gönderilen emir Binance kaynaklı timestamp hatasından dolayı iptal olduğunda 
	İptal olan emir aynı özelliklerle(Sembol,adet,fiyat,emir tipi,yönü ...) belirlenen süre sonra tekrar gönderilecektir.
	Bu süreyi KacSaniyeSonraTekrarGonderilsin değişkeni ile ayarlanabilir. Süre saniye cinsindendir.
	
	Bu işlem AyniEmirKacSeferGonderilsin değişkeni kadar tekrarlanabilir. 
	Bu işlemin çok fazla tekrarlanması Binance tarafından ban yenmesine neden olabilir.
*/

namespace Matriks.Lean.Algotrader
{
	public class pmaxkaldırac : 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("BTC_USDT_BIN")]
		public string Symbol;

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

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(10)]
		public int ATRPeriod;

		[Parameter(10)]
		public int MovPeriod;

		[Parameter(3)]
		public decimal Coefficient;

		[Parameter(MovMethod.E)]
		public MovMethod MovMethod;

		PMaxIndicator pmax;

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);

			SendOrderSequential(true, Side.All);
			WorkWithPermanentSignal(true);

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

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(pmax.KLine, pmax.StLine))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
				Debug("Alış Emri Gönderildi");
			}

			if (CrossBelow(pmax.KLine, pmax))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
				Debug("Satış Emri Gönderildi");
			}
		}

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

		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				Debug("gerçekleşti");

				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.");
						}
					}
				}
			}
		}


		string orderIDTimestamp = string.Empty;

		public override void OnTimer()
		{
			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
	}
}

İyi çalışmalar.

(11,069 puan) tarafından
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,513 soru
7,517 cevap
4,405 yorum
8,752 kullanıcı