Merhaba,
Daha iyi anlamanız için stratejiye açıklama satırları ekledim ve matriks kodundaki değişkenlerin aynısını kullandım.
Aşağıdaki kodu inceleyebilirsiniz.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using System.Windows.Media;
using Matriks.Engines;
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 Ornek : MatriksAlgo
{
// a:=RSI(C,1) ; b:=MOV(a,3,E); cc:=MOV(a,4,E); d:=MOV(a,5,E); e1:=MOV(a,30,E);
// y1:=LLV(L,3); y3:=Ref(LLV(L,1),-1); yy:= if(y1>Ref(y1,-1),y3,Prev); yyy:= if(C>yy,1,-1);
// al:=MOV(DI(),1,WW); all:=MOV(al,5,WW); aLLL:= if(al>all,1,-1);
// a1:= if(a>e1 ,1,-1); b1:= if(b>e1,1,-1); c1:= if(cc>e1,1,-1); d1:= if(d>e1,1,-1);
// aa:= a1+ b1+ c1+d1+yyy+aLLL;
// -------------------------------------------------------------------------------------------
// 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(5)]
public decimal BuyOrderQuantity;
[Parameter(5)]
public decimal SellOrderQuantity;
// Parameter ile strateji çalıştırılırken,backtest ve bactest optimizasyonunda parametre almak için kullanılır
// matriksteki OPT1 gibi
[Parameter(123456)]
public int StratejiCalistirilirkenParametreAlma;
// indikator tanımları. - Araç kutusundan indikatörlere çift tıklayarak stratejiye indikatör eklenir
RSI a;
MOV b, c, d, e;
MOV al, all;
DI di;
/// <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()
{
// a:=RSI(C,1) ;
a = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 1);
// b:=MOV(a,3,E);
b = MOVIndicator(a, 3, MovMethod.Exponential);
// cc:=MOV(a,4,E);
c = MOVIndicator(a, 4, MovMethod.Exponential);
// d:=MOV(a,5,E);
d = MOVIndicator(a, 5, MovMethod.Exponential);
// e:=MOV(a,30,E);
e = MOVIndicator(a, 30, MovMethod.Exponential);
// al:=MOV(DI(),1,WW);
al = MOVIndicator(di, 1, MovMethod.WW);
// all:=MOV(al,5,WW);
all=MOVIndicator(al, 5, MovMethod.WW);
di = DIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);
AddSymbol(Symbol, SymbolPeriod);
// 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);
}
/// <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>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
public override void OnTimer()
{
}
/// <summary>
/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
/// </summary>
/// <param name="newsId">Gelen haberin id'si</param>
/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
{
}
// LLV() fonksiyonundan dönen değerlerini dataseti olarak tutup REF(LLV(),-1) mantığıyla ulaşmak için
Dictionary<int, decimal> _llv3 = new Dictionary<int, decimal>();
Dictionary<int, decimal> _llv1 = new Dictionary<int, decimal>();
decimal y1, y3, yy, yyy, Prev,alll;
decimal ai, bi, ci, d1;
/// <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 barDataModel = GetBarData();
var Index = barData.BarDataIndex;
var CurrentClose = barData.BarData.Close;
_llv1[Index] = LowestLow(barDataModel, OHLCType.Low, 1);
_llv3[Index] = LowestLow(barDataModel, OHLCType.Low, 3);
// y1:=LLV(L,3);
y1 = LowestLow(barDataModel, OHLCType.Low, 3);
// y3:=Ref(LLV(L,1),-1);
y3 = _llv1[Index -1];
// yy:= if(y1>Ref(y1,-1),y3,Prev);
if (y1>_llv3[Index -1])
yy = y3;
yy = Prev;
// yyy:= if(C>yy,1,-1);
if (CurrentClose>yy)
yyy = 1;
yyy = -1;
// aLLL:= if(al>all,1,-1);
if(al.CurrentValue>all.CurrentValue)
alll=1;
alll=-1;
//a1:= if(a>e1 ,1,-1);
if(a>e)
ai=1;
ai=-1;
// b1:= if(b>e1,1,-1);
if(b>e)
bi=1;
bi=-1;
// c1:= if(cc>e1,1,-1);
if(c>e)
ci=1;
ci=-1;
// d1:= if(d>e1,1,-1);
if(d>e)
d1=1;
d1=-1;
//aa:= a1+ b1+ c1+d1+yyy+aLLL;
Prev=ai+bi+ci+d1+yyy+alll;
// if (Prev>=4)
// {
// SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
// Debug("Alış emri verildi.");
// }
// if (Prev<=2)
// {
// SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
// Debug("Satış emri verildi.");
// }
}
/// <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)
{
}
}
}
}