0 beğenilme 0 beğenilmeme
446 kez görüntülendi
Oluşturduğum sistem 30dk’lık kapanışlarda işlem açmakta. Seans süresince bir sıkıntı yok. Fakat 18.00’de açması gereken işlemleri ya açmıyor ya açsa bile hemen ardından iptal ediyor ya da çok ufak miktarlarda da olsa işlemi gerçekleştiremiyor.

bu sorunların önüne geçmek için sadece 17.30 mumu için geçerli olmak şartıyla mum kapanmadan saat 17.59’da o anki sinyal durumuna göre al veya sat olarak işlem açılmasını istiyorum. Bunu nasıl sağlayabiliriz?

Şimdiden teşekkürler, iyi çalışmalar.
Algoritmik Trading kategorisinde (14 puan) tarafından | 446 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba,

Dilerseniz aşağıdaki yapıyı test edebilirsiniz.

***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 System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;

namespace Matriks.Lean.Algotrader
{
	public class ErtesiGunGonderS : 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(1)]
						public decimal BuyOrderQuantity;

		[Parameter(1)]
						public decimal SellOrderQuantity;

		[Parameter(10)]
						public int ATRPeriod;

		[Parameter(10)]
						public int MovPeriod;

		[Parameter(3)]
						public decimal Coefficient;

		[Parameter(MovMethod.E)]
						public MovMethod MovMethod;

		// 18:00 oluşacak sinyalin kaç bara sonra gönderilmesi için
		[Parameter(1)]
						public int Oteleme;

		int realposition = 0;
		PMaxIndicator pmax;

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

			pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);

			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			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, Side.Buy);

			SetTimerInterval(1);
		}




		OrderSide _orderSide;
		decimal Quantity;
		string emirYonu;
		bool bayrak = false;
		int sayac = 0;

		/// <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)
		{
			sayac++;
			var _dTime = barData.BarData.Dtime;

			if (CrossAbove(pmax.KLine, pmax.StLine))
			{
				if (_dTime.Hour >= 18)
				{
					bayrak = true;
					Quantity = BuyOrderQuantity;
					_orderSide = OrderSide.Buy;
					emirYonu = "Alış";
					sayac = 0;
				}else
				{
					SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
					Debug("Alış emri gonderildi.");
				}
			}

			if (CrossBelow(pmax.KLine, pmax))
			{
				if (_dTime.Hour >= 18)
				{
					bayrak = true;
					Quantity = SellOrderQuantity;
					_orderSide = OrderSide.Sell;
					emirYonu = "Satış";
					sayac = 0;
				}else
				{
					SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
					Debug("Satış emri gonderildi.");
				}
			}

			if (sayac == Oteleme && bayrak)
			{
				SendMarketOrder(Symbol, Quantity, _orderSide);
				Debug(emirYonu + " emri gonderildi.");
				sayac = 1;
				bayrak = false;
			}
		}

		public override void OnOrderUpdate(IOrder order)
		{
			//Gercek zamanli pozisyon takibi
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				var positionChange = order.OrderQty;
				realposition += (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
		}
	}
}

İyi çalışmalar.

(11,059 puan) tarafından
0 0
Teşekkürler ilginiz için ama ben işlemlerin ertesi güne sarkmasını istemiyorum. Bu yüzden 17.30 açılan mum için 17.59da oluşan alım ya da satım yönündeki sinyal ne ise ona göre işlem açılmasını istiyorum. Bu yönde bir düzenleme yapabilir miyiz?
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,803 kullanıcı