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.
Sistem kripto para ile de çalışmaya uyumludur. Hem vadeli hem de vadeli kripto sembollerinde kullanabilirsiniz.
Dilerseniz Açığa Satış/Açığa Satış Kapama işlemlerinde de kullanabilirsiniz.
Sistem Long yönlü yazılmıştır, dilerseniz değiştirebilirsiniz.
İndikatörlerin değerlerini optimize edebilirsiniz.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.AI;
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 OTT_STOCK_HHVLLV_HOTT_LOTT_LONG : MatriksAlgo
{
[SymbolParameter("BTC_USDT_FBIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod1;
[Parameter(0.003)]
public decimal BuyOrderQuantity;
[Parameter(0.003)]
public decimal SellOrderQuantity;
//LONG parametreleri
[Parameter(30)]
public int OttPeriod1;
[Parameter(8)]
public decimal OttOpt1;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod;
[Parameter(true)]
public bool OttSupportLine;
[Parameter(20)]
public int OttPeriod2;
[Parameter(1)]
public decimal OttOpt2;
[Parameter(500)]
public int StochasticslowPeriodK1;
[Parameter(300)]
public int StochasticslowPeriodSlowK1;
[Parameter(111)]
public int StochasticslowPeriodD1;
[Parameter(MovMethod.VAR)]
public MovMethod StochasticslowMovMethod;
[Parameter(5)]
public int HighesthighPeriod;
[Parameter(2)]
public int OttPeriod3;
[Parameter(0.9)]
public decimal OttOpt3;
[Parameter(10)]
public int HighesthighPeriod2;
[Parameter(40)]
public int OttPeriod4;
[Parameter(0.6)]
public decimal OttOpt4;
[Parameter(500)]
public int StochasticslowPeriodK2;
[Parameter(300)]
public int StochasticslowPeriodSlowK2;
[Parameter(111)]
public int StochasticslowPeriodD2;
[Parameter(5)]
public int HighesthighPeriod3;
[Parameter(2)]
public int OttPeriod5;
[Parameter(0.9)]
public decimal OttOpt5;
[Parameter(10)]
public int HighesthighPeriod4;
//LONG kapama Parametreleri
[Parameter(30)]
public int OttPeriod6;
[Parameter(0.8)]
public decimal OttOpt6;
[Parameter(500)]
public int StochasticslowPeriodK3;
[Parameter(300)]
public int StochasticslowPeriodSlowK3;
[Parameter(111)]
public int StochasticslowPeriodD3;
[Parameter(5)]
public int LowestLowPeriod;
[Parameter(2)]
public int OttPeriod7;
[Parameter(0.9)]
public decimal OttOpt7;
[Parameter(10)]
public int LowestLowPeriod2;
[Parameter(20)]
public int OttPeriod8;
[Parameter(1)]
public decimal OttOpt8;
[Parameter(500)]
public int StochasticslowPeriodK4;
[Parameter(300)]
public int StochasticslowPeriodSlowK4;
[Parameter(111)]
public int StochasticslowPeriodD4;
[Parameter(5)]
public int LowestLowPeriod3;
[Parameter(2)]
public int OttPeriod9;
[Parameter(0.9)]
public decimal OttOpt9;
[Parameter(10)]
public int LowestLowPeriod4;
OTT ott;
OTT ott2;
OTT ott3;
OTT ott4;
OTT ott5;
OTT ott6;
OTT ott7;
OTT ott8;
OTT ott9;
HighestHigh highestHigh;
HighestHigh highestHigh2;
HighestHigh highestHigh3;
HighestHigh highestHigh4;
LowestLow lowestLow;
LowestLow lowestLow2;
LowestLow lowestLow3;
LowestLow lowestLow4;
StochasticSlow stochasticSlow;
StochasticSlow stochasticSlow2;
StochasticSlow stochasticSlow3;
StochasticSlow stochasticSlow4;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod1);
lowestLow = LowestLowIndicator(Symbol, SymbolPeriod1, LowestLowPeriod);
lowestLow2 = LowestLowIndicator(Symbol, SymbolPeriod1, LowestLowPeriod2);
lowestLow3 = LowestLowIndicator(Symbol, SymbolPeriod1, LowestLowPeriod3);
lowestLow4 = LowestLowIndicator(Symbol, SymbolPeriod1, LowestLowPeriod4);
highestHigh = HighestHighIndicator(Symbol, SymbolPeriod1, HighesthighPeriod);
highestHigh2 = HighestHighIndicator(Symbol, SymbolPeriod1, HighesthighPeriod2);
highestHigh3 = HighestHighIndicator(Symbol, SymbolPeriod1, HighesthighPeriod3);
highestHigh4 = HighestHighIndicator(Symbol, SymbolPeriod1, HighesthighPeriod4);
ott = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod1, OttOpt1, OttMovMethod, OttSupportLine);
ott2 = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod2, OttOpt2, OttMovMethod, OttSupportLine);
ott3 = OTTIndicator(highestHigh, OttPeriod3, OttOpt3, OttMovMethod, OttSupportLine);
ott4 = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod4, OttOpt4, OttMovMethod, OttSupportLine);
ott5 = OTTIndicator(highestHigh3, OttPeriod5, OttOpt5, OttMovMethod, OttSupportLine);
ott6 = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod6, OttOpt6, OttMovMethod, OttSupportLine);
ott7 = OTTIndicator(lowestLow, OttPeriod7, OttOpt7, OttMovMethod, OttSupportLine);
ott8 = OTTIndicator(Symbol, SymbolPeriod1, OHLCType.Close, OttPeriod8, OttOpt8, OttMovMethod, OttSupportLine);
ott9 = OTTIndicator(lowestLow3, OttPeriod9, OttOpt9, OttMovMethod, OttSupportLine);
stochasticSlow = StochasticSlowIndicator(Symbol, SymbolPeriod1, OHLCType.Close, StochasticslowPeriodK1, StochasticslowPeriodD1, StochasticslowPeriodSlowK1, StochasticslowMovMethod);
stochasticSlow2 = StochasticSlowIndicator(Symbol, SymbolPeriod1, OHLCType.Close, StochasticslowPeriodK2, StochasticslowPeriodD2, StochasticslowPeriodSlowK2, StochasticslowMovMethod);
stochasticSlow3 = StochasticSlowIndicator(Symbol, SymbolPeriod1, OHLCType.Close, StochasticslowPeriodK3, StochasticslowPeriodD3, StochasticslowPeriodSlowK3, StochasticslowMovMethod);
stochasticSlow4 = StochasticSlowIndicator(Symbol, SymbolPeriod1, OHLCType.Close, StochasticslowPeriodK4, StochasticslowPeriodD4, StochasticslowPeriodSlowK4, StochasticslowMovMethod);
// Gerekli açığa satış
WorkWithPermanentSignal(true);
SendOrderSequential(true, HangiIslemleBaslasin);
SendOrderSequentialForShort(true, Side.All);
// #Gerekli açığa satış
// Gerekli - Kaldıraç
SetLeverage(Symbol, Kaldirac); // kaldıraç oranı
SetLeverageType(Symbol, true); // kaldıraç tipi - true isolated, false cross
// #Gerekli - Kaldıraç
// Gerekli - Timestamp
SetTimerInterval(1);
// #Gerekli - Timestamp
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
var barData1 = GetBarData(Symbol, SymbolPeriod1);
var H = GetSelectedValueFromBarData(barData1, OHLCType.High);
var L = GetSelectedValueFromBarData(barData1, OHLCType.Low);
// LONG
if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
{
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 > ott5.Value[0][ott5.CurrentIndex]
&& H > highestHigh4.Value[0][highestHigh4.CurrentIndex - 1])
{
FX_Alis(Symbol, BuyOrderQuantity);
// #Gerekli açığa satış
}
}
//LONG KAPAMA
if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
{
if (ott6.Value[1][ott6.CurrentIndex] < ott6.Value[0][ott6.CurrentIndex]
&& stochasticSlow3.Value[0][stochasticSlow3.CurrentIndex] < stochasticSlow3.Value[1][stochasticSlow3.CurrentIndex]
&& L < ott7.Value[0][ott7.CurrentIndex]
&& L < lowestLow2.Value[0][lowestLow2.CurrentIndex - 1])
{
// Gerekli açığa satış
FX_Satis(Symbol, SellOrderQuantity);
// #Gerekli açığa satış
}
}
else
{
if (ott8.Value[1][ott8.CurrentIndex] < ott8.Value[0][ott8.CurrentIndex]
&& stochasticSlow4.Value[0][stochasticSlow4.CurrentIndex] < stochasticSlow4.Value[1][stochasticSlow4.CurrentIndex]
&& L < ott9.Value[0][ott9.CurrentIndex]
&& L < lowestLow4.Value[0][lowestLow4.CurrentIndex - 1])
{
FX_Satis(Symbol, SellOrderQuantity);
// #Gerekli açığa satış
}
}
}
// Gerekli açığa satış
[Parameter(3)]
public int Kaldirac;
[Parameter(false)]
public bool AcigaSatisYapilsin;
[Parameter(false)]
public bool AksamSeansiniDahilEt;
[Parameter(Side.Buy)]
public Side HangiIslemleBaslasin;
public void FX_Alis(string Symbol, decimal quantity)
{
if (LastOrderSide.Obj != Side.Buy)
{
var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(Symbol, _quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
LastOrderSideForShort = LastOrderSide;
sentetikEmirdenMI = false;
}
}
public void FX_Satis(string Symbol, decimal quantity)
{
if (LastOrderSide.Obj != Side.Sell)
{
var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(Symbol, _quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
LastOrderSideForShort = LastOrderSide;
sentetikEmirdenMI = false;
}
}
bool sentetikEmirdenMI = false;
public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
{
if (sOrder.EnableOrderSending)
{
if (AcigaSatisYapilsin)
{
LastOrderSide.Obj = Side.All;
sentetikEmirdenMI = true;
} Debug("Sentetik emir tetiklendi");
}
}
// #Gerekli açığa satış
// Gerekli - Timestamp
public class OrderListTimestamp
{
public string ID;
public string Symbol;
public decimal Adet;
public decimal Fiyat;
public OrdType EmirTipi;
public OrderSide orderSide;
public string EmirYonu;
public DateTime TetiklenmeZamani;
public int Sayac;
public bool AktifMI;
}
Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();
[Parameter(3)]
public int AyniEmirKacSeferGonderilsin;
[Parameter(10)]
public int KacSaniyeSonraTekrarGonderilsin;
string orderIDTimestamp = string.Empty;
// #Gerekli
public override void OnTimer()
{
// Gerekli - Timestamp
var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);
if (tutt.Count() >0)
{
foreach (var deger in tutt)
{
LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;
if (deger.Value.EmirTipi.Obj == OrdType.Limit)
{
orderIDTimestamp = SendLimitOrder(deger.Value.Symbol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
}
else if (deger.Value.EmirTipi.Obj == OrdType.Market)
{
orderIDTimestamp = SendMarketOrder(deger.Value.Symbol, deger.Value.Adet, deger.Value.orderSide);
Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
}
deger.Value.ID = orderIDTimestamp;
deger.Value.AktifMI = false;
timestampDict[orderIDTimestamp] = deger.Value;
timestampDict.Remove(deger.Key);
}
}
// #Gerekli - Timestamp
}
public override void OnOrderUpdate(IOrder order)
{
// Gerekli - Timestamp
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
if (timestampDict.ContainsKey(order.CliOrdID))
{
timestampDict.Remove(order.CliOrdID);
Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
}
}
if (order.OrdStatus.Obj == OrdStatus.Rejected)
{
if (!timestampDict.ContainsKey(order.CliOrdID))
{
OrderListTimestamp orderList = new OrderListTimestamp();
orderList.ID = order.CliOrdID;
orderList.Symbol = order.Symbol;
orderList.Adet = order.OrderQty;
orderList.Fiyat = order.Price;
orderList.EmirTipi = order.OrdType;
orderList.TetiklenmeZamani = DateTime.Now;
orderList.Sayac = 0;
orderList.AktifMI = false;
if (order.Side.Obj == Side.Buy)
{
orderList.orderSide = OrderSide.Buy;
orderList.EmirYonu = "Alış";
}
else
{
orderList.orderSide = OrderSide.Sell;
orderList.EmirYonu = "Satış";
} timestampDict[order.CliOrdID] = orderList;
}
if (order.Text.Contains("Timestamp"))
{
if (timestampDict.ContainsKey(order.CliOrdID))
{
if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
{
timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
timestampDict[order.CliOrdID].Sayac++;
timestampDict[order.CliOrdID].AktifMI = true;
Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");
}
else
{
timestampDict.Remove(order.CliOrdID);
Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");
}
}
}
}
// #Gerekli - Timestamp
}
}
}
Merhabalar, OTTler de OttPeriod için10-40 arası adım 10 ve Opt için 0.2-1 arası 0.2 adım Stochastic içinse 300-600 arası adım 100 yazıp deneyebilirsiniz, HOTT ve LOTT içinse 10-20 arası adım 2 kullanabilirsiniz. İyi çalışmalar.
merhaba belirttiğiniz parametrelerle bactest yapmak istediğimde optimizasyon sayısı 2,147,483,647 den fazla olamaz şeklinde hata veriyor yanlışım nerede acaba yardımcı olabilirmisiniz teşekkürler.
Merhabalar, Hatanın görüntüsünü iqdestek@matriksdata.com adresine iletebilirseniz çok memnun oluruz. Yardımcı olmaya çalışalım. İyi çalışmalar.
merhabalar, bu sistem ile Anıl Bey'in diğer sistemleri ile ilgili sitenizde toplam 3 adet sistem var. Hepsi TOTT ve SOTT yapısı ile kurgulanmış. Ancak aralarında şöyle bir farklılık var; if'li cümle kalıplarında [] ifadesi içine aynı kalıplar için bazen 0,1 veya 2 giriliyor. Bu konuda bir sistematik yok ve bu nedenle Prime'da yaptığım backtestler ile İQ'da yaptığım testler uyuşmuyor, ilgisiz sonuçlar geliyor karşıma. Bu kalıpların doğrusu nedir ?
bu stratejiyi sadece LONG yönlü değilde; buy sinyali gelince long açsın ve sell sinyali gelince pozisyonu kapatsın. aynı şekilde sell sinyali gelince short açılsın ve buy gelince pozisyonu kapatsın. şekline çevirme mümkün olur mu ? sürekli tekrarlasın işlemi. teşekkür ederim iyi çalışmalar
merhabalar , bahsi geçen sistemi ben de rica edebilir miyim mümkünse? teşekkür ederim
Merhabalar sistemi bende rica edebilir miyim? Bir de yukarıda ifade edildiği gibi belirttiğiniz parametrelerle backtest yapmak istediğimde optimizasyon sayısı 2,147,483,647 gibi çok fazla, bu konuda da yardımcı olur musunuz, teşekkürler.
Merhaba, optimizasyon parametrelerinde aralıkları kısa tutabilir(ilk ve son değerleri) yada adım parametresinin değerlerini arttırarak deneyebilirsiniz.