
Merhaba değerli matriks ailesi. Kıvanç hocamızın tradingview de bulunan Supertrended Moving Averages indikatörü üzerine bir stratejim var. Burada ki amacım iki tane ST MA kullanıyorum. Birincisi ema 100 10 2 değerlerinde grafiğe ekliyorum. İkinci ST MA indikatörü de ema 10 10 5 kullanıyorum. Sorunum burada başlıyor. Buy sinyallerim için İkinci ST MA indikatöründe kaynak kısmında kapanış değeri yerine, 1. ST MA indikatörünün ST MA : Up Trend Değerini alıyorum. Sell sinyallerim içinse kapanış yerine ST MA : Down Trend Değerini alıyorum. Daha açıklayıcı olması için aşağıda fotoğraf paylaştım. Kendi yapmış olduğum strateji içerisine bunu nasıl ekleyebilirim. Yani STMOV indikatöründe kapanış yerine ikinci ST indikatörünün up ve down değerlerini çekip nasıl yazabilirim. Stratejimi aşağıda paylaşıyorum fikir vermesi açısından. Eğer sizin için uzun sürecekse buradan IQ'da stmov up ve down trend değerlerini nasıl yazacağımı bir örnekle paylaşırsanız ben de halledebilirim. Vakit ayırdığınız için teşekkür ederim iyi çalışmalar dilerim.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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 ST_MOV_AL_SAT_BB : MatriksAlgo
{
[SymbolParameter("SOL_USDT_FBIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
[Parameter(1)]
public decimal BuyOrderCount;
[Parameter(1)]
public decimal SellOrderCount;
[Parameter(233)]
public int BollingerPeriod;
[Parameter(3)]
public decimal BollingerStandardDeviation;
[Parameter(610)]
public int SupertrendmovPeriod1;
[Parameter(3)]
public decimal SupertrendmovCoeff1;
[Parameter(610)]
public int SupertrendmovMovPeriod1;
[Parameter(MovMethod.VAR)]
public MovMethod SupertrendmovMovMethod1;
[Parameter(5)]
public decimal StopLevel1; // TAKE PROFİT DEĞİŞKENİ
[Parameter(100)]
public decimal StopLevel2; // STOP LOSS DEĞİŞKENİ
// DEĞİŞKEN TANIMLARI
public int OrderLong = 0;
public int OrderShort = 0;
public int bolLongSignal = 0;
public int bolShortSignal = 0;
public bool longacik = true;
public bool shortacik = true;
// STOPLOSS VE TAKE PROFİT DEĞİŞKEN TANIMLARI
// İNDİKATÖR TANIMLARI
BOLLINGER bollinger;
MatriksIndicator SuperTrendMov;
public override void OnInit()
{
bollinger = BollingerIndicator(Symbol, SymbolPeriod, OHLCType.Close, BollingerPeriod, BollingerStandardDeviation, MovMethod.Simple);
SuperTrendMov = new SuperTrendMov();
SuperTrendMov.SetIndicatorParameters("Period", SupertrendmovPeriod1);
SuperTrendMov.SetIndicatorParameters("Coeff", SupertrendmovCoeff1);
SuperTrendMov.SetIndicatorParameters("MovPeriod", SupertrendmovMovPeriod1);
SuperTrendMov.SetIndicatorParameters("MovMethod", SupertrendmovMovMethod1); RegisterUserIndicator(SuperTrendMov, Symbol, SymbolPeriod, OHLCType.Close, 5);
AddSymbol(Symbol, SymbolPeriod);
SendOrderSequential(false);
WorkWithPermanentSignal(true);
}
public override void OnInitCompleted()
{
}
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
var barData1 = GetBarData(Symbol, SymbolPeriod);
// LONG POZİSYON GİRİŞ
if (OrderLong == 0 && CrossBelow(barData1, bollinger, OHLCType.Close, 2))
{
Debug("Bar Data Bollinger Altında Kapanış Yaptı. VE Long İşlem Açılacak. VE OrderLong Değişkeni Sıfır Değerinde = " + OrderLong);
bolLongSignal = 1;
Debug("BolLongSignal 1 Olarak Atandı = " + bolLongSignal);
}
if (bolLongSignal == 1 && CrossBelow(SuperTrendMov, barData1, OHLCType.Close, 0) && longacik == true)
{
Debug("Bar Data SUPERTREND MOV Yukarı Yönlü Kesti.");
SendMarketOrder(Symbol, BuyOrderCount, OrderSide.Buy);
Debug("Long Pozisyon Alış Emri Gönderildi. ");
OrderLong = 1;
Debug("OrderLong Değişkeni 1 Yapıldı. Ve Long İşlem Açılmayacak = " + OrderLong);
longacik = false;
Debug("Longacik Değişkeni False Yapıldı. " + longacik);
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, StopLevel2);
}
// LONG POZİSYON ÇIKIŞ
if (OrderLong == 1 && CrossAbove(SuperTrendMov, barData1, OHLCType.Close, 0))
{
Debug("OrderLong Değişkeni 1 Durumunda = " + OrderLong);
Debug("Bar Data SUPERTREND MOV Çizğisini Aşağı Yönlü Kesti. Long Pozisyon Kapat Emri Gönderiliyor. ");
SendMarketOrder(Symbol, SellOrderCount, OrderSide.Sell);
Debug("Long Pozisyon Kapatıldı. Satış Emri Gönderildi. ");
// KAR AL VE ZARAR DURDUR EMİRLERİ
// TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);
// StopLoss(Symbol, SyntheticOrderPriceType.Percent, StopLevel2);
longacik = true;
Debug("Long Pozisyon Kapatıldı ve longacik Değişkeni True Yapıldı = " + longacik);
OrderLong = 0;
Debug("Long Pozisyon Kapatıldı ve OrderLong Değişkeni 0 Yapıldı. = " + OrderLong);
bolLongSignal = 0;
Debug("Lomg Pozisyon Kapatıldı ve bolLongSignal Değişkeni Sıfır Olarak Atandı = " + bolLongSignal);
}
// SHORT POZİSYON GİRİŞ
if (OrderShort == 0 && CrossAbove(barData1, bollinger, OHLCType.Close, 0))
{
Debug("Bar Data Bollinger Üzerinde Kapanış Yaptı. VE Short İşlem Açılacak. VE OrderShort Değişkeni Sıfır Değerinde = " + OrderShort);
bolShortSignal = 1;
Debug("BolShortSignal 1 Olarak Atandı = " + bolShortSignal);
}
if (bolShortSignal == 1 && CrossAbove(SuperTrendMov, barData1, OHLCType.Close, 0) && shortacik == true)
{
Debug("Bar Data Supertrend Mov Çizğisini Aşağı Yönlü Kesti.");
SendMarketOrder(Symbol, SellOrderCount, OrderSide.Sell);
Debug("Short Pozisyon Satış Emri Gönderildi. ");
OrderShort = 1;
Debug("OrderShort Değişkeni 1 Yapıldı. Ve Short İşlem Açılmayacak = " + OrderShort);
shortacik = false;
Debug("shortacik Değişkeni False Yapıldı. ");
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, StopLevel2);
}
// SHORT POZİSYON ÇIKIŞ
if (OrderShort == 1 && CrossBelow(SuperTrendMov, barData1, OHLCType.Close, 0))
{
Debug("OrderShort Değişkeni 1 Durumunda = " + OrderShort);
Debug("Bar Data Bollinger Alt Çizgisini Aşağı Yönlü Kesti. Short Pozisyon Kapat Emri Gönderiliyor. ");
SendMarketOrder(Symbol, BuyOrderCount, OrderSide.Buy);
Debug("Short Pozisyon Kapatıldı. Alış Emri Gönderildi. ");
// KAR AL VE ZARAR DURDUR EMİRLERİ
// TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);
// StopLoss(Symbol, SyntheticOrderPriceType.Percent, StopLevel2);
Debug("Short Pozisyon Kapatıldı shortacik Değişkeni True Yapıldı = " + longacik);
shortacik = true;
Debug("Short Pozisyon Kapatıldı ve OrderShort Değişkeni 0 Yapıldı. = " + OrderShort);
OrderShort = 0;
bolShortSignal = 0;
Debug("Short Pozisyon Kapatıldı ve bolShortSignal Değişkeni Sıfır Olarak Atandı = " + bolShortSignal);
}
}
// Gerekli - Timestamp
public class OrderListTimestamp
{
public string ID;
public string Sembol;
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;
public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
{
if (sOrder.EnableOrderSending && sOrder.SyntheticAlgoOrderType == SyntheticAlgoOrderType.StopLoss)
{
Debug("Stop Loss Çalıştı.");
longacik = true;
shortacik = true;
OrderShort = 0;
OrderLong = 0;
bolLongSignal = 0;
bolShortSignal = 0;
Debug("Emirler Sıfırlandı.");
}
if (sOrder.EnableOrderSending && sOrder.SyntheticAlgoOrderType == SyntheticAlgoOrderType.TakeProfit)
{
Debug("Take Profit Çalıştı.");
longacik = true;
shortacik = true;
OrderShort = 0;
OrderLong = 0;
bolLongSignal = 0;
bolShortSignal = 0;
Debug("Emirler Sıfırlandı.");
}
}
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
Debug("gerçekleşti");
if (timestampDict.ContainsKey(order.CliOrdID))
{
timestampDict.Remove(order.CliOrdID);
Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
}
}
&nb