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;