Anıl Özekşi'nin OTT-Stochastic-Higestgigh indikatörü ile oluşturmuş olduğu veri terminali sisteminin IQ'ya uyarlanmış halidir. Sadece LONG işlem yapmaktadır. Strateji BIST - VIOP - BINANCE SPOT için uygundur. ZamanKullanilsinMI parametresi EVET seçildiğinde zamana göre çalışır. Hayır seçildiğinde zamandan bağımsız olrak çalışır. MAJOR trend parametresi bir kez girilmektedir. 𝕿𝖗𝖆𝖓𝖘𝖑𝖆𝖙𝖊𝖉 𝓑𝔂 ⒶⓀⒾⓃ ℍü𝓃𝑒𝓇𝓁𝒾
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 AnilOzeksi1 : MatriksAlgo
{
/*
Anıl Özekşi'nin OTT-Stochastic-Higestgigh indikatörü ile oluşturmuş olduğu veri terminali sisteminin IQ'ya uyarlanmış halidir.
Sadece LONG işlem yapmaktadır.
Strateji BIST - VIOP - BINANCE SPOT için uygundur.
ZamanKullanilsinMI parametresi EVET seçildiğinde zamana göre çalışır. Hayır seçildiğinde zamandan bağımsız olrak çalışır.
MAJOR trend parametresi bir kez girilmektedir.
_____________________________/ AL \_______________
if(MOV(C,30,VAR)>OTT(C,30,8),
MOV(C,40,VAR)>OTT(C,40,0.6) AND
STOSK(500,200,111,VAR)>STOSD(500,200,111,VAR) AND
H>REF(HHV(H,OPT1),-1),
MOV(C,30,VAR)>OTT(C,30,0.9) AND
STOSK(500,300,111,VAR)>STOSD(500,300,111,VAR) AND
H>REF(HHV(H,OPT2),-1))
_____________________________/ SAT \__________________
if(MOV(C,30,VAR)>OTT(C,30,8),
MOV(C,20,VAR)<OTT(C,20,1) AND
STOSK(500,200,111,VAR)<STOSD(500,200,111,VAR) AND
L<REF(LLV(L,OPT3),-1),
MOV(C,30,VAR)<OTT(C,30,0.9) AND
STOSK(500,300,111,VAR)<STOSD(500,300,111,VAR) AND
L<REF(LLV(L,OPT4),-1))
Parametre Girişleri 4 bölge olarak girilmektedir. */
[SymbolParameter("THYAO")]
public string Symbol1;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod1;
//_______________________________________/ MAJOR TREND \_______________________
//MOV(C,30,VAR)>OTT(C,30,7)
[Parameter(30)]
public int MajorTrend_period;
[Parameter(8)]
public decimal MajorTrend_OttOpt;
//_______________________________________/ 1. bölge \_______________________
// MOV(C,40,VAR)>OTT(C,40,0.6)
[Parameter(40)]
public int Bolge1_OttPeriod;
[Parameter(0.6)]
public decimal Bolge1_OttOpt;
// STOSK(500,200,111,VAR)>STOSD(500,200,111,VAR)
[Parameter(500)]
public int Bolge1_StochasticslowPeriodK;
[Parameter(200)]
public int Bolge1_StochasticslowPeriodSlowK;
[Parameter(111)]
public int Bolge1_StochasticslowPeriodD;
// H>REF(HHV(H,20),-1),
[Parameter(20)]
public int Bolge1_HighesthighPeriod;
//_______________________________________/ 2. bölge \_______________________
// MOV(C,30,VAR)>OTT(C,30,0.9)
[Parameter(30)]
public int Bolge2_OttPeriod;
[Parameter(0.9)]
public decimal Bolge2_OttOpt;
// STOSK(500,300,111,VAR)>STOSD(500,300,111,VAR)
[Parameter(500)]
public int Bolge2_StochasticslowPeriodK;
[Parameter(300)]
public int Bolge2_StochasticslowPeriodSlowK;
[Parameter(111)]
public int Bolge2_StochasticslowPeriodD;
// H>REF(HHV(H,22),-1))
[Parameter(22)]
public int Bolge2_HighesthighPeriod;
//_______________________________________/ 3. bölge \_______________________
//MOV(C,20,VAR)<OTT(C,20,1)
[Parameter(20)]
public int Bolge3_OttPeriod;
[Parameter(1)]
public decimal Bolge3_OttOpt;
//STOSK(500,200,111,VAR)<STOSD(500,200,111,VAR)
[Parameter(500)]
public int Bolge3_StochasticslowPeriodK;
[Parameter(200)]
public int Bolge3_StochasticslowPeriodSlowK;
[Parameter(111)]
public int Bolge3_StochasticslowPeriodD;
// L<REF(LLV(L,23),-1)
[Parameter(23)]
public int Bolge3_LowestlowPeriod;
//_______________________________________/ 4. bölge \_______________________
// MOV(C,30,VAR)<OTT(C,30,0.9)
[Parameter(30)]
public int Bolge4_OttPeriod;
[Parameter(0.9)]
public decimal Bolge4_OttOpt;
// STOSK(500,300,111,VAR)<STOSD(500,300,111,VAR)
[Parameter(500)]
public int Bolge4_StochasticslowPeriodK;
[Parameter(300)]
public int Bolge4_StochasticslowPeriodSlowK;
[Parameter(111)]
public int Bolge4_StochasticslowPeriodD;
//L<REF(LLV(L,24),-1)
[Parameter(24)]
public int Bolge4_LowestlowPeriod;
[Parameter(1)]
public decimal OrderQuantity1;
// Gerekli zaman aralığı
public enum ZamanKullanilsinMI
{
EVET,
HAYIR
}
[Parameter(ZamanKullanilsinMI.HAYIR)]
public ZamanKullanilsinMI Zaman;
public bool ZamanKontrol;
[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;
StochasticSlow stochasticSlow;
HighestHigh highestHigh;
OTT ott3;
StochasticSlow stochasticSlow2;
HighestHigh highestHigh2;
OTT ott4;
StochasticSlow stochasticSlow3;
LowestLow lowestLow;
OTT ott5;
StochasticSlow stochasticSlow4;
LowestLow lowestLow2;
public override void OnDataUpdate(BarDataEventArgs barData)
{
var ZamanKontrol = Zaman == ZamanKullanilsinMI.EVET ? FX_ZamanindaMI(barData.BarData.Dtime) == true? true:false: true;
var barData1 = GetBarData(Symbol1, SymbolPeriod1);
var H = GetSelectedValueFromBarData(barData1, OHLCType.High);
var L = GetSelectedValueFromBarData(barData1, OHLCType.Low);
//AL
if (ZamanKontrol)
{
if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
{
if (LastOrderSide.Obj != Side.Buy
&& ott2.Value[1][ott2.CurrentIndex] > ott2.Value[0][ott2.CurrentIndex]
&& stochasticSlow.Value[0][stochasticSlow.CurrentIndex] > stochasticSlow.Value[1][stochasticSlow.CurrentIndex]
&& H >highestHigh.Value[0][highestHigh.CurrentIndex - 1])
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);
}
}else if (LastOrderSide.Obj != Side.Buy
&& ott3.Value[1][ott3.CurrentIndex] > ott3.Value[0][ott3.CurrentIndex]
&& stochasticSlow2.Value[0][stochasticSlow2.CurrentIndex] > stochasticSlow2.Value[1][stochasticSlow2.CurrentIndex]
&& H >highestHigh2.Value[0][highestHigh2.CurrentIndex - 1])
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);
}
//SAT
if (ott.Value[1][ott.CurrentIndex] > ott.Value[0][ott.CurrentIndex])
{
if (LastOrderSide.Obj != Side.Sell
&& ott4.Value[1][ott4.CurrentIndex] < ott4.Value[0][ott4.CurrentIndex]
&& stochasticSlow3.Value[0][stochasticSlow3.CurrentIndex] < stochasticSlow3.Value[1][stochasticSlow3.CurrentIndex]
&& L < lowestLow.Value[0][lowestLow.CurrentIndex - 1])
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Sell, includeAfterSession:false);
}
}else if (LastOrderSide.Obj != Side.Sell
&& ott5.Value[1][ott5.CurrentIndex] < ott5.Value[0][ott5.CurrentIndex]
&& stochasticSlow4.Value[0][stochasticSlow4.CurrentIndex] < stochasticSlow4.Value[1][stochasticSlow4.CurrentIndex]
&& L < lowestLow2.Value[0][lowestLow2.CurrentIndex - 1])
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Sell, includeAfterSession:false);
}
}
}
public override void OnInit()
{
ott = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MajorTrend_period, MajorTrend_OttOpt, MovMethod.VAR, true);
ott2 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge1_OttPeriod, Bolge1_OttOpt, MovMethod.VAR, true);
stochasticSlow = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge1_StochasticslowPeriodK, Bolge1_StochasticslowPeriodD, Bolge1_StochasticslowPeriodSlowK, MovMethod.VAR);
highestHigh = HighestHighIndicator(Symbol1, SymbolPeriod1, Bolge1_HighesthighPeriod);
ott3 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge2_OttPeriod, Bolge2_OttOpt, MovMethod.VAR, true);
stochasticSlow2 = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge2_StochasticslowPeriodK, Bolge2_StochasticslowPeriodD, Bolge2_StochasticslowPeriodSlowK, MovMethod.VAR);
highestHigh2 = HighestHighIndicator(Symbol1, SymbolPeriod1, Bolge2_HighesthighPeriod);
ott4 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge3_OttPeriod, Bolge3_OttOpt, MovMethod.VAR, true);
stochasticSlow3 = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge3_StochasticslowPeriodK, Bolge3_StochasticslowPeriodD, Bolge3_StochasticslowPeriodSlowK, MovMethod.VAR);
lowestLow = LowestLowIndicator(Symbol1, SymbolPeriod1, Bolge3_LowestlowPeriod);
ott5 = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge4_OttPeriod, Bolge4_OttOpt, MovMethod.VAR, true);
stochasticSlow4 = StochasticSlowIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Bolge4_StochasticslowPeriodK, Bolge4_StochasticslowPeriodD, Bolge4_StochasticslowPeriodSlowK, MovMethod.VAR);
lowestLow2 = LowestLowIndicator(Symbol1, SymbolPeriod1, Bolge4_LowestlowPeriod);
SendOrderSequential(true, Side.All);
WorkWithPermanentSignal(true);
// ------------ Timestamp OnInit ------------
SetTimerInterval(1);
// ------------ Timestamp OnInit ------------
}
/// <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>
/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
/// </summary>
/// <param name="newsId">Gelen haberin id'si</param>
/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
{
}
// ------------ Timestamp Tanımlar ------------
int KacSaniyeSonraTekrarGonderilsin = 10;
int AyniEmirKacSeferGonderilsin = 3;
Dictionary<string, IOrder> RejectedOrderList = new Dictionary<string, IOrder>();
// ------------ Timestamp Tanımlar ------------
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
// ------------ Timestamp OnOrderUpdate Filled ------------
var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);
if (sorgu.Key != null)
{
Debug("İptal olan emir gerçekleşti. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + sorgu.Value.Text);
}
// ------------ Timestamp OnOrderUpdate Filled ------------
}
if (order.OrdStatus.Obj == OrdStatus.Rejected)
{
// ------------ Timestamp OnOrderUpdate Rejected ------------
var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);
if (sorgu.Key == null)
{
order.BitmexPostOnly = true;
order.MinPosition = AyniEmirKacSeferGonderilsin;
order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
RejectedOrderList[order.CliOrdID] = order;
Debug("Emir iptal oldu. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + order.Text);
}else
{
sorgu.Value.BitmexPostOnly = true;
}
// ------------ Timestamp OnOrderUpdate Rejected ------------
}
}
public override void OnTimer()
{
// ------------ Timestamp OnTimer ------------
var sorgu = RejectedOrderList.Where(x => x.Value.BitmexPostOnly == true && DateTime.Now >= x.Value.ExpireDate && x.Value.MinPosition>0);
var oncekiYon = LastOrderSide.Obj;
foreach (var deger in sorgu)
{
var order = deger.Value;
LastOrderSide.Obj = Side.All;
var orderID = SendOrder(order.Symbol, order.OrderQty, order.Price, order.Side, order.OrdType, order.TimeInForce, order.TransactionType, order.ChartIcon);
order.MinPosition--;
order.BitmexPostOnly = false;
order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
order.CliOrdID = orderID;
Debug("İptal olan emir tekrar gönderildi. Detay -> CliOrdID: " + order.CliOrdID + " Yon: " + order.Side.Obj.ToString() + " kalan: " + order.MinPosition);
}
LastOrderSide.Obj = oncekiYon;
// ------------ Timestamp OnTimer ------------
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}
Merhaba, Bu sadeleştirilmiş ve katsayılandırılmış sisteme, Fırsatçı Trend ve mümkünse opsiyonel olarak dahil ve hariç bırakılabilir ROTT ekleme imkanınız varmıdır. Teşekkürler
Merhaba, Anıl Hoca tarafından geliştirilen standart sistemler üzerinde değişiklik yapılmamaktadır.