Duraklatılmış strateji Bir sonraki gün yeniden başlatıldığında Bir önceki verileri hatırlamasını istiyorum.
- Soruldu
- Kategori
- Algoritmik Trading
- Görüntülenme
- 324 görüntülenme
- Durum
- Cevaplandı
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;

