Birşeyler deniyorum da bakalım 😀 bi ATR trailing stoploss var. Ben bunu matriks IQ göre yazamadım. Tradingiew'da gördüm başarılı gibi duruyor eğer ki yardımcı olursanız kodu c# diline chatgpt çeviriyor da matriks IQ ya göre bi ayar çekersek. Bi deneyelim nasıl sonuç aldığını eğer ki güzel sonuçlar alırsak hep beraber kullanırız 😀 Akşamları discorda da görüşebiliriz.

Derinliğe göre kullanmak isteyen bakabilir. Ben deniyorum sizin denemenize gerek yok 😀

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;

//=================================================ACIKLAMA=========================================================//
// Derinlik datasi kullanarak her bar kapanisinda calisir (varsayilan 1 dakikalik barlar).Sadece ilk seviyeye bakar //
// Alis ve satista bekleyen emirlerin lot sayilarini karsilastirir. Ornegin ÇARPANA 8 degeri atarsak //
// bu ilk seviyedeki alislari ve satislari toplar, alislarin toplami satislarin toplaminin 8 katindan buyuk //
// ise alim emri gonderir, satis emri de ayni mantikla yapilir. Bilgiler debug penceresine basilmaktadir. //

namespace Matriks.Lean.Algotrader
{
public class Depth3 : 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.Min)]
public SymbolPeriod SymbolPeriod;

[Parameter(1)]
public decimal SellOrderQuantity;

[Parameter(1)]
public decimal BuyOrderQuantity;

[Parameter(8)]
public int çarpan;

public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
AddSymbolMarketDepth(Symbol);

//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);

// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
WorkWithPermanentSignal(true);

//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
//SetTimerInterval(1);
}

///
/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir.
///
/// Bardata ve hesaplanan gerçekleşen işleme ait detaylar
public override void OnDataUpdate(BarDataEventArgs barData)
{
var depths = GetMarketDepth(Symbol);
var BO_size = depths.AskRows[0].Size;
var BO = depths.AskRows[0].Price;
var BO1 = depths.AskRows[1].Price;

var BB_size = depths.BidRows[0].Size;
var BB = depths.BidRows[0].Price;
var BB1 = depths.BidRows[1].Price;
Debug("best offer " + BO + " size = " + BO_size);
Debug("best bid " + BB + " size = " + BB_size);
Debug("Current Ratio(BB/BO size) = " + Math.Round(BB_size / BO_size, 2));
Debug("*******************************************************");

if (BO_size > çarpan * BB_size)
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
Debug("Satış Emri Gönderildi");
}

if (BB_size > çarpan * BO_size)
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
Debug("Alış Emri Gönderildi");
}
}

///
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
///
public override void OnStopped()
{
}
}
}

