Kıvanç Özbilgiç tarafından çevrilen bu indikatör ATR değerlerini kullanarak yüksek düşük fiyat hareketlerine göre gösterge oluşturur.
Fiyatın bu gösterge altına inmesi stop üstünde olması alım olarak yorumlanır
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;
/*
▂ ▃ ▅ ▆ █ KRİPEX █ ▆ ▅ ▃ ▂
K1:=input("Period",1,500,22);
K2:=input("ATR Period",1,500,22);
mult:=input("ATR Çarpani",1,20,3);
ShortStop:=llv(l, K1) + mult * atre(K2);
LongStop:=hhv(h, K1) - mult * atre(K2);
FINALUPPERBAND:=IF(ShortStop<Prev or Ref(c,-1)>Prev,ShortStop,Prev);
FINALLOWERBAND:=IF(LongStop>Prev or Ref(c,-1)<Prev,LongStop,Prev);
ChandelierEXIT:=IF(REF(FINALUPPERBAND,-1)=Prev and C>FINALUPPERBAND,FINALLOWERBAND,IF(Prev=Ref(FINALLOWERBAND,-1) and C>=FINALLOWERBAND,FINALLOWERBAND,IF(Prev=Ref(FINALLOWERBAND,-1) and C<FINALLOWERBAND,FINALUPPERBAND,FINALUPPERBAND)));
ChandelierEXIT
Chandelier Exit Matriks Indicator Builder Formülü:
KIVANÇ @fr3762 on twitter
*/
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("ChandelierEXITKripex", IndicatorDrawingArea.OnDataSeries)]
//Indikatörün çizgilerinin isimleri
[IndicatorLineInformationAttribute(new []
{
"cEXIT(0)"
})]
public class ChandelierEXITKripex : MatriksIndicator
{
//Indicator opsiyon panelinde değerleri değiştirebildiğimiz parametreler. Int, Bool, Decimal ve Enum değerleri alabilir.Tüm değişken tiplerini DefaultValue ile tanımlarız.
[DefaultValue(22)]
public int Period
{
get; set;
}
[DefaultValue(22)]
public int AtrPeriod
{
get; set;
}
[DefaultValue(3)]
public decimal AtrCarpani
{
get; set;
}
ATRE atre;
public sealed override void OnInit()
{
atre = ATREIndicator(Symbol, SymbolPeriod, OHLCType.Close, AtrPeriod);
}
List<decimal> upperList = new List<decimal>();
List<decimal> lowerList = new List<decimal>();
public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
{
var close = Instrument.SymbolBarData.Close[currentBar];
var prevClose = Instrument.SymbolBarData.Close.ContainsKey(CurrentIndex -1) ? Instrument.SymbolBarData.Close[currentBar -1] :0;
if (currentBar < Period)
{
SetLine(0, currentBar, 0);
upperList.Add(0);
lowerList.Add(0);
return ;
}
var llv = LowestLow(OHLCType.Low, Period);
var hhv = HighestHigh(OHLCType.High, Period);
var shortStop = llv + AtrCarpani * atre.CurrentValue;
var longStop = hhv - AtrCarpani * atre.CurrentValue;
var prevUpper = upperList[currentBar -1];
var upper = shortStop<prevUpper || prevClose>prevUpper? shortStop:prevUpper;
upperList.Add(upper);
var prevLower = lowerList[currentBar -1];
var lower = longStop>prevLower || prevClose<prevLower? longStop:prevLower;
lowerList.Add(lower);
var prevExit = Value[0][CurrentIndex -1];
var ChandelierEXIT = prevUpper == prevExit && close>upper? lower:
(prevExit == prevLower && close >= lower? lower:
(prevExit == prevLower && close<lower? upper:upper));
SetLine(0, currentBar, upper);
}
}
}