Merhaba, Cevabınız için teşekkürler. Daha fazla indikatör eklemeden, sadece RSI için denemek istedim. Aslında hangi indikatör için denediğimin bir önemi yok fakat Backtest'te 01 kasımdan sonra 15 dk'lıkta çalıştırdığımda yine gerçekleşen fiyat kontrolünü yapmıyor. Ya aldığım bar fiyatlarında problem var ya da kontrolEt fonksiyonunun içine girmiyor. Kontrol edebilir misiniz. Bir de trace alabileceğimiz bir yer var mı, kod akışını görmek için.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using System.Windows.Media;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
namespace Matriks.Lean.Algotrader
{
public class TTRAK_RSI3 : 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("TTRAK")]
public string Symbol;
[Parameter(SymbolPeriod.Min15)]
public SymbolPeriod SymbolPeriod;
[Parameter(50)]
public int BuyOrderQuantity;
[Parameter(50)]
public int SellOrderQuantity;
[Parameter(14)]
public int Period;
[Parameter(65)]
public int UpLevel;
[Parameter(35)]
public int DownLevel;
RSI rsi;
/*
public int MovPeriod;
[Parameter(3)]
public decimal Coefficient;
[Parameter(MovMethod.E)]
public MovMethod MovMethod;*/
int realposition = 0;
/*PMaxIndicator pmax;*/
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
WorkWithPermanentSignal(true);
//Eger 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);
//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
//SetTimerInterval(3);
//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>
/// 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)
{
var sFiyat = barData.BarData.Close;
if (CrossAbove(rsi, DownLevel))
{
SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
Debug("Alış emri gonderildi.");
if (!LiveMode)
{
_gerceklesenFiyat = sFiyat;
}
}
if (CrossBelow(rsi, UpLevel) && kontrolEt(sFiyat) >= 0)
{
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Satış emri gonderildi.");
if (!LiveMode)
{
_gerceklesenFiyat = 0;
}
}
}
decimal _gerceklesenFiyat = 0;
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;
if (LiveMode)
{
_gerceklesenFiyat = order.LastPx;
}
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
var positionChange = order.OrderQty;
realposition -= (int) positionChange;
if (LiveMode)
{
_gerceklesenFiyat = 0;
}
}
}
public decimal kontrolEt(decimal sonFiyat)
{
if (_gerceklesenFiyat != 0)
{
decimal oran = (sonFiyat - _gerceklesenFiyat) / _gerceklesenFiyat * 100;
return oran;
}else
{
return 0;
}
}
}
}