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

Ben yapamadım

Algo Sihirbazında yapıp 3 dakikalık bar seçeneği ve getheikinashi'yi ekleyince hata veriyor ve barlarda heikin e dönmüyor. 

 

Yardımcı olursanız sevirinirim. 

 

Hekin Ashi barlarda

wma 8 in kapanış değeri

wma 8 in açılış değerini 

yukarı kestiğin de alsın, aşağı kestiğinde satsın

kaldıraç 10 

kaldıraçlı işlem seçeneği isolated

ve her seferinde bakiyenin % 10 'u kadarı ile işlem açsın  

mümkünse 3 dakikalık seçenek 

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 ackapawma : 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;


		[Parameter(SymbolPeriod.Min)]
			public SymbolPeriod SymbolPeriod1;



		[Parameter(8)]
			public int WmaPeriod1;

		[Parameter(8)]
			public int WmaPeriod2;

		[Parameter(0.01)]
			public decimal OrderQuantity1;

		[Parameter(false)]
			public bool IsReduceOnly1;

		[Parameter(false)]
			public bool IsReduceOnly2;

		[Parameter(10)]
			public decimal Leverage2;

		[Parameter(false)]
			public bool IsReduceOnly3;

		[Parameter(CryptoLeverageType.Isolated)]
			public CryptoLeverageType LeverageType3;

		[Parameter(0.01)]
			public decimal OrderQuantity4;

		[Parameter(false)]
			public bool IsReduceOnly4;

		[Parameter(false)]
			public bool IsReduceOnly5;

		[Parameter(10)]
			public decimal Leverage5;

		[Parameter(false)]
			public bool IsReduceOnly6;

		[Parameter(CryptoLeverageType.Isolated)]
			public CryptoLeverageType LeverageType6;

		WMA wma;
		WMA wma2;



		public override void OnInit()
		{

			wma = WMAIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, WmaPeriod1);
			wma2 = WMAIndicator(Symbol1, SymbolPeriod1, OHLCType.Open, WmaPeriod2);


			SendOrderSequential(true, Side.All);
			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(wma, wma2, 0, 0))
			{
				SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false, isReduceOnly : IsReduceOnly1);
				SetLeverage(Symbol1, Leverage2);
				SetLeverageType(Symbol1, LeverageType3);
			}
			if (CrossBelow(wma, wma2, 0, 0))
			{
				SendMarketOrder(Symbol1, OrderQuantity4, OrderSide.Sell, includeAfterSession:false, isReduceOnly : IsReduceOnly4);
				SetLeverage(Symbol1, Leverage5);
				SetLeverageType(Symbol1, LeverageType6);
			}

		}

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

 

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

2 Cevaplar

2 beğenilme 0 beğenilmeme
En İyi Cevap
Sizin stratejiniz çok fazla sinyal verecektir ve komisyon kesintisi fazla olacaktır. Dikkatli olun ve küçük bakiye ile test edin derim.

Aşağıdaki isteğinize göre düzenlediğim, belirlenecek bakiyede çift yönlü işlem yapabileceğiniz, Kar al ve stop eklenmiş algoritmayı test edebilirsiniz. Kripo Vadeli işlemlerde bakiyenizden kullanılacak miktarı "Kaldirac" oranını ile çarpıp "KullanilacakBakiye" satırına yazmanız gerekmektedir. Örnek olarak KullanilacakBakiye=100, Kaldirac=20 seçilmesi halinde bakiyenizden 5 dolar ile çift yönlü işlem yapacaktır.  Bol kazançlar.

 

 

using System;

using System.Collections.Generic;

using System.Linq;

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 Bakiyeile_WMA_HA : 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.

// Kripo Vadeli işlemlerde bakiyenizden kullanılacak miktarı "Kaldirac" oranını ile çarpıp "KullanilacakBakiye" satırına

// yazmanız gerekmektedir. Örnek olarak KullanilacakBakiye=100, Kaldirac=20 seçilmesi halinde bakiyenizden 5 dolar ile

// çift yönlü işlem yapacaktır.

 

 

[SymbolParameter("CELR_USDT_FBIN")]

public string Symbol;

//[Parameter(SymbolPeriod.Min)]

//public SymbolPeriod SymbolPeriod;

[Parameter(3)]

public int NBar;

//Alım satım miktarı ve sentetik emir

[Output][Parameter(50)]

public decimal KullanilacakBakiye;

[Parameter(10)]

