Ilk emir ne gelirse onunla baslamasi icin SendOrderSequential'a bir opsiyon daha ekledik. SendOrderSequential(true,true); seklinde yazdiginizda emirler hala sirali gidecektir fakat ilk emrin alis olmasi sarti olmayacaktir. Bu sekilde sirali emir gonderimini acik tutarak bi stratejiyi basit bir sekilde istedigimiz emirle baslamasi yonunde de degistirebiliriz. Asagida basit bir ornek paylasiyorum.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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 sendOrderSeq_YENI : 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.Min5)]
public SymbolPeriod SymbolPeriod;
[Parameter(1)]
public decimal OrderQuantity;
[Parameter(14)]
public int Period;
[Parameter(70)]
public int UpLevel;
[Parameter(30)]
public int DownLevel;
[Parameter(false)]
public bool SatislaBasla;
// indikator tanımları.
RSI rsi;
int firstRun = 1;
/// <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()
{
AddSymbol(Symbol, SymbolPeriod);
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
WorkWithPermanentSignal(true);
SendOrderSequential(true,true);
}
/// <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)
{
if (firstRun == 1)
{
if (CrossAbove(rsi, DownLevel) && !SatislaBasla)
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
firstRun = 0;
}
if (CrossBelow(rsi, UpLevel) && SatislaBasla)
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
firstRun = 0;
}
}
else
if (CrossAbove(rsi, DownLevel))
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
if (CrossBelow(rsi, UpLevel))
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
}
/// <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)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
}
}
}
}