MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
127 kez görüntülendi

Merhabalar, Canlıda bir çalıştırmaya başladım. Binance Fitures de iki yönlü işlem yapıyor. Back testlerde gayet iyi iken. Canlıya başladığımda sadece al ve sat yapıyor. Açığa sat yapmıyor. ve açığa sat kapamasını yapmıyor.

Strateji kodlarıda:

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 AlphaTrend1 : 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_FBIN")]

public string Symbol1;



[SymbolParameter("BTC_USDT_FBIN")]

public string OrderSymbol1;





[Parameter(SymbolPeriod.Min5)]

public SymbolPeriod SymbolPeriod1;







[Parameter(1)]

public decimal Alphatrend_iqCoeff1;



[Parameter(14)]

public int Alphatrend_iqPeriod1;



[Parameter(Momentum.MFI)]

public Momentum Alphatrend_iqMomentum1;



[Parameter(false)]

public bool IsReduceOnly1;



[Parameter(5)]

public decimal Leverage1;



[Parameter(false)]

public bool IsReduceOnly2;



[Parameter(CryptoLeverageType.Isolated)]

public CryptoLeverageType LeverageType2;



[Parameter(0.01)]

public decimal AçığaSatışKapama;



[Parameter(0.01)]

public decimal Alış;



[Parameter(false)]

public bool IsReduceOnly5;



[Parameter(5)]

public decimal Leverage5;



[Parameter(false)]

public bool IsReduceOnly6;



[Parameter(CryptoLeverageType.Isolated)]

public CryptoLeverageType LeverageType6;



[Parameter(0.01)]

public decimal Satış;



[Parameter(0.01)]

public decimal AçığaSatış;



MatriksIndicator AlphaTrend_IQ;







public override void OnInit()

{

AddSymbol(OrderSymbol1, SymbolPeriod1);

AlphaTrend_IQ = new AlphaTrend_IQ();



AlphaTrend_IQ.SetIndicatorParameters("Coeff", Alphatrend_iqCoeff1);

AlphaTrend_IQ.SetIndicatorParameters("Period", Alphatrend_iqPeriod1);

AlphaTrend_IQ.SetIndicatorParameters("Momentum", Alphatrend_iqMomentum1); RegisterUserIndicator(AlphaTrend_IQ, Symbol1, SymbolPeriod1, OHLCType.Close, 5);





SetLeverage(Symbol1, Leverage1);

SetLeverageType(Symbol1, LeverageType2);

SetLeverage(Symbol1, Leverage5);

SetLeverageType(Symbol1, LeverageType6);



SendOrderSequential(true, Side.Buy);

SendOrderSequentialForShort(true, Side.Sell);



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 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(AlphaTrend_IQ, AlphaTrend_IQ, 1, 0))

{

SendMarketCloseShortOrder(OrderSymbol1, AçığaSatışKapama);

SendMarketOrder(OrderSymbol1, Alış, OrderSide.Buy, includeAfterSession:false);

}

if (CrossBelow(AlphaTrend_IQ, AlphaTrend_IQ, 1, 0))

{

SendMarketOrder(OrderSymbol1, Satış, OrderSide.Sell, includeAfterSession:false);

SendShortSaleMarketOrder(OrderSymbol1, AçığaSatış);

}



}



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

{

}



/// <summary>

/// Strateji durdurulduğunda bu fonksiyon tetiklenir.

/// </summary>

public override void OnStopped()

{

}

}

}

Acaba nerde yanlışım var?

Algoritmik Trading kategorisinde (49 puan) tarafından | 127 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Dilerseniz aşağıdaki yapıyı kullanabilirsiniz.

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 alphavadeli : MatriksAlgo
	{
		[SymbolParameter("FGARAN")]
		public string Symbol;

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

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(1)]
			public decimal AlphatrendCoeff1;

		[Parameter(14)]
			public int AlphatrendPeriod1;

		[Parameter(Momentum.MFI)]
			public Momentum AlphatrendMomentum1;

		[Parameter(3)]
		public int Kaldirac;




		MatriksIndicator AlphaTrend_IQ;

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			// alış koşulu
			if (CrossBelow(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);



				// #Gerekli açığa satış
			}

			// satış koşulu
			if (CrossAbove(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))
			{
				// Gerekli açığa satış
				FX_Satis(Symbol, SellOrderQuantity);



				// #Gerekli açığa satış
			}
		}

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

			AlphaTrend_IQ.SetIndicatorParameters("Coeff", AlphatrendCoeff1);
			AlphaTrend_IQ.SetIndicatorParameters("Period", AlphatrendPeriod1);
			AlphaTrend_IQ.SetIndicatorParameters("Momentum", AlphatrendMomentum1); RegisterUserIndicator(AlphaTrend_IQ, Symbol, SymbolPeriod, OHLCType.Close, 5);


			// 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ış

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

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

		// Gerekli açığa satış
		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

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

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

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

		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

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

İyi çalışmalar.

(3,794 puan) tarafından
0 0
Çok teşekkürler tam istediğim gibi olmasada gayet güzel çalışıyor. Ancak backtestlerde "Aynıemirkaçdefa gönderilsin" ve Kaçsaniyesonratekrargönderilsin" seçenekleri tam olarak nasıl tetikleniyor. Bunu çözemedim.

Birde iz süren stop konusunda yardımcı olabilir misiniz acaba?
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.



4,285 soru
4,259 cevap
2,939 yorum
3,177 kullanıcı