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

 

Merhaba

Oluşturduğum strateji Uzun , Nötr, ve Kısa olarak 3 konumda bulunabiliyor.Stratejiyi Nötr başlangıç ile çalıştırdığımda sorun olmuyor. Ancak Uzun ve Kısa pozisyonlarda belli bir miktar ile çalıştırdığımda bazı sorunlar oluşuyor. Bu sorunları aşamadım yardımınızı istiyorum. 

1- Stratejiyi  örneğin 10 sözleşme Uzun pozisyonda başlatalım. İlk işlem eğer denk gelirse stop-loss (%3) olsun. Bu nasıl sağlanabilir.? Stop-Loss fonksiyonunu stratejiyi başlatmadan önce portfoyümde bulunan enstrümanın maliyetine ve miktarına ulaştırabilirmiyim?

2 Stratejiyi yine 10 sözleşme Uzun pozisyonda başalatalım. İlk işlem 2X=20 adet satış ile -10 sözleşme kısa pozisyona geçsin. Reelde elimizde 10 adet kısa pozisyon var. Bu anda Stop- Loss olursa 10 sözleşme işlem yapıp Nötr pozisyona geçmek yerine 20 adet ile işlem yaparak 10 sözleşme Long pozisyona geçiyor. Strateji 0(sıfır) başlangıç ile rapora başlıyor. Bunu nasıl düzeltebilirim.

3 Tekrar stratejiyi 10 adet Uzun pozisyonda başlatıyorum. Strateji kod gereği 10 satış yapıp Nötr pozisyona geçiyor. Sonra tekrar 10 adet alıp Uzun pozisyona geçtiğinde Stop-Loss çalışmıyor. Çünkü rapor 0 ile başlıyor 10 adet alıp 10 adete satınca 0 adet gibi davranıp stop olmuyor. Bunu da çözmeye yardımcı olmanızı istiyorum.

