Chandelier Exit

Kant-en-klare, geteste indicatoren en handelssystemen
Plaats reactie
Eric
Berichten: 2910
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Chandelier Exit

Bericht door Eric » vr jun 08, 2007 2:54 pm

Ad Nooten bespreekt in de TKA van juni 2007 een aantal stoploss systemen, waaronder de Chandelier Exit van Chuck Lebeau. Meer info over deze exitstrategie is te vinden op http://www.traderclub.com/discus/messag ... 19991048pm.

Ik heb verschillende uitvoeringen van deze stoploss gezien. In deze versie wordt het stoploss niveau uitsluitend aangepast wanneer een nieuwe high(/low) wordt neergezet.

Code: Selecteer alles

{- Filename: Chandelier Exit -}

{ zie http://www.traderclub.com/discus/messages/107/477.html?FridayDecember319991048pm }

type
  TState = (stUnknown, stLong, stShort);
  
function ChandelierExit(sHigh, sLow, sClose: TSeries;
                        ATRPeriode: integer;
                        ATRFactor: real;
                        var sSignals: TBuySellSignals): TSeries;
var
  i, Count: integer;
  HH, LL, Stop, LStop, HStop: real;
  State: TState;
  sATR: TSeries;
begin
  Count := GetArrayLength(Close);
  Result := CreateSeries(Count);
  SetArrayLength(sSignals, Count);
  
  State := stUnknown;
  HH := -999999;
  LL := 999999;
  Stop := 0;
  sATR := MA(TrueRange(High, Low, Close), maSimple, ATRPeriode);
  for i:=0 to Count-1 do
  begin
    if (i >= ATRPeriode) and IsValid(sATR[i]) then
    begin
      case State of
        stLong:
        begin
          if High[i] > HH then
          begin
            HH := High[i];
            Stop := HH - ATRFactor * sATR[i];
          end;
          if Close[i] <= Stop then
          begin
            State := stShort;
            sSignals[i] := sgEnterShort;
            LL := Low[i];
            Stop := LL + ATRFactor * sATR[i];
          end;
          Result[i] := Stop;
        end;
        stShort:
        begin
          if Low[i] < LL then
          begin
            LL := Low[i];
            Stop := LL + ATRFactor * sATR[i];
          end;
          if Close[i] >= Stop then
          begin
            State := stLong;
            sSignals[i] := sgEnterLong;
            HH := High[i];
            Stop := HH - ATRFactor * sATR[i];
          end;
          Result[i] := Stop;
        end else
        begin
          if Low[i] < LL then
          begin
            LL := Low[i];
            LStop := LL + ATRFactor * sATR[i];
          end;
          if High[i] > HH then
          begin
            HH := High[i];
            HStop := HH - ATRFactor * sATR[i];
          end;
          if Close[i] <= HStop then
          begin
            State := stShort;
            LL := Low[i];
            Stop := LL + ATRFactor * sATR[i];
          end else
          if Close[i] >= LStop then
          begin
            State := stLong;
            HH := High[i];
            Stop := HH - ATRFactor * sATR[i];
          end;
        end;
      end;
    end;
  end;
end;

var
  ATRPeriode: integer;
  ATRFactor: real;
  sChandelierExit: TSeries;
begin
{ Indicator parameters }
  ATRPeriode := CreateParameterInteger('ATR periode', 1, 999, 20, true);
  ATRFactor := CreateParameterReal('ATR factor', 0, 999, 3, true);

{ Indicator eigenschappen }
  with Indicator do 
  begin
    NewBand := false;
    ScaleRange := srCommon;
{ Aantal benodigde koersen om eerste indicatorwaarde te berekenen }
    RequiredBars := 3*ATRPeriode;
  end;

  sChandelierExit := ChandelierExit(High, Low, Close, ATRPeriode, ATRFactor, Signals);

{ Indicatorberekening (als voorbeeld hier een moving average) }
  with CreateLine(sChandelierExit) do
  begin
    Name := 'ChandelierExit';
    Color := clSilver;
  end;
end.

Plaats reactie