0 beğenilme 0 beğenilmeme
47 kez görüntülendi
Ertesi gün strateji başlatıldığında açık pozisyon varken aynı yönde diğer pozisyon kapatılmadan yeni pozisyon açıyor ve bir önceki günkü son verileri DEBUG kısmında göremiyorum.Back testin log larına baktığımızda işleme girilen ilk emirden son gönderilen emire kadar detaylı olarak tüm işlemleri görebiliyoruz.Kısacası yeni günde aynı yönlü işlem açılmaması ve stratejinin kaldığı yerden devam etmesini istiyorum.bu konuda yardımcı olursanız sevinirim.İyi çalışmalar dileklerimle .

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
using Matriks.Data.Symbol;
using Matriks.Data.Tick;
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;

namespace Matriks.Lean.Algotrader
{
    public class GUNCELTRADESTR : MatriksAlgo
    {
        // Parametreler
        [SymbolParameter("THYAO")]
        public string Sembol;

        [Parameter(SymbolPeriod.Min)]
        public SymbolPeriod Periyot;

        [Parameter(10)]
        public int SmaPeriyot = 10;

        [Parameter(3)]
        public decimal StopLossYuzde = 3m;

        [Parameter(1.0)]
        public double SiparisMiktari = 1.0;

        [Parameter(2)]
        public decimal MaxRiskYuzde = 2m;

        [Parameter(true)]
        public bool LogKullan = true;

        [Parameter(5)]
        public int MinPozisyonBarSayisi = 5;

        [Parameter(75)]
        public decimal RsiAsiriAlim = 75m;

        [Parameter(25)]
        public decimal RsiAsiriSatis = 25m;

        [Parameter(1.5)]
        public decimal HacimCarpani = 1.5m;

        [Parameter(5)]
        public int MinBeklemeBarSayisi = 5; // Pozisyon kapandıktan sonra bekleme süresi

        // Göstergeler ve diğer değişkenler
        private SMA sma;
        private ATR atr;
        private RSI rsi;
        private VOLUME hacim;
        private decimal guncelFiyat;
        private decimal uzunMiktar = 0m;
        private decimal kisaMiktar = 0m;
        private Dictionary<string, decimal> girisFiyatlari = new Dictionary<string, decimal>();
        private Dictionary<string, decimal> izSurenStoplar = new Dictionary<string, decimal>();
        private Dictionary<string, decimal> karAlSeviyeleri = new Dictionary<string, decimal>();
        private Dictionary<string, int> girisBarlari = new Dictionary<string, int>();
        private Queue<decimal> kapanisFiyatlari = new Queue<decimal>();
        private bool sinyalIslendi = false;
        private DateTime sonIslenenBarZamani = DateTime.MinValue;
        private bool gostergelerHazir = false;
        private decimal dinamikStopLoss;
        private decimal dinamikHacimCarpani;
        private int barCounter = 0;
        private int sonPozisyonKapamaBari = -5; // Başlangıçta bekleme süresini geçmiş gibi ayarlanır