var position = GetRealPosition() ;  ile pozisyon bilgileri de reeldeki gibi değil rapordaki gibi geliyor. 

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
{ //ST_Vadeli_Kaldirac_SL_TP
	public class UcxST_VIOP_v3 : MatriksAlgo
	{
		[SymbolParameter("FEREGL")]
		public string Symbol;
		//ST_Vadeli_Kaldirac_SL_TP
		[Parameter(SymbolPeriod.Min60)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(8)]
			public int SupertrendPeriod1;
		[Parameter(9)]
			public int SupertrendPeriod2;
		[Parameter(18)]
			public int SupertrendPeriod3;

		[Parameter(4.5)]
			public decimal SupertrendCoeff1;

		[Parameter(2.3)]
			public decimal SupertrendCoeff2;

		[Parameter(1.3)]
			public decimal SupertrendCoeff3;

		[Parameter(1)]
		public decimal Quantity;

		[Parameter(5)]
			public decimal KarAl;

		[Parameter(3.5)]
			public decimal ZararDurdur;

		[Parameter(false)]
		public bool BaslangictaVarMi;

		[Parameter(5)]
		public decimal izSurenZararDurdur;


		public decimal Adet = 0;

		[Parameter(0)]
		public int position;

		SuperTrend superTrend1;

		SuperTrend superTrend2;

		SuperTrend superTrend3;

		public override void OnInit()
		{

			AddSymbol(Symbol, SymbolPeriod);
			superTrend1 = SuperTrendIndicator(Symbol, SymbolPeriod, SupertrendPeriod1, SupertrendCoeff1);
			superTrend2 = SuperTrendIndicator(Symbol, SymbolPeriod, SupertrendPeriod2, SupertrendCoeff2);
			superTrend3 = SuperTrendIndicator(Symbol, SymbolPeriod, SupertrendPeriod3, SupertrendCoeff3);



			// Gerekli - Açığa satış
			WorkWithPermanentSignal(true);

			if (HangiIslemleBaslasin == yon.Alis)
			{
				SendOrderSequential(true, Side.Buy);
			}
			else if (HangiIslemleBaslasin == yon.Satis)
			{
				SendOrderSequential(true, Side.Sell);
			}
			else
			{
				SendOrderSequential(false, Side.All);
			}
			SendOrderSequentialForShort(false, Side.All);
			// #Gerekli - Açığa satış

		}
		public override void OnInitComplated()
		{
			var pozisyon = GetRealPositions();
			if (pozisyon.ContainsKey(Symbol))
			{
				var Maliyet = pozisyon[Symbol].AvgCost;
				var Quantity = pozisyon[Symbol].QtyAvailable;

				Debug("Maliyet	: " + Maliyet);
				Debug("Başlangıç Miktarı	: " + Quantity);
			}
		}
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var barData1 = GetBarData(Symbol, SymbolPeriod);
			// (superTrend.Value[0][superTrend.CurrentIndex]< kapanis)
			var kapanis = Ref(barData1, OHLCType.Close, 0);
			//(CrossBelow(superTrend, barData1, OHLCType.Close, 0))
			// (CrossAbove(superTrend, barData1, OHLCType.Close, 0))

			if (!BaslangictaVarMi)
			{
				if (superTrend1.Value[0][superTrend1.CurrentIndex] < kapanis)
				{
					if ((position == 0) && (CrossBelow(superTrend1, barData1, OHLCType.Close, 0) || CrossBelow(superTrend3, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity;
						FX_Alis();
						position = 1;
					}
					else if ((position == -1) && (CrossBelow(superTrend1, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity * 2;
						FX_Alis();
						position = 1;
					}
					else if ((position == 1) && (CrossAbove(superTrend2, barData1, OHLCType.Close, 0)) && (LastOrderSide.Obj != Side.All))
					{
						Adet = Quantity;
						SendMarketOrder(Symbol, Adet, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						LastOrderSide.Obj = Side.All;
						position = 0;
						Debug("Satış emri gönderildi.[ " + Adet + " adet ]");
					}
				}
				if (superTrend1.Value[0][superTrend1.CurrentIndex] > kapanis)
				{
					if ((position == 0) && (CrossAbove(superTrend1, barData1, OHLCType.Close, 0) || CrossAbove(superTrend3, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity;
						FX_Satis();
						position = -1;
					}
					else if ((position == 1) && (CrossAbove(superTrend1, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity * 2;
						FX_Satis();
						position = -1;
					}
					else if ((position == -1) && (CrossBelow(superTrend2, barData1, OHLCType.Close, 0)) && (LastOrderSide.Obj != Side.All))
					{
						Adet = Quantity;
						SendMarketOrder(Symbol, Adet, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						LastOrderSide.Obj = Side.All;
						position = 0;
						Debug("Alış emri gönderildi.[ " + Adet + " adet ]");
					}
				}
			}
			if (BaslangictaVarMi)
			{
				if (superTrend1.Value[0][superTrend1.CurrentIndex] < kapanis)
				{
					if ((position == -1) && (CrossBelow(superTrend1, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity * 2;
						FX_Alis();
						position = 1;
					}
					if ((position == 1) && (CrossAbove(superTrend2, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity;
						SendMarketOrder(Symbol, Adet, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						LastOrderSide.Obj = Side.All;
						position = 0;
						Debug("Satış emri gönderildi.[ " + Adet + " adet ]");
					}
				}
				if (superTrend1.Value[0][superTrend1.CurrentIndex] > kapanis)
				{

					if ((position == 1) && (CrossAbove(superTrend1, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity * 2;
						FX_Satis();
						position = -1;
					}
					else if ((position == -1) && (CrossBelow(superTrend2, barData1, OHLCType.Close, 0)))
					{
						Adet = Quantity;
						SendMarketOrder(Symbol, Adet, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						LastOrderSide.Obj = Side.All;
						position = 0;
						Debug("Alış emri gönderildi.[ " + Adet + " adet ]");
					}
				}
			}

		}


		// Gerekli - Açığa satış		
		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

		[Parameter(yon.Farketmez)]
		public yon HangiIslemleBaslasin;

		public enum yon
		{
			Alis, Satis, Farketmez
		}



		public void FX_Alis()
		{


			if (LastOrderSide.Obj != Side.Buy)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					SendMarketOrder(Symbol, Adet, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						SendMarketOrder(Symbol, Adet, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

					}else
					{
						SendMarketOrder(Symbol, Adet, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
					}
				}

				Debug("Alış emri gönderildi.[ " + Adet + " adet ]");
				LastOrderSide.Obj = Side.Buy;
				LastOrderSideForShort.Obj = Side.Buy;

			}
		}

		public void FX_Satis()
		{


			if (LastOrderSide.Obj != Side.Sell)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					SendMarketOrder(Symbol, Adet, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						SendMarketOrder(Symbol, Adet, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

					}else
					{
						SendMarketOrder(Symbol, Adet, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
					}
				}

				Debug("Satış emri gönderildi.[ " + Adet + " adet ]");
				LastOrderSide.Obj = Side.Sell;
				LastOrderSideForShort.Obj = Side.Sell;

			}
		}
		// #Gerekli - Açığa satış	


		public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
		{
			if (!sOrder.EnableOrderSending)
			{
				if (sOrder.SyntheticAlgoOrderType == SyntheticAlgoOrderType.TakeProfit)
				{
					TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, izSurenZararDurdur);
				}
			}

			else if (sOrder.IsTriggered)
			{
				position = 0;
				LastOrderSide.Obj = Side.All;
				Debug("Sentetik emir tetiklendi");

				Adet = Quantity;

			}
		}


		public override void OnOrderUpdate(IOrder order)
		{

			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				Debug(" Emir Gerçekleşti.");
				BaslangictaVarMi = false;

				var pozisyonReal = GetRealPositions();
				var Quantity = pozisyonReal.ContainsKey(Symbol) ? pozisyonReal[Symbol].QtyAvailable:0;


				Debug("İşlem yapılabilir miktar : " + Quantity);

				if (position == 1 || position == -1)
				{
					StopLoss(Symbol, SyntheticOrderPriceType.Percent, ZararDurdur);
					TakeProfit(Symbol, SyntheticOrderPriceType.Percent, KarAl, false);
				}

			}

		}

	}
}

 

Algoritmik Trading kategorisinde (72 puan) tarafından
tarafından yeniden gösterildi | 148 kez görüntülendi

Bu soruya cevap vermek için lütfen giriş yapınız veya kayıt olunuz.

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.



7,637 soru
7,640 cevap
4,448 yorum
10,983 kullanıcı