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

https://destek.matriksdata.com/?qa=1361/timeinforce-ile-belli-bir-s%C3%BCre-ge%C3%A7erli-emir-vermek-m%C3%BCmk%C3%BCn-m%C3%BC&show=1371#a1371

Yukarıdaki Linkini verdiğiniz örneği inceledim. timespanı da araştırdım. Örnekteki uygulamanın sağlıklı çalışmayacağını düşünüyorum, çünkü emir gönderdikten hemen sonra kontrol yapıyor, kodu o satırda tutacak bir döngü vb. işlem bulunmuyor.

Ayrıca benim soruma da uyarlayamadım oradaki örneği.

Mümkünse aktif fiyattan***  verilen emir, 10 dakika sonra tamamlanmışsa kalan miktarı piyasa emrine çevirecek bir örnek verebilir misiniz?

***alternatif olarak pasif ve bar kapanış fiyatı da gösterilirse süper olur.

 

Şimdiden teşekkürler..

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

2 Cevaplar

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

Merhaba, IQ takimindan bir arkadasimiz istediginiz X dakika bekleme formatina uygun bir strateji yazdi, asagidan kopyalarak deneyebilirsiniz. 

***STRATEJILERI TEST/DENEME ORTAMINDA CALISTIRMADAN VE SIZIN ISTEDIGINIZ SEKILDE CALISTIGINA EMIN OLMADAN GERCEK ORTAMDA HIC BIR ZAMAN CALISTIRMAYINIZ***

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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;
using System.Threading.Tasks;
namespace Matriks.Lean.Algotrader
{
	public class marketIFnotfilled : 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("EGEEN")]
		public string Symbol;
		[Parameter(SymbolPeriod.Min5)]
		public SymbolPeriod SymbolPeriod;
		/*[Parameter(7)]
		public decimal BuyPrice;
		[Parameter(7)]
		public decimal SellPrice;*/
		[Parameter(5)]
		public decimal BuyOrderQuantity;
		[Parameter(5)]
		public decimal SellOrderQuantity;
		[Parameter(1)]
		public double Bekleme_Dakika;
		[Parameter(5)]
		public int MovPeriod;
		[Parameter(22)]
		public int MovPeriod2;

		// indikator tanımları.
		MOV mov;
		MOV mov2;

		/// <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);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

			WorkWithPermanentSignal(true);
			
			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			//SendOrderSequential(true);
		}

		/// <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(BarDataCurrentValues barDataCurrentValues)
		{
			var close = barDataCurrentValues.LastUpdate.Close; // bar kapanış fiyatı "close" olarak aliniyor
			if (CrossAbove(mov, mov2))
			{
				var orderID = SendLimitOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, close); //emir kapanış fiyatından gonderiliyor (baska istenilen bir fiyata degistirilebilir)
				Debug($"{orderID} id'li alış emri gönderildi. {Bekleme_Dakika} dakika icerisinde gerceklesmeyen miktar PIYASA emrine donusturulecektir.");
				Task.Run(async () =>
				{
					await Task.Delay(TimeSpan.FromMinutes(Bekleme_Dakika));
					if (!Orders.ContainsKey(orderID)) return ;
					var order = Orders[orderID];
					var kalan = order.LeavesQty;
					if (kalan > 0)
					{
						SendCancelOrder(orderID);
						SendMarketOrder(Symbol, kalan, OrderSide.Buy);
						Debug(orderID + " id'li alış emri belirtilen sürede gerçekleşmediği için piyasa emri olarak gonderildi");
						Debug("Piyasa fiyatindan gonderilen miktar : " + kalan);
					}
				});
			}

			if (CrossBelow(mov, mov2))
			{
				var orderID = SendLimitOrder(Symbol, SellOrderQuantity, OrderSide.Sell, close); //emir kapanış fiyatından gonderiliyor (baska istenilen bir fiyata degistirilebilir)
				Debug($"{orderID} id'li satış emri gönderildi. {Bekleme_Dakika} dakika icerisinde gerceklesmeyen miktar PIYASA emrine donusturulecektir.");
				Task.Run(async () =>
				{
					await Task.Delay(TimeSpan.FromMinutes(Bekleme_Dakika));
					if (!Orders.ContainsKey(orderID)) return ;
					var order = Orders[orderID];
					var kalan = order.LeavesQty;
					if (kalan > 0)
					{
						SendCancelOrder(orderID);
						SendMarketOrder(Symbol, kalan, OrderSide.Sell);
						Debug(orderID + " idli satış emri belirtilen sürede gerçekleşmediği için piyasa emri olarak gonderildi");
						Debug("Piyasa fiyatindan gonderilen miktar : " + kalan);
					}
				});
			}
		}
	}
}

 

(8,035 puan) tarafından
tarafından seçilmiş
1 0
Tam istediğim gibi olmuş.Çok teşekkür ederim.
0 beğenilme 0 beğenilmeme
Merhaba, evet sizin istediginiz (ornekten farkli olarak) sadece kalan emir miktarinin piyasa emrine cevrilmesi.

Bunun icin OnOrderUpdate kullanimi sart. Emri aktif fiyattan gondermek mumkun, ama derinlik datasi cektikten sonra backtest ve backtest opt. bu strateji icin yapilamayacaktir, bunu piyasa emri olarak gondermek istemediginizden emin misiniz?
(8,035 puan) tarafından
0 0

bactesti marketorder şeklinde yaparım. Gerçek işlem için de aktiften emir verip gerçekleşmeyen miktarı 10 dk. sonra piyasa emrine çeviririm.

Peki bar kapanış fiyatını "close" ile alsak, emri kapanış fiyatından versek, yine backtestte problem olur mu?

0 0
Yo hayir, close ile alindigi surece bir sorun olmaz. Yalniz derinlik datasina ulasmak istersek backtest ve opt. yapilamiyor cunku derinlik gecmis datasi bardata gibi tutulmuyor.
7,509 soru
7,511 cevap
4,405 yorum
8,722 kullanıcı