BİR STRATEJİYE STOP EKLEMEK
Merhaba,
Var olan bir stratejiye stop eklemek için, ilk olarak aşağıdaki stop komutlarını bilmemiz gerekir.
// %5 zarar durdur
// StopLoss(Symbol, SyntheticOrderPriceType.Percent, 5);
// %5 kar al
// TakeProfit(Symbol, SyntheticOrderPriceType.Percent, 5);
// %5 izsürenstop
TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, 5);
Yüzde olarak değil de, miktar olarak tanımlamak istersek,
SyntheticOrderPriceType.Percent
Yerine,
SyntheticOrderPriceType.PricePoint
Gelmelidir.
Mesela,
StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, 0.20);
Gibi. Tabii bu durumda, yazacağımız rakam da puan olmalıdır. Yukarıdaki ifadede, stop seviyesi 0.2 puandır.
İpucu: Normal şartlar altında, stop seviyelerinin yüzde olarak uygulanması, genelde kullanmak açısından daha doğrudur.
Bilgi: Program içinde, hazır stratejilerden SMA_Bitmex_TPSL stratejisi stop uygulaması içermektedir.
**
Stop ifadesinin genel şablonu şu şekildedir:
TakeProfit( string symbol, SyntheticOrderPriceType SyntheticOrderPriceType, decimal stopLevel )
Genellikle şöyle ifade edilir:
StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_Yuzdesi);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, 1);
Yukarıda 2. Satırda olduğu gibi, sabit bir rakam yazabiliriz. Bu durumda, strateji bu rakamı baz alarak çalışacak, çalıştırma esnasında bize bir şey sormayacaktır.
Bu, normalde tercih edeceğimiz bir durum olmayacaktır.
Bu sebeple, öncesinde bir değişken tanımlamayı tercih ederiz.
Public class bölümünde şu şekilde değişken tanımlayabiliriz:
//Burdaki değer ile yüzdeli stoploss kurulur.
[Parameter(1)]
public decimal Zarar_Durdur_Yuzdesi;
Yukarıdaki tanımlamayı yapıp, daha sonra aşağıdaki kod satırını:
StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_Yuzdesi);
AL ya da, Açığa Sat emir gönderim satırının altına eklemeliyiz.
**
Örnek:
Kodun içinde değişken tanımlama kısmına geliyorum.
Son değişkeni kopyalayıp, aynısını altına yapıştırıyorum.

Sonra, eklediğim değişkende, hedefime uygun olarak düzenlemeyi yapıyorum.
Rakamların karışmaması için, 2 rakamını 1.5 yaptım. Değişken olarak tanımladığım için backtest veya çalıştırma aşamasında zaten göreceğim.
İsmini de yukarıda göreceğiniz şekilde değiştirdim.
Sonra, Alış satırının altına stop emir kodunu ekliyorum.
Debug fonksiyonun işlevi ayrıdır. Kendimizi bilgilendirmek için kullanırız. Ayrıca anlatılacaktır.
Dilersek, stoploss kodumuzun altına da, debug ekleyerek kendimize çıktılar kısmında, bilgilendirme alabiliriz.
Önemli Bir Detay: Yukarıdaki resimde, emir gönderim satırı içinde sembol tanımının Synbol olduğunu görüyoruz. Bazen orada, farklı olarak Symbol1 ya da daha farklı bir tanım olabilir.
Bu durumda, bizim de, stop komutumuzun içinde yer alan Symbol ifadesini aynı şekilde değiştirmemiz gerekir.
Değiştirmez isek, kodun içeriğine göre, ya hata mesajı alırız, bunu fark edip düzeltmek kolay olacaktır.
Ya da yanlış bir sembole emir gönderilmesine sebep olabiliriz. Dikkat edelim lütfen.
İşlem tamamlandı. Kodu derle yapabiliriz.
*
Backtest yapmayı denersek, karşımıza çıkacak pencerede ilgili stop seçeneğini de görebiliriz.
Benzer biçimde, diğer stopları da ekleyebiliriz.
DİKKAT: Stop ifadesinin AL koşulu altına eklenmesi, sadece AL pozisyonuna uygulanmasını garanti etmez. Oraya eklememiz, görsel / işlevsel bir kolaylık içindir.
Esasen, stop ifadesi, pozisyon açtığını var saydığı her emre uygulanır.
Bu sebeple, stopların doğru çalışması için: Stratejinin AL ile başlaması ve emirlerin sıralı gönderilmesi gerekir.
AL ile başlatmadığımız strateji SAT emrini açığa sat olarak algılar. Ve stop buna göre devreye girer.
Sıralı gönder seçmediğimiz takdirde de, stop gerçekleşmesine rağmen SAT emrinin tekrar gönderilmesi gibi sorunlarla kaşılaşabiliriz.
Eğer daha serbest olarak kullanmak istiyorsanız, kodun içine ayrıca pozisyon kontrolü vb. koymalıyız.
Bu konuda ayrıca bir çalışma yapacağız.
**
Dilersek, peş peşe Kar Al – Zarar Durdur ve İz süren stop emirleri de girebiliriz. Hangisi önce gerçekleşirse, o çalışacaktır.
Hayırlı kazançlar dileriz.


