MACD histogram trading

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
Plaats reactie
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

MACD histogram trading

Bericht door vincent »

Beste Eric, zover ik weet is deze code nog niet beschikbaar op deze website. Kan jij hem maken svp? (zie link)

The MACD Histogram bar must have fallen 4 days in a row.
The fourth latest bar must have been below zero.
The current close of the ETF/index must be lower than the day before.
Entry is on the close. The exit is on the first day when the close is higher than the day before

(en optie van stapelbare aankopen als MACD nog een extra dag/dagen daalt)
(met als toevoeging graag een optie voor niet verkopen op 'close higher', maar verkoop op een instelbare takeprofit in 0,1% gradaties)

https://www.quantifiedstrategies.com/macd-histogram/

Dank en met groet, Vincent
Eric
Berichten: 3460
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: MACD histogram trading

Bericht door Eric »

Ik maak er twee systemen van - verschillende handelsregels in hetzelfde script is nooit erg overzichtelijk.

Eerste (verkoop op hogere slot):

Code: Selecteer alles

{- Filename: MACD system 1 -}

var
  nMA1, nMA2, nMA3, i, DownCount, MP: integer;
  sMACD, sMA, sMACDH, sZero: TSeries;
  bStack: boolean;
begin
  nMA1 := CreateParameterInteger('MACD 1', 1, 999, 12, true);
  nMA2 := CreateParameterInteger('MACD 2', 1, 999, 26, true);
  nMA3 := CreateParameterInteger('MACD 3', 1, 999, 9, true);
  bStack := CreateParameterBoolean('Stapel trades', true, true);

  with Indicator do
  begin
    RequiredBars := 5*(nMA2+nMA3);
    StackedSignals := true;
  end;

  sMACD := MACD(Close, nMA1, nMA2);
  sMA := MA(sMACD, maExponential, nMA3);
  sMACDH := SubtractSeries(sMACD, sMA);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  for i:=FirstValidIndex(sMACDH)+1 to BarCount-1 do
  begin
    if MP > 0 then
    begin
      if Close[i] > Close[i-1] then
      begin
        SetOrderSize(MP);
        ExitLong(i);
        MP := 0;
        DownCount := 0;
      end;
    end;
    
    if sMACDH[i] < sMACDH[i-1] then DownCount := DownCount+1 else DownCount := 0;
    if bStack and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        EnterLong(i);
        MP := MP+1;
      end;
    end else
    if (MP = 0) and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        EnterLong(i);
        MP := 1;
      end;
    end;
  end;

  with CreateLine(sMACDH) do
  begin
    Name := 'MACDH';
    Color := clNavy;
    LineType := ltBar;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end. 
---
Eric
Eric
Berichten: 3460
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: MACD histogram trading

Bericht door Eric »

En voor de variant met de take profit graag nog aangeven wat het profit niveau is bij gestapelde entries. Het onthouden van de individuele trade niveaus zou het wel erg ingewikkeld maken, en in een tegenzittende markt tot een oneindige stapeling van entries kunnen leiden.

---
Eric
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

Re: MACD histogram trading

Bericht door vincent »

Ik heb onthouden dat jij programmeren met 'stapelingen' erg onhandig/omslachtig vindt.
Is het mogelijk om de stapeling tot maximaal 4 signalen in het totaal te beperken?
En dan over die maximaal 4 stuks de gemiddeld prijs te gebruiken en daar dan de 'takeprofit' over grens over te berekeken?

Indien dit te omslachtig is om te maken, dan enkel een takeprofit over het eerste signaal in 0,1% gradaties;.
Het gevolg van het stapeling-deel (dat dan nog wel getoond wordt) bereken ik dan zelf wel met de hand.

Dank en met groet, Vincent
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

Re: MACD histogram trading

Bericht door vincent »

Ziet er mooi uit. Zoals verwacht een relatief laag aantal signalen per jaar (op daggrafiek), maar het lijkt een goed hitratio te hebben.
Ik ga ermee stoeien :)
Eric schreef: vr jan 27, 2023 12:24 pm Ik maak er twee systemen van - verschillende handelsregels in hetzelfde script is nooit erg overzichtelijk.

Eerste (verkoop op hogere slot):

Code: Selecteer alles

{- Filename: MACD system 1 -}

var
  nMA1, nMA2, nMA3, i, DownCount, MP: integer;
  sMACD, sMA, sMACDH, sZero: TSeries;
  bStack: boolean;
