Merhaba operator,
stratejinizi yazmayı bitirdim buyrun.
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 Operator : 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.Min30)]
public SymbolPeriod SymbolPeriod;
ParabolicSAR parabolicSar;
[Parameter(0.02)]
public decimal pSar1;
[Parameter(0.2)]
public decimal pSarMax;
MACD macd;
[Parameter(40)]
public int macDLongPeriod;
[Parameter(20)]
public int macDShortPeriod;
[Parameter(6)]
public int macDTriggerPeriod;
RSI rsi;
[Parameter(50)]
public int rsiBuyLevel;
[Parameter(85)]
public int rsiBuyLevelMax;
[Parameter(0)]
public int rsiSellLevel;
[Parameter(70)]
public int rsiSellLevelMax;
[Parameter(1000)]
public decimal bakiye;
[Parameter(0.001)]
public decimal komisyon;
[Parameter(false)]
public bool aldikMi;
[Parameter(0)]
public int elimizdekiSenetMiktari;
public bool macDCalistir = false;
/// <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()
{
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);
macd = MACDIndicator(Symbol, SymbolPeriod, OHLCType.Close, macDLongPeriod, macDShortPeriod, macDTriggerPeriod);
parabolicSar = ParabolicSARIndicator(Symbol, SymbolPeriod, pSar1, pSarMax);
AddSymbol(Symbol, SymbolPeriod);
//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);
WorkWithPermanentSignal(true);
}
/// <summary>
/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
/// </summary>
public override void OnInitComplated()
{
}
/// <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 bardata = GetBarData();
var close = Ref(bardata, OHLCType.Close, 0);
var open = Ref(bardata, OHLCType.Open, 0);
bool rsiOkeyBuy = false;
if (Ref(rsi, 0) >rsiBuyLevel && Ref(rsi, 0) <rsiBuyLevelMax)
{
rsiOkeyBuy = true;
}
bool rsiOkeySell = false;
if (Ref(rsi, 0) >rsiSellLevel && Ref(rsi, 0) <rsiSellLevelMax)
{
rsiOkeySell = true;
}
bool macDbuyOkey = false;
bool macDsellOkey = false;
if (Ref(macd.MacdTrigger, -1) > Ref(macd.Macd, -1) && Ref(macd.MacdTrigger, 0) < Ref(macd.Macd, 0))
{
macDCalistir = true;
}else if (Ref(macd.MacdTrigger, -1) < Ref(macd.Macd, -1) && Ref(macd.MacdTrigger, 0) > Ref(macd.Macd, 0))
{
macDCalistir = true;
}
if(macDCalistir){
if(Ref(macd.MacdTrigger, 0) > Ref(macd.Macd, 0)){
macDsellOkey = true;
}
if(Ref(macd.MacdTrigger, 0) < Ref(macd.Macd, 0)){
macDbuyOkey = true;
}
}
bool paraSarOkeyBuy = false;
if (Ref(parabolicSar, 0) < close)
{
paraSarOkeyBuy = true;
}
if (rsiOkeyBuy && macDbuyOkey && paraSarOkeyBuy && !aldikMi)
{
bakiye -= bakiye * komisyon;
int senetMiktari2 = (int)((bakiye) / close) -1;
bakiye -= senetMiktari2 * close;
SendMarketOrder(Symbol, senetMiktari2, OrderSide.Buy, ChartIcon.Buy);
elimizdekiSenetMiktari = senetMiktari2;
Debug("--------------------------------------");
Debug("ALIŞ EMRİ GÖNDERİLDİ ! " + close);
Debug("Senet Adet =" + elimizdekiSenetMiktari);
aldikMi = true;
}else if (!paraSarOkeyBuy && aldikMi && macDsellOkey && rsiOkeySell)
{
aldikMi = false;
bakiye -= ((decimal) elimizdekiSenetMiktari * close) * komisyon;
SendMarketOrder(Symbol, elimizdekiSenetMiktari, OrderSide.Sell, ChartIcon.Sell);
Debug("SATIŞ EMRİ GÖNDERİLDİ !" + close);
bakiye += ((decimal) elimizdekiSenetMiktari) * close;
elimizdekiSenetMiktari = 0;
Debug("bakiye = " + bakiye);
}
}
/// <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)
{
}
}
}
}