StochasticSlow indikatoru ve SMA kullanan bir stratejidir.
AL koşulu: Haftalık stoch K çizgisi stoch D nin üzerinde ise ve kesiştikleri noktada stoch değeri 40 ın altında ise ve Günlük Stoch K çizgisi stoch D’nin üstünde ise ve kapanış 4 saatlik periyotta SMA period 5 in altında ise piyasa alım emri gönderilir.
SAT koşulu: Haftalık Stoch K çizgisi stoch D nin altında ise ve kesiştikleri noktada stoch değeri 60 ın üzerinde ise ve Günlük Stoch K çizgisi stoch D nin altında ise ve KAPANIŞ 4 saatlik PERİYOTTA sma period 5 in üstünde ise piyasa satış emri gönderilir.
NOT: Tam kesiştikleri noktadaki stoch degeri kontrol edilmek isteniyorsa CrossAbove/Below ve WorkWithPermanentSignal(false); kullanılmalıdır.
Haftalik K’nin, D’nin altında(örneğin SAT için) olmasi yeterli ise o zaman stochasticSlow_Weekly.StochasticSlowK.CurrentValue<stochasticSlow_Weekly.StochasticSlowD.CurrentValue
kullanılmalıdır. Bu nedenle calistir menüsünde radyo butonu eklenmiştir, aktif oldugunda cross kapatildiginda >, < kullanılmaktadır.
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;
using Matriks.Data.Tick;
using Matriks.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;
using Newtonsoft.Json;
namespace Matriks.Lean.Algotrader
{
public class StochSMA_Strategy : 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 Quantity;
[Parameter(SymbolPeriod.Min240)]
public SymbolPeriod Period_0;
[Parameter(SymbolPeriod.Day)]
public SymbolPeriod Period_1;
[Parameter(SymbolPeriod.Week)]
public SymbolPeriod Period_2;
[Parameter(40)]
public int StochasticBuyCutoff;
[Parameter(60)]
public int StochasticSellCutoff;
[Parameter(true, "Bu parametre seçiliyken strateji koşulları indikatör değerlerinin kırılımlarını kontrol eder, değilse büyüktür/küçüktür kontrolü yapılır.")]
public bool UseCross;
[Parameter(true, "Bu parametre seçiliyken strateji kalıcı sinyalde çalışır. Seçilmediği zaman stratejinin geçici sinyalde nasıl çalışacağını bilerek kullanınız.")]
public bool PermanentSignal;
StochasticSlow stochasticSlow_Daily;
StochasticSlow stochasticSlow_Weekly;
MOV mov_min240;
public override void OnInit()
{
mov_min240 = MOVIndicator(Symbol, Period_0, OHLCType.Close, 5, MovMethod.Simple);
stochasticSlow_Daily = StochasticSlowIndicator(Symbol, Period_1, OHLCType.Close, 5, 3, 3);
stochasticSlow_Weekly = StochasticSlowIndicator(Symbol, Period_2, OHLCType.Close, 5, 3, 3);
AddSymbol(Symbol, Period_0);
//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(PermanentSignal);
}
/// <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 (barDataCurrentValues.LastUpdate.SymbolPeriod.Equals(Period_0))
{
var close = barDataCurrentValues.LastUpdate.Close;
var stochSlowDay_K = stochasticSlow_Daily.StochasticSlowK;
var stochSlowDay_D = stochasticSlow_Daily.StochasticSlowD;
var stochSlowWeek_K = stochasticSlow_Weekly.StochasticSlowK;
var stochSlowWeek_D = stochasticSlow_Weekly.StochasticSlowD;
if (UseCross)
{
if (CrossAbove(stochasticSlow_Weekly.StochasticSlowK, stochasticSlow_Weekly.StochasticSlowD)
&& stochasticSlow_Weekly.StochasticSlowK.CurrentValue < StochasticBuyCutoff
&& stochasticSlow_Daily.StochasticSlowK.CurrentValue > stochasticSlow_Daily.StochasticSlowD.CurrentValue
&& close < mov_min240.CurrentValue)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
Debug("Buy Market Order Sent");
Debug("***************************************************");
Debug("\t\tstochSlowK\tstochSlowD");
//Debug($"60min {Math.Round(Ref(stochSlow60_K, 1),2)} {Math.Round(stochSlow60_K.CurrentValue,2)}");
Debug($"Daily\t\t{Math.Round(stochSlowDay_K.CurrentValue,2)}\t\t{Math.Round(stochSlowDay_D.CurrentValue,2)}");
Debug($"Weekly\t{Math.Round(stochSlowWeek_K.CurrentValue,2)}\t\t{Math.Round(stochSlowWeek_D.CurrentValue,2)}");
Debug("---\t\t---\t\t---");
Debug($"240min\tClose: {close}\tMOV: {Math.Round(mov_min240.CurrentValue,2)}");
}
if (CrossBelow(stochasticSlow_Weekly.StochasticSlowK, stochasticSlow_Weekly.StochasticSlowD)
&& stochasticSlow_Weekly.StochasticSlowK.CurrentValue > StochasticSellCutoff
&& stochasticSlow_Daily.StochasticSlowK.CurrentValue < stochasticSlow_Daily.StochasticSlowD.CurrentValue
&& close > mov_min240.CurrentValue)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
Debug("Sell Market Order Sent");
Debug("***************************************************");
Debug("\t\tstochSlowK\tstochSlowD");
//Debug($"60min {Math.Round(Ref(stochSlow60_K, 1),2)} {Math.Round(stochSlow60_K.CurrentValue,2)}");
Debug($"Daily\t\t{Math.Round(stochSlowDay_K.CurrentValue,2)}\t\t{Math.Round(stochSlowDay_D.CurrentValue,2)}");
Debug($"Weekly\t{Math.Round(stochSlowWeek_K.CurrentValue,2)}\t\t{Math.Round(stochSlowWeek_D.CurrentValue,2)}");
Debug("---\t\t---\t\t---");
Debug($"240min\tClose: {close}\tMOV: {Math.Round(mov_min240.CurrentValue,2)}");
}
}
else
{
if (stochasticSlow_Weekly.StochasticSlowK.CurrentValue > stochasticSlow_Weekly.StochasticSlowD.CurrentValue
&& stochasticSlow_Weekly.StochasticSlowK.CurrentValue < StochasticBuyCutoff
&& stochasticSlow_Daily.StochasticSlowK.CurrentValue > stochasticSlow_Daily.StochasticSlowD.CurrentValue
&& close < mov_min240.CurrentValue)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
Debug("Buy Market Order Sent");
Debug("***************************************************");
Debug("\t\tstochSlowK\tstochSlowD");
//Debug($"60min {Math.Round(Ref(stochSlow60_K, 1),2)} {Math.Round(stochSlow60_K.CurrentValue,2)}");
Debug($"Daily\t\t{Math.Round(stochSlowDay_K.CurrentValue,2)}\t\t{Math.Round(stochSlowDay_D.CurrentValue,2)}");
Debug($"Weekly\t{Math.Round(stochSlowWeek_K.CurrentValue,2)}\t\t{Math.Round(stochSlowWeek_D.CurrentValue,2)}");
Debug("---\t\t---\t\t---");
Debug($"240min\tClose: {close}\tMOV: {Math.Round(mov_min240.CurrentValue,2)}");
}
if (stochasticSlow_Weekly.StochasticSlowK.CurrentValue < stochasticSlow_Weekly.StochasticSlowD.CurrentValue
&& stochasticSlow_Weekly.StochasticSlowK.CurrentValue > StochasticSellCutoff
&& stochasticSlow_Daily.StochasticSlowK.CurrentValue < stochasticSlow_Daily.StochasticSlowD.CurrentValue
&& close > mov_min240.CurrentValue)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
Debug("Sell Market Order Sent");
Debug("***************************************************");
Debug("\t\tstochSlowK\tstochSlowD");
//Debug($"60min {Math.Round(Ref(stochSlow60_K, 1),2)} {Math.Round(stochSlow60_K.CurrentValue,2)}");
Debug($"Daily\t\t{Math.Round(stochSlowDay_K.CurrentValue,2)}\t\t{Math.Round(stochSlowDay_D.CurrentValue,2)}");
Debug($"Weekly\t{Math.Round(stochSlowWeek_K.CurrentValue,2)}\t\t{Math.Round(stochSlowWeek_D.CurrentValue,2)}");
Debug("---\t\t---\t\t---");
Debug($"240min\tClose: {close}\tMOV: {Math.Round(mov_min240.CurrentValue,2)}");
}
}
}
}
/// <summary>
/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="order">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()
{
}
}
}
