Open ve Close icin degerleriniz yanlisti. OnDataUpdate() her yeni bar ACILISINDA data geldigi anda tetiklenmektedir. Open ve close alirken
barDataCurrentValues.LastUpdate.Open;
seklinde alirsaniz yeni acilan barin acilis ve kapanis bilgilerini verir, bunlar da birbirine esit olur bar acildiginda, istediginiz sonuca ulasamazsiniz. Bar acildiginda update geldiginden bir onceki bara bakmaniz gerekir. Bunu da barData.Open[barDataCurrentValues.LastUpdate.BarDataIndex - 1]; seklinde yapabilirsiniz - duzeltildi.
Ayni sekilde canli strateji calistirdiginizda
var ClosePrev2 = Ref(barData, OHLCType.Close, 2);
yeni acilan bardan 3 onceki barin kapanisini vermektedir. Bundan bilginiz var mi emin olamadim, bu sekilde biraktim.
Son olarak backtest'de OnOrderUpdate ile gerceklesen emir fiyati saglikli gelmedigi icin (siz de anladigim kadariyla backtest yapiyorsunuz) alis ve satis emirlerinin kapanis fiyatindan gerceklestigi farz edilmistir.
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 SonBar : MatriksAlgo
{
[SymbolParameter("XBT_USD_BMEX")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
[Parameter(100)]
public decimal Quantity;
[Parameter(0.5)]
public decimal AlisSartiYuzde;
[Parameter(0.5)]
public decimal SatisSartiYuzde;
decimal LastBuyOrderPrice = 0;
decimal LastSellOrderPrice = 0;
int realposition = 0;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
SendOrderSequential(false);
WorkWithPermanentSignal(true);
}
public override void OnInitComplated()
{
}
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
var barData = GetBarData();
var Open = barData.Open[barDataCurrentValues.LastUpdate.BarDataIndex - 1];
var Close = barData.Close[barDataCurrentValues.LastUpdate.BarDataIndex - 1];
var ClosePrev2 = Ref(barData, OHLCType.Close, 2);
var alisnoktasi = LastSellOrderPrice*(1+AlisSartiYuzde/100);
var satisnoktasi = LastBuyOrderPrice*(1-SatisSartiYuzde/100);
Debug("******************************************");
Debug($"Open = {Open}, Close = {Close}, PrevClose = {ClosePrev2}");
Debug($"alisnoktasi = {alisnoktasi}, satisnoktasi = {satisnoktasi}, Pozisyon = {realposition}");
if (Close > Open && Close < ClosePrev2 && realposition == 0)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
Debug("Alim kosulu olustu, alış emri gönderildi.");
}
if(Close > alisnoktasi && realposition == 0 && alisnoktasi!=0)
{
Debug($"Close @ {Close} > {alisnoktasi} alisnoktasi ALIM kosulu olustu.");
SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
Debug("Alış emri gönderildi.");
}
if (Close < Open && Close > ClosePrev2 && realposition == 1)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
Debug("Satış kosulu olustu, satış emri gönderildi.");
}
if(Close < satisnoktasi && realposition == 1 && satisnoktasi!=0)
{
Debug($"Close @ {Close} < {satisnoktasi} satisnoktasi SATIS kosulu olustu.");
SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
Debug("Satış emri gönderildi.");
}
}
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
LastBuyOrderPrice = order.Price;
Debug("Alis emri gerceklesti @ " + LastBuyOrderPrice);
realposition++;
Debug("OnorderUpdate: IN LONG POSITION. Position = " + realposition);
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
LastSellOrderPrice = order.Price;
Debug("Satis emri gerceklesti @ " + LastSellOrderPrice);
realposition--;
Debug("OnorderUpdate: SOLD POSITION. Position = " + realposition);
}
}
}
}