Kıvanç Özbilgiç'in hazırladığı PmR3 indikatörünün kullanıldığı bir stratejidir. Alım/Satım sinyalleri Cross Fonksiyonu kullanılarak elde edilir. Strateji LONG/SHORT pozisyon alabilmektedir. Kalıcı sinyal ve sıralı emir ile çalışmaktadır. AçığaSatısYapılsın seçildiği durumda ilk emir parametrelerde belirtilen miktarda, daha sonraki emirler ise ilk emrin 2 katı olarak gönderilir. Böylece pozisyon 1/0 şeklinde değil, 1/-1 şeklinde alınabilmektedir (LONG/NEUTRAL yerine LONG/SHORT). OnOrderUpdate fonksiyonu ile Algo içerisinde gerçek zamanlı pozisyon takibi yapılmaktadır. AcigaSatisYapilsin kutusu işaretlenmediği taktirde açığa satış yapılmayacaktır ve emirler ALIŞ ile başlamak şartı ile sıralı gönderilecektir. Bu durumda Loglar sekmesine: "Emir sinyali geldi fakat emirlerin sıralı gitmesi seçeneği aktif olduğundan emir gönderilmedi" bildirimi yansıtılabılır. Bu sıralı gönderim bildirimi olup, hata değildir. AcigaSatisYapilsin işaretlendiği durumda ise emirler yine sıralı gönderilecektir, fakat strateji ilk emir olarak SATIŞ emri gönderebilecektir.
using Matriks.Indicators;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using System;
//*******************************************************ACIKLAMA*******************************************************//
//Kıvanç Özbilgiç'in hazirladigi PmR3 indikatorunun kullanildigi bir stratejidir. Alim/Satim sinyalleri Cross Fonksiyonu
//kullanilarak elde edilir. Strateji LONG/SHORT pozisyon alabilmektedir. Kalici sinyal ve sirali emir ile calismaktadir.
//AcigaSatisYapilsin secildigi durumda ilk emir parametrelerde belirtilen miktarda, daha sonraki emirler ise ilk emrin
//2 kati olarak gonderilir. Boylece pozisyon 1/0 seklinde degil, 1/-1 seklinde alinabilmektedir (LONG/NEUTRAL yerine LONG/SHORT).
//OnOrderUpdate fonksiyonu ile Algo icerisinde gercek zamanli pozisyon takibi yapilmaktadir. AcigaSatisYapilsin kutusu
//isaretlenmedigi taktirde aciga satis yapilmayacaktir ve emirler ALIS ile baslamak sarti ile sirali gonderilecektir.
//Bu durumda Loglar sekmesine: Emir sinyali geldi fakat emirlerin sıralı gitmesi seçeneği aktif olduğundan emir gönderilmedi"
//bildirimi yansitilabilir. Bu sirali gonderim bildirimi olup, hata degildir. AcigaSatisYapilsin isaretlendigi durumda
//ise emirler yine sirali gonderilecektir, fakat strateji ilk emir olarak SATIS emri gonderebilecektir.
namespace Matriks.Lean.Algotrader
{
public class PmR3_Stratejisi2 : 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("GARAN")]
public string Symbol;
[Parameter(SymbolPeriod.Day)]
public SymbolPeriod SymbolPeriod;
[Parameter(10)]
public decimal BuyOrderQuantity;
[Parameter(10)]
public decimal SellOrderQuantity;
[Parameter(2)]
public decimal Coeff;
[Parameter(8)]
public int MovPeriod;
[Parameter(10)]
public int PeriodS;
[Parameter(14)]
public int PeriodR;
[Parameter(0.7)]
public decimal TillsonFactor;
[Parameter(false)]
public bool AcigaSatisYapilsin;
PmR3 pmR3;
int FirstRun = 0;
int realPosition = 0;
/// <summary>
/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır.
/// </summary>
public override void OnInit()
{
pmR3 = PmR3Indicator(Symbol, SymbolPeriod, Coeff, MovPeriod, PeriodS, PeriodR, TillsonFactor);
AddSymbol(Symbol, SymbolPeriod);
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(true, AcigaSatisYapilsin);
}
/// <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(BarDataCurrentValues barDataCurrentValues)
{
var pmax = Math.Round(Ref(pmR3, 0), 4);
var till = Math.Round(Ref(pmR3.PmR3Tillson, 0), 4);
Debug("***********************************************");
Debug("PmR3 Pmax = " + pmax);
Debug("PmR3 Till = " + till);
if (CrossAbove(pmR3.PmR3Tillson, pmR3))
{
if (FirstRun == 0 || !AcigaSatisYapilsin)
{
SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
Debug("Alış emri gonderildi.");
FirstRun = 1;
}
else
{
SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy));
Debug("Alış emri gonderildi.");
}
}
if (CrossBelow(pmR3.PmR3Tillson, pmR3))
{
if (FirstRun == 0 || !AcigaSatisYapilsin)
{
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Satış emri gonderildi.");
FirstRun = 1;
}
else
{
SendMarketOrder(Symbol, SellOrderQuantity * 2, (OrderSide.Sell));
Debug("Satış emri gonderildi.");
}
}
}
/// <summary>
/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="order">Emrin son durumu</param>
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 (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
var positionChange = order.OrderQty;
realPosition -= (int)positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realPosition);
}
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}