Pmax hazır indikatöürünü ekleyemiyorum
- Soruldu
- Kategori
- Algoritmik Trading
- Görüntülenme
- 1.429 görüntülenme
- Durum
- Çözüldü
Kıvanç Bey'in paylaştığı Pmax indikatöürünü, kullanıcı indikatörleri kısmından İndikatör Al'a tıklayarak ekledim fakat grafikte göster dediğimde "İndikatör çalıştırılırken bir hata oluştu : Sıra, Eşleşen öğe içermiyor" ve "Nesne başvurusu bir nesnenin örneğine ayarlanmadı" gibi hatalar alıyorum. Yardımcı olur musunuz?


Malesef Hata devam ediyor, kod aşağıdaki gibi ;
using System; using System.Collections.Generic; using System.Linq; using System.ComponentModel; using Matriks.Data.Identifiers; 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; namespace Matriks.Lean.Algotrader { //Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır. //Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries [IndicatorInformationAttribute("PMax", IndicatorDrawingArea.OnDataSeries)] //Indikatörün çizgilerinin isimleri [IndicatorLineInformationAttribute(new [] { "ST (0,1)", "K (0,1)" })] public class PMax : MatriksIndicator { [DefaultValue(10)] public int AtrPeriod { get; set; } [DefaultValue(10)] public int MovPeriod { get; set; } [DefaultValue(3)] public decimal Coeff { get; set; } [DefaultValue(MovMethod.E)] public MovMethod MovMethod { get; set; } WILDERS wilders; MOV mov; public sealed override void OnInit() { wilders = new WILDERS(AtrPeriod); mov = new MOV(MovPeriod, MovMethod); } Dictionary<int, decimal> fubDict = new Dictionary<int, decimal>(); Dictionary<int, decimal> flbDict = new Dictionary<int, decimal>(); public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime) { SetLine(currentBar, 0); SetLine(1, currentBar, 0); if (currentBar < AtrPeriod) { fubDict[currentBar] = 0; flbDict[currentBar] = 0; return ; } if (currentBar - 1 < 0 || !Instrument.SymbolBarData.Close.ContainsKey(currentBar - 1)) return ; var high = Instrument.SymbolBarData.High[currentBar]; var low = Instrument.SymbolBarData.Low[currentBar]; var diff = high - low; var range2 = Math.Abs(high - Instrument.SymbolBarData.Close[currentBar - 1]); var range3 = Math.Abs(low - Instrument.SymbolBarData.Close[currentBar - 1]); var value = Math.Max(diff, Math.Max(range2, range3)); wilders.Update(value, currentBar, barDateTime); mov.Update((high + low) / 2, currentBar, barDateTime); var k = mov.CurrentValue; var offset = Coeff * wilders.CurrentValue; var str = k + offset; var sts = k - offset; var prev = Value[0][currentBar -1]; var fub = str<prev || Ref(mov, -1) >prev? str:prev; var flb = sts>prev || Ref(mov, -1) <prev? sts:prev; fubDict[currentBar] = fub; flbDict[currentBar] = flb; var st = prev == fubDict[currentBar -1] && k<fub? fub : (prev == fubDict[currentBar -1] && k>fub? flb:(prev == flbDict[currentBar -1] && k>flb? flb :(prev == flbDict[currentBar -1] && k<flb? fub:fub))); SetLine(currentBar, st); SetLine(1, currentBar, k); } } }