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);
				}

			}

		}

	}
}