public int Kaldirac;

[Parameter(1)]

public decimal ZararDurdur;

[Parameter(0.5)]

public decimal KarAL;

// Gerekli açığa satış

[Parameter(true)]

public bool AcigaSatisYapilsin;

[Parameter(true)]

public bool AksamSeansiniDahilEt;

[Parameter(Side.All)]

public Side HangiIslemleBaslasin;

//İndikatör Değerleri

[Parameter(8)]

public int WMAPeriod;

 

WMA wmaClose;

WMA wmaOpen;

 

public override void OnInit()

{

PeriodInfo NBarPeriod = new PeriodInfo(PeriodType.Minute, NBar);

NBarPeriod.IsHeikinAshi = true;

AddSymbol(Symbol, NBarPeriod);

wmaClose = WMAIndicator(Symbol, NBarPeriod, OHLCType.Close, WMAPeriod);

wmaOpen = WMAIndicator(Symbol, NBarPeriod, OHLCType.Open, WMAPeriod);

 

//*********//

WorkWithPermanentSignal(true);

// Gerekli açığa satış

SendOrderSequential(true, HangiIslemleBaslasin);

SendOrderSequentialForShort(true, Side.All);

// Gerekli - Kaldıraç

SetLeverage(Symbol, Kaldirac); // kaldıraç oranı

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

// Gerekli - Timestamp

SetTimerInterval(1);

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

{

var SymbolDetail = GetSymbolDetail(Symbol);

MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);

}

 

 

public decimal MinSize;

public decimal PayMiktari;

decimal _fiyat;

 

// Sonfiyat

public decimal FX_Sonfiyat()

{

var barDataModel = GetBarData();

decimal _close = Ref(barDataModel, OHLCType.Close, 0);

return _close;

}

 

// hisse

public bool FX_BalanceKontrolu()

{

return true;

}

 

// kriptolar için minimum değişim miktarı

public decimal FX_MinSize(decimal quantity)

{

return Math.Truncate((quantity - (quantity % MinSize)) / MinSize) * MinSize;

}

 

/// <summary>

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

/// </summary>

 

 

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

{

Debug("wmaClose:" + wmaClose.Value[0][wmaClose.CurrentIndex]);

Debug("wmaOpen :" + wmaOpen.Value[0][wmaOpen.CurrentIndex]);

Debug("***************");

 

if (CrossAbove(wmaClose, wmaOpen, 0, 0))

{

FX_Alis(Symbol, PayMiktari);

}

if (CrossBelow(wmaClose, wmaOpen, 0, 0))

{

FX_Satis(Symbol, PayMiktari);

}

}

 

/// <summary>

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

/// </summary>

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

//**********************YY******************//

 

 

public void FX_Alis(string sembol, decimal quantity)

{

if (FX_BalanceKontrolu())

{

decimal _close = FX_Sonfiyat();

PayMiktari = FX_MinSize(KullanilacakBakiye / _close);

quantity = PayMiktari;

if (LastOrderSide.Obj != Side.Buy)

{

if (sentetikEmirdenMI)

LastOrderSide.Obj = Side.All;

 

sentetikEmirdenMI = false;

 

var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2;

 

SendMarketOrder(Symbol, _quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSideForShort = LastOrderSide;

}

}

 

}

 

public void FX_Satis(string sembol, decimal quantity)

{

if (FX_BalanceKontrolu())

{

decimal _close = FX_Sonfiyat();

PayMiktari = FX_MinSize(KullanilacakBakiye / _close);

quantity = PayMiktari;

if (LastOrderSide.Obj != Side.Sell)

{

if (sentetikEmirdenMI)

LastOrderSide.Obj = Side.All;

 

sentetikEmirdenMI = false;

 

var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2;

 

SendMarketOrder(Symbol, _quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSideForShort = LastOrderSide;

}

}

 

}

 

bool sentetikEmirdenMI = false;

 

public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)

{

if (sOrder.EnableOrderSending)

{

if (AcigaSatisYapilsin)

{

LastOrderSide.Obj = Side.All;

sentetikEmirdenMI = true;

}

 

Debug("Sentetik emir tetiklendi");

}

}

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

 

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

// #Gerekli - Timestamp

 

public override void OnTimer()

{

// Gerekli - Timestamp

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)

{

_fiyat = order.Price;

StopLoss(Symbol, SyntheticOrderPriceType.Percent, ZararDurdur);

TakeProfit(Symbol, SyntheticOrderPriceType.Percent, KarAL);

if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)

{

var PayTutari = order.OrderQty * order.Price;

KullanilacakBakiye -= PayTutari;

}

 

if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)