using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;
namespace Matriks.Lean.Algotrader
{
public class deneme2 : 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("MATIC_USDT_FBIN")]
public string Symbol1;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod1;
[Parameter(40)]
public int TottPeriod1;
[Parameter(1)]
public decimal TottOpt1;
[Parameter(0.001)]
public decimal TottTwinOttCoef1;
[Parameter(MovMethod.VAR)]
public MovMethod TottMovMethod1;
[Parameter(5)]
public decimal OrderQuantity1;
[Parameter(false)]
public bool IsReduceOnly1;
[Parameter(false)]
public bool IsReduceOnly2;
[Parameter(CryptoLeverageType.Isolated)]
public CryptoLeverageType LeverageType2;
[Parameter(false)]
public bool IsReduceOnly3;
[Parameter(1)]
public decimal Leverage3;
[Parameter(5)]
public decimal OrderQuantity4;
[Parameter(false)]
public bool IsReduceOnly4;
[Parameter(false)]
public bool IsReduceOnly5;
[Parameter(CryptoLeverageType.Isolated)]
public CryptoLeverageType LeverageType5;
[Parameter(false)]
public bool IsReduceOnly6;
[Parameter(1)]
public decimal Leverage6;
[Parameter(1.5)]
public decimal KarAlYüzdesi;
TOTT tott;
public override void OnInit()
{
tott = TOTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, TottPeriod1, TottOpt1, TottTwinOttCoef1, TottMovMethod1);
SendOrderSequential(true, Side.All);
WorkWithPermanentSignal(true);
//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
// SetTimerInterval(3600);
//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsSymbol(Symbol);
//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsKeyword("KAP");
}
/// <summary>
/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
/// </summary>
public override void OnInitCompleted()
{
}
/// <summary>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
public override void OnTimer()
{
}
/// <summary>
/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
/// </summary>
/// <param name="newsId">Gelen haberin id'si</param>
/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
{
}
/// <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)
{
if (CrossAbove(tott, tott, 0, 1))
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false, isReduceOnly : IsReduceOnly1);
SetLeverageType(Symbol1, LeverageType2);
SetLeverage(Symbol1, Leverage3);
TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, 5);
}
if (CrossBelow(tott, tott, 0, 2))
{
SendMarketOrder(Symbol1, OrderQuantity4, OrderSide.Sell, includeAfterSession:false, isReduceOnly : IsReduceOnly4);
SetLeverageType(Symbol1, LeverageType5);
SetLeverage(Symbol1, Leverage6);
TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, 5);
}
}
/// <summary>
/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="barData">Emrin son durumu</param>
public override void OnOrderUpdate(IOrder order)
{
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}