Merhaba,
"Çalışma mantığı olarak; x hissesini 5,50 den aldığımızı düşünelim. OnDataUpdate içine stoploos fonkiyonu ile 5,30 için stop loss seviyesi belirledik. Her bar güncellendiğinde stoploss fonksiyonu çalışacak ve fiyat 5,30 ise tüm x hissesini satacak mı?
Bunun tam tersi durumda açığa satış yaptığımızda stoploss bu sefer alış mı yapacak?"
Evet dediginiz gibi ancak fiyat farki ya da yuzde fark olarak belirliyoruz, bu durumda pozisyona 5.50'den long girdiyseniz,
StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, 0.20); satirini yazdigimizda, 5.30'a geldiginde zarar durduracaktir.
TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, 0.25); 5.75'e geldiginde kar alacaktir.
Ornek kod olarak SMA_Bitmex_TPSL mevcuttur. Buraya da ekliyorum, sormak istediginiz varsa buraya yazabilirsiniz.
using System;
using System.Collections.Generic;
using System.Linq;
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
{
public class sma_Bitmex_TPSL_Release : MatriksAlgo
{
[SymbolParameter("XBT_USD_BMEX")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
[Parameter(100)]
public decimal BuyOrderQuantity;
[Parameter(100)]
public decimal SellOrderQuantity;
[Parameter(60)]
public int Period;
[Parameter(true)]
public bool Kar_AL;
[Parameter(10)]
public decimal Kar_AL_FiyatMiktari;
[Parameter(true)]
public bool Zarar_Durdur;
[Parameter(50)]
public decimal Zarar_Durdur_FiyatMiktari;
SMA sma;
SMA sma200;
ISyntheticOrderPrices TP, SL;
int FirstRun = 0;
int SystemPosition = 0;
int realposition = 0;
int OnOrderUpdate_Executed = 0;
public override void OnInit()
{
sma = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
AddSymbol(Symbol, SymbolPeriod);
WorkWithPermanentSignal(true);
SendOrderSequential(false);
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
var Close = barData.BarData.Close;
var Sma = Math.Round(sma.CurrentValue, 2);
Debug("==============================");
Debug("Close:" + Close);
Debug("Sma:" + Sma);
var barDataModel = GetBarData();
if (Close > Sma)
{
if (realposition == 0 && SystemPosition == 0)
{
SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
Debug("Alış emri verildi.");
SystemPosition = 1;
if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
Debug(TP + " ," + SL);
}
else if (realposition == -1 * SellOrderQuantity && SystemPosition == -1)
{
SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy));
Debug("Alış emri verildi.");
SystemPosition = 1;
TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
Debug(TP + " ," + SL);
}
}
if (Close < Sma)
{
if (realposition == 0 && SystemPosition == 0)
{
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Satış emri verildi.");
SystemPosition = -1;
if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
Debug(TP + " ," + SL);
}
else if (realposition == 1 * BuyOrderQuantity && SystemPosition == 1)
{
SendMarketOrder(Symbol, SellOrderQuantity * 2, (OrderSide.Sell));
Debug("Satış emri verildi.");
SystemPosition = -1;
if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
Debug(TP + " ," + SL);
}
}
}
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
var positionChange = order.OrderQty;
realposition += (int) positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
if (realposition == 0)
{
SystemPosition = 0;
Debug("Kar AL / Zarar Durdur tetiklendi");
}
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
var positionChange = order.OrderQty;
realposition -= (int) positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
if (realposition == 0)
{
SystemPosition = 0;
Debug("Kar AL / Zarar Durdur tetiklendi");
}
}
}
}
}