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