Merhabalar,
Maalesef direkt olarak bir yolu yoktur.
Her bir method için kullanmak istediğiniz explorer koşulundaki parametreleri sistem içerisine eklemeniz gerekmektedir.
Örneğin, hazır explorer listesinden Golden Cross' stratejiye çevirmek istiyorsunuz.
Bunu yapabilmek için iki yol kullanabilirsiniz.
- Bunlardan birincisi explorer içerisinde hangi indikatörün kullanıldığını bilip (basit formüller için) algoritma sihirbazından hazırlayabilirsiniz.
Bu yöntem için lütfen aşağıdaki linki inceleyiniz.
https://destek.matriksdata.com/?qa=4438/iq-algoritma-sihirbaz%C4%B1n%C4%B1-nas%C4%B1l-kullan%C4%B1r%C4%B1z
- Bir diğeri ise IQ Algo--> Yeni Strateji Oluştur diyebilirsiniz.
Şablon ve Şablon Örnekleri kısmından Yeni seçeneğini seçip stratejinize isim verebilirsiniz.
Bu işlemleri yaptıktan sonra önünüze şablon bir yapı gelecektir.
Bu şablon yapıya explorer taramasında kullanılan parametreleri kopyala yapıştır olarak eklemeniz gerekmektedir.
Golden Cross iki hareketli ortalamanın kesişimini baz alan bir taramadır.
Bu sebeple sistem içinde bulunan hareketli ortalamanın parametrelerini kopyalayıp isimlendirdiğim stratejiye yapıştırıyorum.
Sonrasında aynı işlemi OnInit() methodu içerisinde bulunan mov tanımlamaları içeren iki satırı da kopyalayıp stratejimin OnInit() methodu içerisine ekliyorum.
Son olarak ise OnExplorer() methodu içerisinde bulunan if satırını stratejimdeki OnDataUpdate() methoduna ekliyorum.
Bütün bu işlemler bittikten sonra stratejiniz için bir koşul daha oluşturmanız gerekmektedir.
Örneğin Golden Cross taraması iki hareketli ortalama için elde edilen bir AL koşuludur.
Bir stratejinin oluşabilmesi için ise AL ile beraber SAT koşulunun da olması gerekir, bu sebeple bir tane de SAT koşulu oluşturmamız gerekmektedir.
Hareketli ortalamanın yukarı kesmesi AL koşulu olarak tanımlanıyorsa, aşağı kesmesi ise SAT koşulu olarak tanımlanabilir.
OnDataUpdate methodunu aşağıdaki gibi tamamlayabilirsiniz.
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
if (CrossAbove(mov, mov2))
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
}
if (CrossBelow(mov, mov2))
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
}
}
Tamamladıktan sonra yapmanız gereken son iki işlem kaldı.
Bunlardan ilki SendMarket içerisinde tanımladığınız BuyOrderQuantitiy ve SellOrderQuantity değişkenleridir. Bu değişkenleri indikatör parametreleri eklediğiniz yerde tanıtmanız gerekmektedir.
[Parameter(5)]
public decimal BuyOrderQuantity;
[Parameter(5)]
public decimal SellOrderQuantity;
Bunları tanıttıktan sonra ise OnInit() methodu içerisine aşağıdaki satırı eklemeniz gerekmektedir.
WorkWithPermanentSignal(true);
Aşağıda startejiye çevrilmiş hali mevcuttur.
Dilerseniz inceleyiniz.
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 deneme1 : 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.Min5)]
public SymbolPeriod SymbolPeriod;
[Parameter(5)]
public decimal BuyOrderQuantity;
[Parameter(5)]
public decimal SellOrderQuantity;
[Parameter(50)]
public int MovPeriod1;
[Parameter(200)]
public int MovPeriod2;
MOV mov;
MOV mov2;
/// <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()
{
AddSymbol(Symbol, SymbolPeriod);
mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod1, MovMethod.Simple);
mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Simple);
//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 OnInitCompleted()
{
}
/// <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)
{
if (CrossAbove(mov, mov2))
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
}
if (CrossBelow(mov, mov2))
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
}
}
/// <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)
{
}
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}
İyi çalışmalar.