begin
  nMA1 := CreateParameterInteger('MACD 1', 1, 999, 12, true);
  nMA2 := CreateParameterInteger('MACD 2', 1, 999, 26, true);
  nMA3 := CreateParameterInteger('MACD 3', 1, 999, 9, true);
  bStack := CreateParameterBoolean('Stapel trades', true, true);

  with Indicator do
  begin
    RequiredBars := 5*(nMA2+nMA3);
    StackedSignals := true;
  end;

  sMACD := MACD(Close, nMA1, nMA2);
  sMA := MA(sMACD, maExponential, nMA3);
  sMACDH := SubtractSeries(sMACD, sMA);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  for i:=FirstValidIndex(sMACDH)+1 to BarCount-1 do
  begin
    if MP > 0 then
    begin
      if Close[i] > Close[i-1] then
      begin
        SetOrderSize(MP);
        ExitLong(i);
        MP := 0;
        DownCount := 0;
      end;
    end;
    
    if sMACDH[i] < sMACDH[i-1] then DownCount := DownCount+1 else DownCount := 0;
    if bStack and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        EnterLong(i);
        MP := MP+1;
      end;
    end else
    if (MP = 0) and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        EnterLong(i);
        MP := 1;
      end;
    end;
  end;

  with CreateLine(sMACDH) do
  begin
    Name := 'MACDH';
    Color := clNavy;
    LineType := ltBar;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end. 
---
Eric
Laatst gewijzigd door vincent op vr jan 27, 2023 4:54 pm, 2 keer totaal gewijzigd.
Eric
Berichten: 3460
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: MACD histogram trading

Bericht door Eric »

vincent schreef: vr jan 27, 2023 4:14 pm Ik heb onthouden dat jij programmeren met 'stapelingen' erg onhandig/omslachtig vindt.
Is het mogelijk om de stapeling tot maximaal 4 signalen in het totaal te beperken?
En dan over die maximaal 4 stuks de gemiddeld prijs te gebruiken en daar dan de 'takeprofit' over grens over te berekeken?
Het is niet zozeer dat stapelingen onhandig zijn, maar zoals ik al schetste is het onthouden van (in theorie) een onbeperkt aantal entry-prijzen en het vervolgens telkens aflopen van al de entry-prijzen om te kijken welke trades aan de take profit voldoen erg omslachtig.

Wanneer je je beperkt tot het gemiddelde van de entryprijzen en er dus maar 1 stoploss hoeft te worden bewaakt wordt het al een stuk overzichtelijker, en is er wat mij betreft geen reden om het aantal gestapelde trades te beperken tot 4 (sterker nog, liever geen beperking tot 4).

Zeg het maar of dat ok is.

---
Eric
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

Re: MACD histogram trading

Bericht door vincent »

Deze graag en dan zonder de beperkingen :-) "Wanneer je je beperkt tot het gemiddelde van de entryprijzen en er dus maar 1 stoploss hoeft te worden bewaakt wordt het al een stuk overzichtelijker"...
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

Re: MACD histogram trading

Bericht door vincent »

Beste Eric,