{

var PayTutari = order.OrderQty * order.Price;

KullanilacakBakiye -= PayTutari;

}

if (order.OrdStatus.Obj == OrdStatus.Filled && sentetikEmirdenMI)

{

var PayTutari = order.OrderQty * order.Price;

KullanilacakBakiye += PayTutari;

}

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

}

//**********************YY******************//

 

/// <summary>

/// Strateji durdurulduğunda bu fonksiyon tetiklenir.

/// </summary>

public override void OnStopped()

{

}

}

}
(172 puan) tarafından
tarafından seçilmiş
0 0
Çok teşekkür ederim,

 

Saygılar
1 beğenilme 0 beğenilmeme

Merhabalar,

Hekin Ashi barlarda

wma 8 in kapanış değeri

wma 8 in açılış değerini 

yukarı kestiğin de alsın, aşağı kestiğinde satsın

kaldıraç 10 

kaldıraçlı işlem seçeneği isolated

mümkünse 3 dakikalık seçenek,

ve her seferinde bakiyenin % 10 'u kadarı ile işlem açsın.

  

Yukarıda belirttiğiniz koşullardan koyu renkle işaretlenmiş olan kısımları aşağıdaki sistemde mevcuttur.

Kaldıraçlı sistemlerde Bakiye bazlı işlem yapmak maalesef mümkün değildir.

Dilerseniz aşağıdaki sistemi inceleyebilirsiniz.

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 ackapawmaf : MatriksAlgo
	{
		[SymbolParameter("BTC_USDT_FBIN")]
			public string Symbol;
		//		[Parameter(SymbolPeriod.Min5)]
		//			public SymbolPeriod SymbolPeriod;
		[Parameter(0.003)]
			public decimal BuyOrderQuantity;
		[Parameter(0.003)]
			public decimal SellOrderQuantity;
		[Parameter(8)]
			public int WmaPeriod1;
		[Parameter(8)]
			public int WmaPeriod2;
		[Parameter(2)]
			public int NBar;

		WMA wma;
		WMA wma2;

		public override void OnInit()
		{
			PeriodInfo NBarPeriod = new PeriodInfo(PeriodType.Minute, NBar);
			NBarPeriod.IsHeikinAshi = true;

			AddSymbol(Symbol, NBarPeriod);

			wma = WMAIndicator(Symbol, NBarPeriod, OHLCType.Close, WmaPeriod1);
			wma2 = WMAIndicator(Symbol, NBarPeriod, OHLCType.Open, WmaPeriod2);

			// Gerekli açığa satış
			WorkWithPermanentSignal(true);
			SendOrderSequential(true, HangiIslemleBaslasin);
			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

		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(wma, wma2, 0, 0))
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);
				// #Gerekli açığa satış
			}

			if (CrossBelow(wma, wma2, 0, 0))
			{
				// Gerekli açığa satış
				FX_Satis(Symbol, SellOrderQuantity);
				// #Gerekli açığa satış
			}
		}

		// Gerekli açığa satış
		[Parameter(3)]
			public int Kaldirac;
		[Parameter(true)]
			public bool AcigaSatisYapilsin;
		[Parameter(false)]
			public bool AksamSeansiniDahilEt;
		[Parameter(Side.All)]
			public Side HangiIslemleBaslasin;

		public void FX_Alis(string sembol, decimal quantity)
		{
			if (LastOrderSide.Obj != Side.Buy)
			{
				var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(sembol, _quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
				Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSideForShort = LastOrderSide;
				sentetikEmirdenMI = false;
			}
		}

		public void FX_Satis(string sembol, decimal quantity)
		{
			if (LastOrderSide.Obj != Side.Sell)
			{
				var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(sembol, _quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
				Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSideForShort = LastOrderSide;
				sentetikEmirdenMI = false;
			}
		}

		bool sentetikEmirdenMI = false;

		public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
		{
			if (sOrder.EnableOrderSending)
			{
				if (AcigaSatisYapilsin)
				{
					LastOrderSide.Obj = Side.All;
					sentetikEmirdenMI = true;
				} Debug("Sentetik emir tetiklendi");
			}
		}
		// #Gerekli açığa satış 

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

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

İyi çalışmalar.

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



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