Anıl ÖZEKŞİ tarafından oluşturulmuş olup, OTT, StochasticSlow, HottLott, HHV ve LLV yapıları kullanılmıştır.
2'li if kullanılmıştır.
OTT ve StochasticSlow indikatörünün alım bölgesinde olup olmadığına bakarak bu alım bölgesi HottLott ve HHV,LLV ile desteklenmiştir.
Sistemi VIOP sembollerde kullanabileceğiniz gibi, spot sembollerde de kullanabilirsiniz.
Dilerseniz Açığa Satış/Açığa Satış Kapama işlemlerinde de kullanabilirsiniz.
Zaman kontrolü bulunmaktadır.
İndikatörlerin değerlerini optimize edebilirsiniz.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;
namespace Matriks.Lean.Algotrader
{
public class AnılOzeksiSistem_1 : 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.Min60)]
public SymbolPeriod SymbolPeriod1;
[Parameter(5)]
public decimal BuyOrderQuantity;
[Parameter(5)]
public decimal SellOrderQuantity;
[Parameter(2)]
public int OttPeriod1;
[Parameter(7)]
public decimal OttOpt1;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod1;
[Parameter(true)]
public bool OttSupportLine1;
[Parameter(2)]
public int OttPeriod2;
[Parameter(1.4)]
public decimal OttOpt2;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod2;
[Parameter(true)]
public bool OttSupportLine2;
[Parameter(500)]
public int StochasticslowPeriodK1;
[Parameter(111)]
public int StochasticslowPeriodD1;
[Parameter(300)]
public int StochasticslowPeriodSlowK1;
[Parameter(MovMethod.VAR)]
public MovMethod StochasticslowMovMethod1;
[Parameter(5)]
public int HighesthighPeriod1;
[Parameter(2)]
public int OttPeriod3;
[Parameter(0.6)]
public decimal OttOpt3;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod3;
[Parameter(true)]
public bool OttSupportLine3;
[Parameter(20)]
public int HighesthighPeriod2;
[Parameter(5)]
public int LowestLowPeriod;
[Parameter(20)]
public int LowestLowPeriod2;
[Parameter(2)]
public int OttPeriod4;
[Parameter(1.8)]
public decimal OttOpt4;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod4;
[Parameter(true)]
public bool OttSupportLine4;
[Parameter(2)]
public int OttPeriod5;
[Parameter(0.6)]
public decimal OttOpt5;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod5;
[Parameter(true)]
public bool OttSupportLine5;
[Parameter(500)]
public int StochasticslowPeriodK2;
[Parameter(111)]
public int StochasticslowPeriodD2;
[Parameter(300)]
public int StochasticslowPeriodSlowK2;
[Parameter(MovMethod.VAR)]
public MovMethod StochasticslowMovMethod2;
// Gerekli zaman aralığı
[Parameter("10:03:00")]
public string Baslangic;
[Parameter("17:58:00")]
public string Bitis;
public bool FX_ZamanindaMI(DateTime zaman)
{
var bas = TimeSpan.Parse(Baslangic);
var bit = TimeSpan.Parse(Bitis);
return (zaman.TimeOfDay >= bas && zaman.TimeOfDay <= bit);
}
// # Gerekli zaman aralığı
OTT ott;
OTT ott2;
OTT ott3;
OTT ott4;
OTT ott5;
HighestHigh highestHigh;
HighestHigh highestHigh2;
LowestLow lowestLow;
LowestLow lowestLow2;
StochasticSlow stochasticSlow;
StochasticSlow stochasticSlow2;
public override void OnDataUpdate(BarDataEventArgs barData)
{
var zamanKontrolu = FX_ZamanindaMI(barData.BarData.Dtime);
var barData1 = GetBarData(Symbol, SymbolPeriod1);
var H = highestHigh.Value[0][highestHigh.CurrentIndex];
var L = lowestLow2.Value[0][lowestLow.CurrentIndex];
// AL - Açığa satış kapama
if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex] && zamanKontrolu)
{
if (ott2.Value[1][ott2.CurrentIndex] > ott2.Value[0][ott2.CurrentIndex]
&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] > stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
&& H > ott3.Value[0][ott3.CurrentIndex]
&& H > highestHigh2.Value[0][highestHigh2.CurrentIndex - 1])
{
// Gerekli açığa satış
FX_Alis(Symbol, BuyOrderQuantity);
// #Gerekli açığa satış
}else
if (ott4.Value[1][ott4.CurrentIndex] > ott4.Value[0][ott4.CurrentIndex]
&& stochasticSlow2.Value[0][stochasticSlow2.CurrentIndex] > stochasticSlow2.Value[1][stochasticSlow2.CurrentIndex]
&& H > ott3.Value[0][ott3.CurrentIndex]
&& H > highestHigh2.Value[0][highestHigh2.CurrentIndex - 1])
{
// Gerekli açığa satış
FX_Alis(Symbol, BuyOrderQuantity);
// #Gerekli açığa satış
}
}
//SAT- Açığa sat
if (ott.Value[1][ott.CurrentIndex] < ott.Value[0][ott.CurrentIndex] && zamanKontrolu)
{
if (ott2.Value[1][ott2.CurrentIndex] < ott2.Value[0][ott2.CurrentIndex]
&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] < stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
&& L < ott5.Value[0][ott5.CurrentIndex]
&& L < lowestLow2.Value[0][lowestLow2.CurrentIndex - 1])
{
// Gerekli açığa satış
FX_Satis(Symbol, SellOrderQuantity);
// #Gerekli açığa satış
}else
if (ott4.Value[1][ott4.CurrentIndex] < ott4.Value[0][ott4.CurrentIndex]
&& stochasticSlow2.Value[0][stochasticSlow2.CurrentIndex] < stochasticSlow2.Value[1][stochasticSlow2.CurrentIndex]
&& L < ott5.Value[0][ott5.CurrentIndex]
&& L < lowestLow2.Value[0][lowestLow2.CurrentIndex - 1])
{
// Gerekli açığa satış
FX_Satis(Symbol, SellOrderQuantity);
// #Gerekli açığa satış
}
}
}
public override void OnInit()
{
lowestLow = LowestLowIndicator(Symbol, SymbolPeriod1, LowestLowPeriod);
lowestLow2 = LowestLowIndicator(Symbol, SymbolPeriod1, LowestLowPeriod2);
ott = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod1, OttOpt1, OttMovMethod1, OttSupportLine1);
ott2 = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod2, OttOpt2, OttMovMethod2, OttSupportLine2);
stochasticSlow = StochasticSlowIndicator(Symbol, SymbolPeriod1, OHLCType.Close, StochasticslowPeriodK1, StochasticslowPeriodD1, StochasticslowPeriodSlowK1, StochasticslowMovMethod1);
highestHigh = HighestHighIndicator(Symbol, SymbolPeriod1, HighesthighPeriod1);
ott3 = OTTIndicator(highestHigh, OttPeriod3, OttOpt3, OttMovMethod3, OttSupportLine3);
ott5 = OTTIndicator(lowestLow, OttPeriod5, OttOpt5, OttMovMethod5, OttSupportLine5);
highestHigh2 = HighestHighIndicator(Symbol, SymbolPeriod1, HighesthighPeriod2);
ott4 = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod4, OttOpt4, OttMovMethod4, OttSupportLine4);
stochasticSlow2 = StochasticSlowIndicator(Symbol, SymbolPeriod1, OHLCType.Close, StochasticslowPeriodK2, StochasticslowPeriodD2, StochasticslowPeriodSlowK2, StochasticslowMovMethod2);
// Gerekli açığa satış
WorkWithPermanentSignal(true);
if (HangiIslemleBaslasin == yon.Alis)
{
SendOrderSequential(true, Side.Buy);
}else if (HangiIslemleBaslasin == yon.Satis)
{
SendOrderSequential(true, Side.Sell);
}else
{
SendOrderSequential(true, Side.All);
}
SendOrderSequentialForShort(true, Side.All);
// #Gerekli açığa satış
//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
// SetTimerInterval(3600);
//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsSymbol(Symbol);
//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsKeyword("KAP");
}
// Gerekli açığa satış
[Parameter(true)]
public bool AcigaSatisYapilsin;
[Parameter(false)]
public bool AksamSeansiniDahilEt;
[Parameter(yon.Farketmez)]
public yon HangiIslemleBaslasin;
public enum yon
{
Alis, Satis, Farketmez
}
public void FX_Alis(string sembol, decimal quantity)
{
decimal _quantity = 0;
if (LastOrderSide.Obj != Side.Buy)
{
if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
{
SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
_quantity = quantity;
}else
{
if (LastOrderSideForShort.Obj == Side.All)
{
SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
_quantity = quantity;
}else
{
SendMarketOrder(Symbol, quantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
_quantity = quantity * 2;
}
}
Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
LastOrderSide.Obj = Side.Buy;
LastOrderSideForShort.Obj = Side.Buy;
}
}
public void FX_Satis(string sembol, decimal quantity)
{
decimal _quantity = 0;
if (LastOrderSide.Obj != Side.Sell)
{
if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
{
SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
_quantity = quantity;
}else
{
if (LastOrderSideForShort.Obj == Side.All)
{
SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
_quantity = quantity;
}else
{
SendMarketOrder(Symbol, quantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
_quantity = quantity * 2;
}
}
Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
LastOrderSide.Obj = Side.Sell;
LastOrderSideForShort.Obj = Side.Sell;
}
}
public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
{
if (sOrder.EnableOrderSending)
{
LastOrderSide.Obj = Side.All;
Debug("Sentetik emir tetiklendi");
}
}
// #Gerekli açığa satış
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
/// <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>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
public override void OnTimer()
{
}
}
}
Merhabalar , 1 dakikalık periyot için backtest optimizasyonu yapacağım fakat değişken sayası çok fazla olduğu için işlem süresi inanılmaz fazla çıkıyor hangi parametreleri hangi aralıklarla optimize etsek daha pratik olur acaba teşekkürler...
Merhabalar emeğiniz için teşekkür ederim. bu stratejinin tamamını içeren hazır bir indikatör var mı veya yapılabilir mi yardımcı olabilir misin. genel olarak merak ettiğim aslında backtest yaptım değişkenleri (opt) seçtim çalıştırdıktan sonra veya çalıştırmadan önce grafikte gözle kontrol için istediğim değişkenlere göre grafikte açılsın isterim belki böyle bir imkan vardır ben bilmiyorumdur. saygılarımla