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;
//===============================================ACIKLAMA===================================================//
// SMA indikatöründe, fiyat çubuklarınının SMA bandının üstüne kırdığı anda al, //
// altına kırdığı anda sat sinyali üretilir. Cross değil relational operator (<, >) kullanır //
// Emirler piyasa fiyatından gönderilir ve Emir gönderimi ile birlikte strateji raporunda //
// Debug sekmesine "Alış emri gönderildi ve "Satış emri gönderildi." ifadesi yazdırılmaktadır. //
// Normal SMA stratejisine ek olarak Kar al ve Zarar durdur fonksiyonlarinin kullanımı örneklendirilmiştir. //
namespace Matriks.Lean.Algotrader
{
public class sma_Bitmex_TPSL_Release : 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("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;
//Kar Al/Zarar Durdur Parametreleri
[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);
//sma200 = SMAIndicator(Symbol, SymbolPeriod.Day, OHLCType.Close, 200);
AddSymbol(Symbol, SymbolPeriod);
// 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(false);
}
/// <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)
{
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)
{
//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 (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");
}
}
}
}
}