BeğenFavori PaylaşYorum yap
  • Krycek @krycek

    matrixiq ekibine mail atarsanız formülü hazırlıyorlar deniyordu.

    https://twitter.com/kivancozbilgic/status/970071027526111237

    Bir de şurası var: https://www.algokutuphanesi.com/Sistem

    Belki yardımcı olur.

    • Oguz Cavusoglu @oguzcavusoglu

      study("ATR Trailing Stoploss",overlay=true)
      Atr=input(defval=5,title="Atr Period",minval=1,maxval=500)
      Hhv=input(defval=10,title="HHV Period",minval=1,maxval=500)
      Mult=input(defval=2.5,title="Multiplier",minval=0.1)
      Barcolor=input(true,title="Barcolor")

      Prev = highest(high-Mult*atr(Atr),Hhv),barssince(close>highest(high-Mult*atr(Atr),Hhv) and close>close[1])
      TS = iff(cum(1) highest(high-Mult*atr(Atr),Hhv) and close>close[1],highest(high-Mult*atr(Atr),Hhv),Prev))

      Color=iff(close>TS,color.green,iff(close<TS,color.red,color.black))
      barcolor(Barcolor? Color:na)
      plot(TS,color=Color,linewidth=3,title="ATR Trailing Stoploss")

      Buy=crossover(close,TS)
      Sell=crossunder(close,TS)

      plotshape(Buy,"BUY", shape.labelup, location.belowbar, color.green, text="BUY",textcolor=color.black)
      plotshape(Sell,"SELL", shape.labeldown, location.abovebar, color.red, text="SELL",textcolor=color.black)

      alertcondition(Buy, "Buy Signal", "Buy ATR Trailing Stoploss")
      alertcondition(Sell, "Sell Signal", "Sell ATR Trailing Stoploss")

      HHV: Highest high value

      C# bu şekilde yazdı chatgpt

      // C# dilinde Pine Script kodunun eşdeğeri yoktur, bu nedenle C#'ta teknik analiz göstergeleri kullanarak benzer bir strateji oluşturabiliriz.

      using System;

      class ATRTrailingStoploss
      {
      static void Main()
      {
      // Kullanıcı girişlerini almak için C# dilinde gerekli değişkenleri tanımlayın
      int Atr = 5;
      int Hhv = 10;
      double Mult = 2.5;

      // Hisse senedi verilerini (high, low, close) içeren bir dizi simüle edelim.
      double[] high = { 100, 102, 105, 106, 110, 108, 112, 115, 120, 118, 125 };
      double[] low = { 98, 99, 101, 102, 106, 105, 108, 110, 113, 112, 115 };
      double[] close = { 99, 100, 104, 105, 108, 107, 111, 113, 118, 114, 122 };

      // Yukarıdaki Pine Script kodundan algoritmayı yeniden oluşturmak için C# dilinde gereken hesaplamaları yapalım.
      double[] atr = CalculateATR(Atr, high, low, close);
      double[] prev = new double[close.Length];
      double[] ts = new double[close.Length];

      for (int i = 0; i < close.Length; i++)
      {
      double highestPrice = CalculateHighestPrice(i, high, atr, Hhv, Mult);

      if (i == 0)
      prev[i] = close[i];
      else
      prev[i] = Math.Max(close[i], prev[i - 1]);

      if (i highestPrice && close[i] > close[i - 1]) ? highestPrice : prev[i];
      }

      // Alım ve satım sinyallerini belirlemek için C# dilinde Pine Script'ten alınan kısmı kullanalım.
      bool[] buySignals = new bool[close.Length];
      bool[] sellSignals = new bool[close.Length];

      for (int i = 1; i ts[i] && close[i - 1] <= ts[i - 1]);
      sellSignals[i] = (close[i] = ts[i - 1]);
      }

      // Alım ve satım sinyallerini yazdırabilir veya işleyebilirsiniz.
      for (int i = 0; i < close.Length; i++)
      {
      if (buySignals[i])
      Console.WriteLine("Buy Signal at index " + i);
      if (sellSignals[i])
      Console.WriteLine("Sell Signal at index " + i);
      }
      }

      static double[] CalculateATR(int period, double[] high, double[] low, double[] close)
      {
      double[] atr = new double[close.Length];
      atr[0] = high[0] - low[0];

      for (int i = 1; i < close.Length; i++)
      {
      double tr = Math.Max(high[i] - low[i], Math.Max(Math.Abs(high[i] - close[i - 1]), Math.Abs(low[i] - close[i - 1])));
      atr[i] = (atr[i - 1] * (period - 1) + tr) / period;
      }

      return atr;
      }

      static double CalculateHighestPrice(int currentIndex, double[] high, double[] atr, int period, double multiplier)
      {
      int startIndex = Math.Max(0, currentIndex - period + 1);
      double highestPrice = double.MinValue;

      for (int i = startIndex; i <= currentIndex; i++)
      {
      double price = high[i] - multiplier * atr[i];
      highestPrice = Math.Max(highestPrice, price);
      }

      return highestPrice;
      }
      }