Merhabalar,
Dilerseniz aşağıdaki yapıyı inceleyiniz.
***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
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;
//===========================================ACIKLAMA=======================================//
// Bu statejide TMA VE HullMA indikatörleri birlikte kullanılmıştır. //
// Eğer grafikte fiyat çubukları HullMA bandını yukarı kırarsa ve o anki hullMA değeri, //
// TMA değerinin altındaysa al emri gönderilecek. //
// Eğer grafikte fiyat çubukları HullMA bandını aşağı kırarsa ve o anki hullMA değeri, //
// TMA değerinin üstündeyse sat emri gönderilecek. //
// Emirler piyasa fiyatından gönderilecektir. //
// Emir gönderimi ile birlikte strateji raporunda Debug sekmesine "Alış emri gönderildi." //
// ve "Satış emri gönderildi." ifadesi yazdırılmaktadır. //
namespace Matriks.Lean.Algotrader
{//strateji ismini burada deklare ediyoruz. Dosyada ki isimle stratejide yazılan isim tamamen aynı olmalıdır. (küçük büyük harf duyarlı)
public class projektll : MatriksAlgo
{
//canlı, backtest ve backtest optimization kısımlarında değiştirilebilir olması istenilen parametreler bu bölümde yazılır
// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
[SymbolParameter("XU100")]
public string Symbol;//Sembol ismi
[Parameter(SymbolPeriod.Day)]
public SymbolPeriod SymbolPeriod;//Stratejiyi çalıştırmak istediğimiz bar periyodu
[Parameter(22)]
public int HullMAPeriod;//Moving average periyodu için kullanacağımız parametre
[Parameter(12)]
public int TmaPeriod;//RSI periyodu için kullanacağımız parametre
[Parameter(9)]
public int RsiPeriod1;
[Parameter(100)]
public decimal BuyOrderQuantity; //alım miktarı için kullanacağımız parametre
[Parameter(100)]
public decimal SellOrderQuantity; //satım miktarı için kullanacağımız parametre
TMA tma;//TMA indikatörü türünde tma isminde bir obje tanımlıyoruz
HullMA hullMA;//HullMA indikatörü türünde hullMA isminde bir obje tanımlıyoruz
RSI rsi;
public override void OnInit()
{
//tanımladığımız objelere indikatör tanımlarını ve gerekli değerleri atıyoruz
hullMA = HullMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, HullMAPeriod);
tma = TMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, TmaPeriod);
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, RsiPeriod1);
//Sembol ve periyoduna kayıt
AddSymbol(Symbol, SymbolPeriod);
// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirliyoruz.
//true değer, algoritmanın sadece yeni bar açılışlarında çalışmasını sağlar, bu
//fonksiyonu çağırmazsak veya false olarak belirlersek her işlem olduğunda algoritma tetiklenecektir.
WorkWithPermanentSignal(true);
//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);
}
//Kayıt olunan sembol veya indikatörler güncellendikçe bu fonksiyon tetiklenir.
//Dolayısıyla asıl al/sat stratejisini yazacağımız bölümdür
public override void OnDataUpdate(BarDataEventArgs barData)
{
var barDataModel = GetBarData();
//Bu koşul alım emri içindir. Eğer grafikte fiyat çubukları hullMA bandını yukarı kırarsa ve
//o anki hullMA değeri, tma değerinin altındaysa al emri gönderilecek.
if (CrossAbove(barDataModel, hullMA, OHLCType.Close, 0) && hullMA.CurrentValue<tma.CurrentValue)
{
//Parametrelerde belirlenen sembolden, belirlenen miktarda, piyasa fiyatından alış emri gönderir
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
//bar kapanışını debug penceresine basar
Debug("Close = " + barData.BarData.Close);
//HullMA değerini debug penceresine basar
Debug("HullMA = " + hullMA.CurrentValue);
//TMA değerini debug penceresine basar
Debug("TMA = " + tma.CurrentValue);
//"" içerisinde bulunan ifadeyi debug penceresine basar
Debug("Alış Emri Gönderildi");
}
//Bu koşul satım emri içindir. Eğer grafikte fiyat çubukları hullMA bandını aşağı kırarsa ve
//o anki hullMA değeri, tma değerinin üstündeyse sat emri gönderilecek.
if (CrossBelow(rsi, 70m, 0) || CrossAbove(rsi, 82m, 0))
{
//Parametrelerde belirlenen sembolden, belirlenen miktarda, piyasa fiyatından satış emri gönderir
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
//bar kapanışını debug penceresine basar
Debug("Close = " + barData.BarData.Close);
//HullMA değerini debug penceresine basar
Debug("HullMA = " + hullMA.CurrentValue);
//TMA değerini debug penceresine basar
Debug("TMA = " + tma.CurrentValue);
//"" içerisinde bulunan ifadeyi debug penceresine basar
Debug("Satış Emri Gönderildi");
}
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}
İyi çalışmalar.