        // Loglama
        private void Log(string mesaj)
        {
            if (LogKullan)
                base.Debug($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {mesaj}");
        }

        public override void OnInit()
        {
            // Parametre Doğrulama
            if (string.IsNullOrEmpty(Sembol) || SmaPeriyot <= 0 || StopLossYuzde < 0 || SiparisMiktari <= 0 || MinBeklemeBarSayisi < 0)
            {
                Log("Hata: Geçersiz parametreler.");
                return;
            }

            // Sembolün geçerli olduğunu kontrol et
            if (!IsSymbolValid(Sembol))
            {
                Log($"Hata: Geçersiz sembol: {Sembol}. Lütfen doğru formatta bir sembol kullanın (örneğin, THYAO, XRP_USDT_BIN).");
                return;
            }

            // Göstergeleri Başlat
            sma = SMAIndicator(Sembol, Periyot, OHLCType.Close, SmaPeriyot);
            atr = ATRIndicator(Sembol, Periyot, OHLCType.Close, 10);
            rsi = RSIIndicator(Sembol, Periyot, OHLCType.Close, 10);
            hacim = VolumeIndicator(Sembol, Periyot);

            // Veri akışını sürekli hale getir
            SendOrderSequential(false, true);
            WorkWithPermanentSignal(true);

            Log($"Strateji Başlatıldı: Sembol={Sembol}, Periyot={Periyot}, SMA Periyot={SmaPeriyot}, MinPozisyonBarSayisi={MinPozisyonBarSayisi}, HacimCarpani={HacimCarpani:F2}, SiparisMiktari={SiparisMiktari:F2}, MinBeklemeBarSayisi={MinBeklemeBarSayisi}");
        }

        private bool IsSymbolValid(string sembol)
        {
            try
            {
                // Sembol boş mu kontrolü
                if (string.IsNullOrEmpty(sembol))
                {
                    Log("Sembol Doğrulama: Sembol boş.");
                    return false;
                }

                // Harf, rakam, _, /, -, : ve . karakterlerine izin ver
                bool isValid = sembol.All(c => char.IsLetterOrDigit(c) || c == '_' || c == '/' || c == '-' || c == ':' || c == '.');
                if (!isValid)
                {
                    Log($"Sembol Doğrulama: Geçersiz karakterler bulundu. Sembol={sembol}");
                    return false;
                }

                // BIST sembolleri için ek kontrol gerekmez, kripto için minimum uzunluk ve '_' kontrolü
                if (sembol.Contains("_")) // Kripto sembolü olabilir
                {
                    if (sembol.Length < 3)
                    {
                        Log($"Sembol Doğrulama: Sembol formatı uygun değil. Sembol={sembol}, Minimum uzunluk=3 (örneğin, XRP_USDT_BIN).");
                        return false;
                    }

                    string[] parts = sembol.Split('_');
                    if (parts.Length < 2 || string.IsNullOrEmpty(parts[parts.Length - 1]))
                    {
                        Log($"Sembol Doğrulama: Borsa uzantısı eksik veya geçersiz. Sembol={sembol}, Örnek format: XRP_USDT_BIN");
                        return false;
                    }
                }

                Log($"Sembol Doğrulama: Sembol={sembol}, Geçerli={isValid}. Not: Sembolün platformda tanımlı olduğundan emin olun (örneğin, THYAO, XRP_USDT_BIN).");
                return isValid;
            }
            catch (Exception ex)
            {
                Log($"Sembol Doğrulama Hatası: {ex.Message}, StackTrace: {ex.StackTrace}");
                return false;
            }
        }

        private bool GostergelerHazirMi()
        {
            try
            {
                bool hazir = sma?.CurrentIndex >= SmaPeriyot &&
                             atr?.CurrentIndex >= 10 &&
                             rsi?.CurrentIndex >= 10 &&
                             hacim?.CurrentIndex >= 5;
                Log($"Göstergeler Hazır Kontrolü: SMA={sma?.CurrentIndex}/{SmaPeriyot}, ATR={atr?.CurrentIndex}/10, RSI={rsi?.CurrentIndex}/10, Hacim={hacim?.CurrentIndex}/5, Hazır={hazir}");
                return hazir;
            }
            catch (Exception ex)
            {
                Log($"Göstergeler Hazır Kontrolü Hatası: {ex.Message}");
                return false;
            }
        }

        private bool YuksekHacimMi()
        {
            try
            {
                if (hacim == null || hacim.CurrentIndex < 5)
                {
                    Log($"Yüksek Hacim Kontrolü: Hacim verisi eksik, hacim={hacim == null}, CurrentIndex={hacim?.CurrentIndex}");
                    return false;
                }

                decimal sonHacim = hacim.Value[0][hacim.CurrentIndex];
                decimal oncekiHacimOrtalamasi = hacim.Value[0].Skip(1).Take(5).Average(x => x.Value);
                decimal son5BarOrtalama = hacim.Value[0].Take(5).Average(x => x.Value);
                bool aniHacimYukselisi = sonHacim > oncekiHacimOrtalamasi * 1.5m;
                bool normalHacimKontrolu = hacim.CurrentIndex >= 5 && sonHacim > son5BarOrtalama * dinamikHacimCarpani;
                bool esnekHacimKontrolu = sonHacim > son5BarOrtalama * 1.2m;

                Log($"Yüksek Hacim Kontrolü: AniHacim={aniHacimYukselisi}, NormalHacim={normalHacimKontrolu}, EsnekHacim={esnekHacimKontrolu}, SonHacim={sonHacim:F0}, OncekiOrtalama={oncekiHacimOrtalamasi:F0}, Son5BarOrtalama={son5BarOrtalama:F0}, Çarpan={dinamikHacimCarpani:F2}");
                return aniHacimYukselisi || normalHacimKontrolu || esnekHacimKontrolu;
            }
            catch (Exception ex)
            {
                Log($"Yüksek Hacim Kontrolü Hatası: {ex.Message}, StackTrace: {ex.StackTrace}");
                return false;
            }
        }

        private void DinamikParametreleriGuncelle()
        {
            try
            {
                if (atr?.CurrentIndex < 10 || guncelFiyat <= 0m)
                {
                    Log($"Hata: ATR verisi hazır değil veya geçerli fiyat sıfır. guncelFiyat={guncelFiyat}, ATR CurrentIndex={atr?.CurrentIndex}");
                    return;
                }

                decimal volatilite;
                decimal[] sonFiyatlar = kapanisFiyatlari.ToArray();
                if (sonFiyatlar.Length >= 10)
                {
                    volatilite = sonFiyatlar.Select((f, i) => i > 0 ? Math.Abs((f - sonFiyatlar[i - 1]) / sonFiyatlar[i - 1] * 100m) : 0m).Average() * 2m;
                }
                else
                {
                    volatilite = atr.Value[0][atr.CurrentIndex] / (guncelFiyat / 100m);
                }

                Log($"Volatilite: {volatilite:F2} (YüzdeselDeğişim={sonFiyatlar.Length >= 10}, ATR={atr?.Value[0][atr.CurrentIndex]:F2}, Fiyat={guncelFiyat:F2}, Çarpan=2m)");

                dinamikStopLoss = StopLossYuzde * (1m + volatilite / 100m);
                dinamikHacimCarpani = Math.Max(1.5m, Math.Min(3.0m, HacimCarpani + (volatilite / 3m)));

                Log($"Dinamik Parametreler Güncellendi: StopLoss={dinamikStopLoss:F2}, Hacim Çarpanı={dinamikHacimCarpani:F2}, Volatilite={volatilite:F2}");
            }
            catch (Exception ex)
            {
                Log($"Dinamik Parametre Güncelleme Hatası: {ex.Message}");
            }
        }

        private bool BogaTrendiMi()
        {
            try
            {
                if (kapanisFiyatlari.Count < SmaPeriyot || sma == null || rsi == null)
                {
                    Log($"Boğa Trendi Kontrolü: Yetersiz veri veya göstergeler hazır değil. KapanisFiyatlari Sayısı={kapanisFiyatlari.Count}, SMA={sma?.CurrentIndex}, RSI={rsi?.CurrentIndex}");
                    return false;
                }

                decimal smaDegeri = sma.Value[0][sma.CurrentIndex];
                bool trend = guncelFiyat > smaDegeri * 1.001m && rsi.Value[0][rsi.CurrentIndex] <= RsiAsiriAlim + 5m && YuksekHacimMi();
                Log($"Boğa Trendi Kontrolü: Fiyat={guncelFiyat:F2}, SMA={smaDegeri:F2}, RSI={rsi.Value[0][rsi.CurrentIndex]:F2}, HacimYuksek={YuksekHacimMi()}, Sonuç={trend}");
                return trend;
            }
            catch (Exception ex)
            {
                Log($"Boğa Trendi Kontrolü Hatası: {ex.Message}, StackTrace: {ex.StackTrace}");
                return false;
            }
        }

        private bool AyiTrendiMi()
        {
            try
            {
                if (kapanisFiyatlari.Count < SmaPeriyot || sma == null || rsi == null)
                {
                    Log($"Ayı Trendi Kontrolü: Yetersiz veri veya göstergeler hazır değil. KapanisFiyatlari Sayısı={kapanisFiyatlari.Count}, SMA={sma?.CurrentIndex}, RSI={rsi?.CurrentIndex}");
                    return false;
                }

                decimal smaDegeri = sma.Value[0][sma.CurrentIndex];
                bool trend = guncelFiyat < smaDegeri * 0.999m && rsi.Value[0][rsi.CurrentIndex] >= RsiAsiriSatis - 5m && YuksekHacimMi();
                Log($"Ayı Trendi Kontrolü: Fiyat={guncelFiyat:F2}, SMA={smaDegeri:F2}, RSI={rsi.Value[0][rsi.CurrentIndex]:F2}, HacimYuksek={YuksekHacimMi()}, Sonuç={trend}");
                return trend;
  
Algoritmik Trading kategorisinde (14 puan) tarafından | 47 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhahabalar,
Strateji duraklat/devam ettir yapıldığı takdirde oluşturulan parametreler varsayılan değerlerine döner. En son ki değerler ile kaldığı yerden devam edilmesi isteniyorsa RestoreLastValueOnResume özelliğini kullanmanız gerekir. Değerleri canlı ortamda debug penceresinden görebilirsiniz. Tercih ederseniz canlı verileri Output özelliğini kullananarak da ayrı bir menüden görüntüleyebilirsiniz.

[Output]
[RestoreLastValueOnResume(true, 5)]
public int rsi_period;

Konuyla ilgili aşağıda yer alan dokümanı incemenizi öneririz.
https://iqyardim.matriksdata.com/docs/matriksiq-kullanim-kilavuzu/algotrader/degisken-ve-parametre-tanimlama/

İyi çalışmalar dileriz.

(5,025 puan) tarafından
9,492 soru
9,449 cevap
5,126 yorum
39,737 kullanıcı