Kosul saglandigi anda islem yapmasini istiyorsaniz CrossAbove ve CrossBelow fonksiyonlarini kullanabilirsiniz. Bu fonksiyon CrossMov stratejisi dahil bir cok ornekte bulunmaktadir.
Eger relational operatorleri (>, <,...) kullanmaya devam etmek isterseniz (cogu durumda daha saglikli sonuc verebiliyor) o zaman sadece ilk emriniz icin bir kontrol koyabilir, stratejinin bundan sonraki emirlerde normal sekilde devam etmesini saglayabilirsiniz.
NOT: SendOrderSequential true set edilmistir. Eger emri bir al bir sat seklinde gonderilmesini istiyorsaniz bu true set edilir. Bu fonksiyon satırıni silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. Fakat bu durumda da pozisyon takibi yapmazsaniz strateji her barda islem yapacaktir. Pozisyon takibi ile ilgili bu forumda bilgi bulunmaktadir.
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 APollo : MatriksAlgo
{
[SymbolParameter("XBT_USD_BMEX")]
public string Symbol;
[Parameter(1)]
public decimal OrderQuantity;
int FirstRun = 0;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
SendOrderSequential(true);
WorkWithPermanentSignal(true);
}
public override void OnInitComplated()
{
}
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
var bardata = GetBarData();
//OnDataUpdate bar acilisinda yeni data geldigi anda calistigi icin eger Ref almazsak
//Open ve Close bar acilisinda her zaman esit oldugu icin stratejimiz calismayacaktir
//Bu yuzden asagida Ref alarak bir onceki bar'in kapanis ve acilisina bakmamiz gerekiyor
//(Bar acildigi anda mevcut barin acilis bilgisi mevcut fakat kapanis degeri bilinmemektedir)
var open = Ref(bardata, OHLCType.Open, 0);
var close = Ref(bardata, OHLCType.Close, 0);
var prevOpen = Ref(bardata, OHLCType.Open, 1);
var prevClose = Ref(bardata, OHLCType.Close, 1);
Debug($"Open = {open}, Close = {close}, FirstRun = {FirstRun}");
Debug($"Previous bar (open-1) = {prevOpen}, (close-1) = {prevClose}");
if (close > open)
{
if (FirstRun == 1)
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
Debug("Alış emri verildi.");
}
else if (FirstRun == 0 && prevClose < prevOpen) //2 onceki barda A<B ise ve bu barda A>B ise durum yeni olusmus
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
Debug("Alış emri verildi.");
FirstRun = 1;
}
else
{
Debug("Alis durumu olustu fakat strateji yeni calistirildigi icin gonderilmedi.");
}
}
if (close < open)
{
if (FirstRun == 1)
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
Debug("Satış emri verildi.");
}
else if (FirstRun == 0 && prevClose > prevOpen)
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
Debug("Satış emri verildi.");
FirstRun = 1;
}
else
{
Debug("Satis durumu olustu fakat strateji yeni calistirildigi icin gonderilmedi.");
}
}
}
}
}