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

Bir hissenin derinliğinde alışta bekleyen ilk 10 kademeye istediğim kadar lot alım girmek istiyorum. Fakat aktif alış kademesi eğer biterse benim girdiğim tüm emirlerin birer kademe alta gelmesini istiyorum. Bu kodu biri sağlayabilirse 40 gece hayır duası edeceğim :)

Teşekkür ederim,

Saygılarımla.
Algoritmik Trading kategorisinde (73 puan) tarafından | 815 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba, aşağıda paylaştığım strateji ilk 10 kademeye emir göndermekte. Eğer ilk kademedeki emir gerçekleşirse onun yerine 10. kademeye emir gönderir. Sanırım istediğiniz durumu sağlıyor. 

İyi çalışmalar

Not: Stratejiden sonuçlarından emin olana kadar gerçek hesaplarda kullanmayınız. 

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 KademeliAl : 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(SymbolPeriod.Min)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(5)]
		public decimal Quantity;

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

			WorkWithPermanentSignal(false);
			//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(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()
		{

		}
		bool firstrun = 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)
		{

			if (firstrun)
			{
				var derinlik = GetMarketDepth(Symbol);
				firstrun = false;
				for (int i = 0; i<10; i++)
				{
					var kademe = derinlik.BidRows[i].Price;
					SendLimitOrder(Symbol, Quantity, OrderSide.Buy, kademe);
					Debug($"{i}. kademeden {kademe} fiyatıyla emir gönderildi.");
				}
				Debug("-----------------------");
			}
		}

		/// <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)
			{
				var derinlik = GetMarketDepth(Symbol);
				var price = order.LastPx;
				Debug($"Alış işlemi {price} fiyatından gerçekleşti.");
				Debug("Yeni kademeler : ");
				for (int i = 0; i<10; i++)
				{
					var kademe = derinlik.BidRows[i].Price;
					Debug($"{i}. kademeden {kademe} fiyatıyla emir gönderildi.");
				}
				//Birinci kademe emir gerçekleştiği için 10. kademeye yeni emir oluşturuluyor.
				var sonKademe = derinlik.BidRows[9].Price;
				SendLimitOrder(Symbol, Quantity, OrderSide.Buy, sonKademe);
				Debug("-----------------------");
			}
		}
	}
}

 

(4,555 puan) tarafından
7,516 soru
7,519 cevap
4,405 yorum
8,752 kullanıcı