Iyi gunler ornek kod asagidadir.
Istediginiz strateji/alarm icin aciklanmasi gereken bir cok alan var. Orn. Kademe degistiginde ne yapilacak? Stratejiyi zaman araligi (OnTimer) ile calistirdigimizda kademeye yuklu emir girildigini bulabilmek icin eski kademe degeri ne kadar sure takip edilecek?
Aslinda butun bu problemlerden dolayi, toplu kademe takibi daha mantikli gozukuyor. Bu teker teker kademe takibi kadar detayli olmaz tabi ama daha saglikli sonuc alinabilir.
Gonderdigim stratejide kademeyi OnTimer (zamanla calisan fonksiyon) icerisinde nasil takip edebileceginiz ve nasil alarm verdirebileceginize dair basit bir ornek var. Yukaridaki bahsettigim sorunlar onem teskil etmiyorsa bu ornegi cogaltarak/diger kademelere uygularayak devam edebilirsiniz.
Bu stratejiden devam etmek isterseniz, kademedeki fiyatin degismesinden dolayi olusan farktan dolayi gelen alarmi basit bir sekilde engelleyebiliriz. (eger kademedeki fiyat degistiyse alarm vermesi basit bir sekilde saglanabilir)
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;
namespace Matriks.Lean.Algotrader
{
public class DerinlikAlarm : 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(1)]
public int saniye;
[Parameter(10)]
public float yuzde;
//Stratejinin calisacagi saatler
[Parameter("09:45:00")]
public string BaslangicZaman;
[Parameter("18:00:00")]
public string BitisZaman;
public float Bo3_temp = 999999999;
//List<SessionTimeInfo> sessiontime;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod.Min);
AddSymbolMarketDepth(Symbol);
//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(false);
//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
SetTimerInterval(saniye);
}
public override void OnTimer()
{
TimeSpan starttime = TimeSpan.Parse(BaslangicZaman);
TimeSpan endtime = TimeSpan.Parse(BitisZaman);
TimeSpan now = DateTime.Now.TimeOfDay;
var barDataModel = GetBarData();
var depths = GetMarketDepth(Symbol);
var asktime = depths.AskRows[1].DateTime;
var bardatatime = barDataModel.Time;
float BO_size = (float) depths.AskRows[0].Size;
float BO1_size = (float) depths.AskRows[1].Size;
float BO2_size = (float) depths.AskRows[2].Size;
float BO3_size = (float) depths.AskRows[3].Size;
float BO4_size = (float) depths.AskRows[4].Size;
float BB_size = (float) depths.BidRows[0].Size;
float BB1_size = (float) depths.BidRows[1].Size;
float BB2_size = (float) depths.BidRows[2].Size;
float BB3_size = (float) depths.BidRows[3].Size;
float BB4_size = (float) depths.BidRows[4].Size;
float BO = (float) depths.AskRows[0].Price;
float BO1 = (float) depths.AskRows[1].Price;
float BB = (float) depths.BidRows[0].Price;
float BB1 = (float) depths.BidRows[1].Price;
//Debug("best offer " + BO + " size = " + BO_size + ", " + BO1_size);
//Debug("best bid " + BB + " size = " + BB_size + ", " + BB1_size);
Debug("4. kademe = " + BO3_size + ". Onceki 4. kademe = " + Bo3_temp + " Fiyat = " + depths.AskRows[3].Price);
if ((now > starttime) && (now < endtime))
{
if(Bo3_temp == 999999999) {}
else if(BO3_size > Bo3_temp * (1+yuzde*0.01)) //YENI 4. KADEME ESKI KADEME DEGERINDEN BELIRTILEN YUZDE MIKTARDA ARTIS GOSTERDIYSE
{
Alert($"4. kademe %{yuzde} artis gosterdi.");
Debug($"4. kademe %{yuzde} artis gosterdi. Kademe fiyati = {depths.AskRows[3].Price}");
}
else if(BO3_size < Bo3_temp * (1-yuzde*0.01)) //YENI 4. KADEME ESKI KADEME DEGERINDEN BELIRTILEN YUZDE MIKTARDA DUSUS GOSTERDIYSE
{
Alert($"4. kademe %{yuzde} dusus gosterdi.");
Debug($"4. kademe %{yuzde} dusus gosterdi. Kademe fiyati = {depths.AskRows[3].Price}");
}
Bo3_temp = BO3_size;
}
else
{
Debug("Belirtilen zaman diliminin disinda cikilmistir. Strateji/Alarm durduruldu.");
}
}
/// <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)
{
}
}
}