0 beğenilme 0 beğenilmeme
2,094 kez görüntülendi
Merhaba,

Derinlik verisini kullanarak trade etmek istediğim algoritmik işlem şu şekildedir:

Aktif satıştaki lot sayısı X adetinin altına düşerse Y adette alım yap VE aldığın Y adetteki lot sayısını Z kademe yukarıya satışını hemen koy. Eğer aldığın fiyattan V kademe aşağı düşerse fiyat stop ol.
Algoritmik Trading kategorisinde (73 puan) tarafından
tarafından yeniden gösterildi | 2,094 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba,

aşağıdaki stratejiyi kullanabilirsiniz.  şuna dikkat etmek gerekir yapı gereği her işlem olduğunda kademe kontrolü yapılacaktır her kademe değiştiğinde değil.

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

namespace Matriks.Lean.Algotrader
{
	public class DerinlikLotKontrolu : 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(5)]
		public decimal Quantiy;		
		
		[Parameter(true)]
		public bool SuankiKademeyeGoreMI;
		
		[Parameter(0)]
		public decimal KademeFiyati;
		
		[Parameter(10000)]
		public decimal KademedekiLotMiktari;
		
		[Parameter(10)]
		public decimal AlindiktanSonraKacKademeYukariSatisGonderilecek;
		
		[Parameter(5)]
		public decimal KacKademeDuserseStopOlsun;
		
		[Output]
		public decimal Price;
		
		[Output]
		public decimal Size;
		
		[Output]
		public bool AktifMI=true;
		
		string orderID;
		
		decimal priceStep;
		

		/// <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.Day);
			AddSymbolMarketDepth(Symbol);

			//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,Side.Buy);
			WorkWithPermanentSignal(false);
		}

		/// <summary>
		/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
		/// </summary>
		public override void OnInitComplated()
		{
			var barDataModel=GetBarData();
			var close=Ref(barDataModel,OHLCType.Close,0);
			priceStep=GetPriceStepForBistViop(Symbol,close);
		}

		public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
		{
			
			if(AktifMI){
				var derinlik=GetMarketDepth(Symbol);
			
				if(SuankiKademeyeGoreMI || KademeFiyati==0){
					if(derinlik.BidRows[0].Size<KademedekiLotMiktari){
						orderID=SendMarketOrder(Symbol,Quantiy,OrderSide.Buy);
						Debug("alış emri gönderildi.");
						AktifMI=false;
					}
					Price=derinlik.BidRows[0].Price;
					Size=derinlik.BidRows[0].Size;
				}else{
					if(derinlik.BidRows.Where(x=> x.Price==KademeFiyati).FirstOrDefault().Size<KademedekiLotMiktari){
						orderID=SendMarketOrder(Symbol,Quantiy,OrderSide.Buy);
						Debug("alış emri gönderildi.");
						AktifMI=false;
					}
					Price=derinlik.BidRows.Where(x=> x.Price==KademeFiyati).FirstOrDefault().Price;
					Size=derinlik.BidRows.Where(x=> x.Price==KademeFiyati).FirstOrDefault().Size;
				}
			}
		}

		/// <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)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj== Side.Buy)
			{				
				SendLimitOrder(Symbol,Quantiy,OrderSide.Sell,(order.Price+priceStep*AlindiktanSonraKacKademeYukariSatisGonderilecek));
				StopLoss(Symbol,SyntheticOrderPriceType.PricePoint,priceStep*KacKademeDuserseStopOlsun);
				Debug("alış gerçekleşti. alış fiyatı: "+order.Price);
				Debug("alış fiyatının "+AlindiktanSonraKacKademeYukariSatisGonderilecek+" kademe üstüne satış emri gönderildi");
			}
			
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj== Side.Sell)
			{
				if(order.CliOrdID!=orderID){
					SendCancelOrder(orderID);
					Debug("Satış emri gerçekleşti");
				}else{
					Debug("stop teteiklendi");
				}
				
			}
		}
	}
}

 

(15,892 puan) tarafından
0 0
Sistem çalışıyor fakat bir sorun ve anlamadığım şeyler oluştu.

İlk olarak sorun şu. Alımı piyasa emri şeklinde yolluyor yani tavan fiyattan. Mesela 15.60'da TCELL alması gerekiyordu ama alım tavan fiyat 17.09'a gitti. Sistem 2 kademe üstü satışı 17.11'e yazdı. Fakat 17.11 emir alamadığı için iptal oldu. Yani alım emri limit emir olması gerekmekte.

Sorularım ise şu şekilde:

ŞuankiKademeyeGöreMi işaretlenince ne oluyor işaretlenmeyince ne oluyor?

Kademe fiyatı 0 olarak mı kalmalı? Bunu ne için düzeltip ne olarak kullanmalıyız?

KademedekiLotMiktarı değişkeni sanırım yazacağımız lot seviyesinin altına gelince alım yapılan parametre.

Bunlar nasıl oluyor tam olarak nasıl çalışıyor?

Teşekkürler
8,636 soru
8,590 cevap
4,821 yorum
19,786 kullanıcı