Als ik naar de tradingsimulatie kijk dan gebeurt er iets wat ik nog niet snap.
(Plaatje is de Dow dag-grafiek aug/sep '12. Tradingsimulatie long, gestapeld)
Afbeelding
Er worden een dubbel signaal geopend op de 27ste.
Één wordt er verkocht op de witte pijl van 28-8 (dat lijkt te kloppen)
De ander blijft doorlopen en wordt verkocht op het einde van de getoonde grafiek (17 sep in dit geval).
Ook het koopsignaal van de 28ste wordt niet op de witte pijl verkocht maar op 17 sep..
Kan het zijn at de code nog niet goed werkt?

Met groet, Vincent

Eric schreef: vr jan 27, 2023 12:24 pm Ik maak er twee systemen van - verschillende handelsregels in hetzelfde script is nooit erg overzichtelijk.

Eerste (verkoop op hogere slot):

Code: Selecteer alles

{- Filename: MACD system 1 -}

var
  nMA1, nMA2, nMA3, i, DownCount, MP: integer;
  sMACD, sMA, sMACDH, sZero: TSeries;
  bStack: boolean;
begin
  nMA1 := CreateParameterInteger('MACD 1', 1, 999, 12, true);
  nMA2 := CreateParameterInteger('MACD 2', 1, 999, 26, true);
  nMA3 := CreateParameterInteger('MACD 3', 1, 999, 9, true);
  bStack := CreateParameterBoolean('Stapel trades', true, true);

  with Indicator do
  begin
    RequiredBars := 5*(nMA2+nMA3);
    StackedSignals := true;
  end;

  sMACD := MACD(Close, nMA1, nMA2);
  sMA := MA(sMACD, maExponential, nMA3);
  sMACDH := SubtractSeries(sMACD, sMA);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  for i:=FirstValidIndex(sMACDH)+1 to BarCount-1 do
  begin
    if MP > 0 then
    begin
      if Close[i] > Close[i-1] then
      begin
        SetOrderSize(MP);
        ExitLong(i);
        MP := 0;
        DownCount := 0;
      end;
    end;
    
    if sMACDH[i] < sMACDH[i-1] then DownCount := DownCount+1 else DownCount := 0;
    if bStack and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        EnterLong(i);
        MP := MP+1;
      end;
    end else
    if (MP = 0) and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        EnterLong(i);
        MP := 1;
      end;
    end;
  end;

  with CreateLine(sMACDH) do
  begin
    Name := 'MACDH';
    Color := clNavy;
    LineType := ltBar;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end. 
---
Eric
Eric
Berichten: 3460
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: MACD histogram trading

Bericht door Eric »

Er zat inderdaad nog iets fout, probeer het eens met deze:

Code: Selecteer alles

{- Filename: MACD system 1 -}

var
  nMA1, nMA2, nMA3, i, DownCount, MP: integer;
  sMACD, sMA, sMACDH, sZero: TSeries;
  bStack: boolean;
begin
  nMA1 := CreateParameterInteger('MACD 1', 1, 999, 12, true);
  nMA2 := CreateParameterInteger('MACD 2', 1, 999, 26, true);
  nMA3 := CreateParameterInteger('MACD 3', 1, 999, 9, true);
  bStack := CreateParameterBoolean('Stapel trades', true, true);

  with Indicator do
  begin
    RequiredBars := 5*(nMA2+nMA3);
    StackedSignals := true;
  end;

  sMACD := MACD(Close, nMA1, nMA2);
  sMA := MA(sMACD, maExponential, nMA3);
  sMACDH := SubtractSeries(sMACD, sMA);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  for i:=FirstValidIndex(sMACDH)+1 to BarCount-1 do
  begin
    if sMACDH[i] < sMACDH[i-1] then DownCount := DownCount+1 else DownCount := 0;

    if (MP > 0) and (Close[i] > Close[i-1]) then
    begin
      SetOrderSize(MP);
      ExitLong(i);
      MP := 0;
      DownCount := 0;
    end else
    if (MP = 0) and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        SetOrderSize(1);
        EnterLong(i);
        MP := 1;
      end;
    end else
    if bStack and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        SetOrderSize(1);
        EnterLong(i);
        MP := MP+1;
      end;
    end;
  end;

  with CreateLine(sMACDH) do
  begin
    Name := 'MACDH';
    Color := clNavy;
    LineType := ltBar;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end.
---
Eric
Eric
Berichten: 3460
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: MACD histogram trading

Bericht door Eric »

En de variant met de exit bij takeprofit (berekend bij slotkoers):

Code: Selecteer alles

{- Filename: MACD system 2 -}

var
  nMA1, nMA2, nMA3, i, DownCount, MP: integer;
  Entry, nTP, TPLevel, TPCount: real;
  sMACD, sMA, sMACDH, sZero, sTP: TSeries;
  bStack: boolean;
begin
  nMA1 := CreateParameterInteger('MACD 1', 1, 999, 12, true);
  nMA2 := CreateParameterInteger('MACD 2', 1, 999, 26, true);
  nMA3 := CreateParameterInteger('MACD 3', 1, 999, 9, true);
  bStack := CreateParameterBoolean('Stapel trades', true, true);
  nTP := CreateParameterReal('Take profit %', 0, 99, 1, true);

  with Indicator do
  begin
    RequiredBars := 5*(nMA2+nMA3);
    StackedSignals := true;
  end;

  sMACD := MACD(Close, nMA1, nMA2);
  sMA := MA(sMACD, maExponential, nMA3);
  sMACDH := SubtractSeries(sMACD, sMA);
  sZero := FillSeries(CreateSeries(BarCount), 0);
  sTP := CreateSeries(BarCount);

  for i:=FirstValidIndex(sMACDH)+1 to BarCount-1 do
  begin
    if sMACDH[i] < sMACDH[i-1] then DownCount := DownCount+1 else DownCount := 0;
    
    if (MP > 0) and (Close[i] > TPLevel) then
    begin
      SetOrderSize(MP);
      ExitLong(i);
      MP := 0;
      DownCount := 0;
    end else
    if (MP = 0) and (DownCount >= 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        SetOrderSize(1);
        EnterLong(i);
        MP := 1;
        TPLevel := Close[i]*(100+nTP)/100;
        TPCount := 1;
        sTP[i] := TPLevel;
      end;
    end else
    if bStack and (DownCount > 4) then
    begin
      if (sMACDH[i-3] < 0) and (Close[i] < Close[i-1]) then
      begin
        SetOrderSize(1);
        EnterLong(i);
        MP := MP+1;
        TPLevel := TPLevel*TPCount/(TPCount+1) + Close[i]*(100+nTP)/100/(TPCount+1);
        TPCount := TPCount+1;
        sTP[i] := TPLevel;
      end;
    end;
  end;
  
  with CreateLine(sMACDH) do
  begin
    Name := 'MACDH';
    Color := clNavy;
    LineType := ltBar;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
  with CreateLine(sTP) do
  begin
    Color := clYellow;
    LineType := ltDot;
    Visible := false;
  end;
end.
---
Eric
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

Re: MACD histogram trading

Bericht door vincent »

Dank Eric, volgens mij gaat dit helemaal goed komen :-).
Echter er lijkt nog 'iets een extra rondje te lopen'.
Er komt (soms) een 2de signaal in de TVS te staan die er volgens mij niet in hoort?

Afbeelding
(Nasdaq-dag, standaard instelling)
Eric
Berichten: 3460
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: MACD histogram trading

Bericht door Eric »

Ik zie het, ik heb hem hierboven verbeterd.

---
Eric
vincent
Berichten: 382
Lid geworden op: di jan 04, 2011 12:20 pm

Re: MACD histogram trading

Bericht door vincent »

Mijn dank is weer groot Eric :-)
Plaats reactie