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