macd combo

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » di mei 29, 2018 8:02 pm

Code: Selecteer alles

{- Filename: Tesjoeva's MACD system 2 -}

function HullMA(Prices: TSeries; Period: integer): TSeries;
begin
// Integer (Square Root (Period)) WMA [2 x Integer (Period/2) WMA (Price) - Period WMA (Price)]
//  waverage(2 * waverage(close, period/2) - waverage(close,period), SquareRoot(Period))
  Result := MA(SubtractSeries(MultiplySeriesBy(MA(Prices, maWeighted, Period div 2), 2),
                              MA(Prices, maWeighted, Period)),
               maWeighted, trunc(sqrt(Period)));
end;

type
  TSigTrigger = (trNone, trLong, trShort, trExitLong, trExitShort);

var
  SigTrigger: TSigTrigger;
  nHullMA1, nHullMA2, nMA1, nMA2, i, iFirst, Period, Displace, Trigger, Mom1, Mom2, Mom3, MP: integer;
  TPLevel, TP: real;
  sHullMACD, sMACD, sHullDiff, sDiff, sZero, sMom1, sMom2, sMom3: TSeries;
  sLR, sLRSlope, sForecast, sMAFc: TSeries;
begin
  nHullMA1 := CreateParameterInteger('Hull''s MA periode 1', 1, 999, 13, true);
  nHullMA2 := CreateParameterInteger('Hull''s MA periode 2', 1, 999, 26, true);
  nMA1 := CreateParameterInteger('MA periode 1', 1, 999, 13, true);
  nMA2 := CreateParameterInteger('MA periode 2', 1, 999, 26, true);
  Period   := CreateParameterInteger('T3 Period', 1, 999, 20, true);
  Displace := CreateParameterInteger('T3 Displace LRF', 0, 999, 0, false);
  Trigger  := CreateParameterInteger('T3 EMA over LRF', 1, 999, 5, true);
  TP  := CreateParameterReal('Take profit (pt)', 0, 9999, 10, true);
  Mom1 := CreateParameterInteger('Mom 1', 1, 999, 1, true);
  Mom2 := CreateParameterInteger('Mom 2', 1, 999, 5, true);
  Mom3 := CreateParameterInteger('Mom 3', 1, 999, 10, true);

  with Indicator do
  begin
    RequiredBars := MaxInt(MaxInt(5*(nMA1+nMA2), nHullMA1+nHullMA2), 5*Period)+Mom1+Mom2+MOm3;
    AdvancedTrades := true;
  end;
  
  sHullMACD := SubtractSeries(HullMA(Close, nHullMA1), HullMA(Close, nHullMA2));
  sHullDiff := Momentum(sHullMACD, 1);

  sMACD := MACD(Close, nMA1, nMA2);
  sDiff := Momentum(sMACD, 1);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  sLR       := MovingRegression(Close,Period);
  sLRSlope  := MovingRegressionSlope(Close,Period);
  sForecast := ShiftSeries(AddSeries(sLR,sLRSlope),Displace);
  sMAFc     := MA(sForecast,MaExponential,Trigger);

  sMom1 := Momentum(Close, Mom1);
  sMom2 := Momentum(Close, Mom2);
  sMom3 := Momentum(Close, Mom3);

  iFirst := MaxInt(MaxInt(MaxInt(MaxInt(MaxInt(FirstvalidIndex(sHullDiff), FirstValidIndex(sDiff)),
    FirstValidIndex(sMAFc)), FirstValidIndex(sMom1)), FirstValidIndex(sMom2)), FirstValidIndex(sMom3));
  for i:=iFirst+1 to BarCount-1 do
  begin
    if SigTrigger = trLong then
    begin
      if EnterLongAtOpen(i) then
      begin
        MP := 1;
        if i < Barcount-1 then TPLevel := Open[i] + TP;
      end;
      SigTrigger := trNone;
    end else
    if SigTrigger = trShort then
    begin
      if EnterShortAtOpen(i) then
      begin
        MP := -1;
        if i < Barcount-1 then TPLevel := Open[i] - TP;
      end;
      SigTrigger := trNone;
    end else
    if SigTrigger = trExitLong then
    begin
      ExitLongAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if SigTrigger = trExitShort then
    begin
      ExitShortAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if (MP > 0) and (High[i] >= TPLevel) then
    begin
      ExitLongLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 0) and (Low[i] <= TPLevel) then
    begin
      ExitShortLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 1) and (sHullDiff[i] > 0) and (sDiff[i] > 0) and (sDiff[i] > sDiff[i-1]) and (sMAFc[i] < sForecast[i]) and
       (sMom1[i] > 0) and (sMom2[i] > 0) and (sMom3[i] > 0) then
    begin
      SigTrigger := trLong;
    end else
    if (MP > -1) and (sHullDiff[i] < 0) and (sDiff[i] < 0) and (sDiff[i] < sDiff[i-1]) and (sMAFc[i] >= sForecast[i]) and
       (sMom1[i] < 0) and (sMom2[i] < 0) and (sMom3[i] < 0) then
    begin
      SigTrigger := trShort;
    end else
    if (MP > 0) and (sMAFc[i] >= sForecast[i]) then
    begin
      SigTrigger := trExitLong;
    end else
    if (MP < 0) and (sMAFc[i] < sForecast[i]) then
    begin
      SigTrigger := trExitShort;
    end;
  end;
  
  with CreateLine(sDiff) do
  begin
    Color := clLime;
  end;
  with CreateLine(sHullDiff) do
  begin
    Color := clYellow;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end.   
Hallo Eric,

Ik heb hier vandaag een entry op 556+ in de AEX (short)
De koers is gezakt tot iets boven 550, met een Profit target op 3.5 punt.

Deze is echter niet gegaan, iets dat ik vaker tegenkom.....
Dit komt bij verschillende timeframes voor, maar volkomen willekeurig (meestal gaat het goed)

Kun je er even naar kijken voor me, alvast bedankt en groet,

Eric
Berichten: 3048
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Re: macd combo

Bericht door Eric » di mei 29, 2018 8:42 pm

Een dag-grafiek kan geen meerdere signalen (entry en exit) op dezelfde dag geven. Dit geldt voor alle intervallen, per bar kan maar 1 signaal optreden.

---
Eric

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » wo mei 30, 2018 10:34 am

Hallo Eric,

Ik snap dat er geen twee signalen op 1 bar kunnen komen, maar......

de positie zou toch tenminste gesloten moeten zijn met een arrow op de volgende bar.
Nu staat depositie nog gewoon open en is de winst inmiddels omgeslagen naar verlies.

Dat kan natuurlijk niet de bedoeling zijn en verzwakt het systeem aanzienlijk omdat het toch iets vaker voorkomt dan ik had gedacht.

Dit moet toch op te lossen zijn..........

vriendelijke groet

Eric
Berichten: 3048
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Re: macd combo

Bericht door Eric » vr jun 01, 2018 9:33 am

Een exitsignaal op de volgende bar zou inderdaad kunnen:

Code: Selecteer alles

{- Filename: Tesjoeva's MACD system 2 -}

function HullMA(Prices: TSeries; Period: integer): TSeries;
begin
// Integer (Square Root (Period)) WMA [2 x Integer (Period/2) WMA (Price) - Period WMA (Price)]
//  waverage(2 * waverage(close, period/2) - waverage(close,period), SquareRoot(Period))
  Result := MA(SubtractSeries(MultiplySeriesBy(MA(Prices, maWeighted, Period div 2), 2),
                              MA(Prices, maWeighted, Period)),
               maWeighted, trunc(sqrt(Period)));
end;

type
  TSigTrigger = (trNone, trLong, trShort, trExitLong, trExitShort);

var
  SigTrigger: TSigTrigger;
  nHullMA1, nHullMA2, nMA1, nMA2, i, iFirst, Period, Displace, Trigger, Mom1, Mom2, Mom3, MP: integer;
  TPLevel, TP: real;
  sHullMACD, sMACD, sHullDiff, sDiff, sZero, sMom1, sMom2, sMom3: TSeries;
  sLR, sLRSlope, sForecast, sMAFc: TSeries;
begin
  nHullMA1 := CreateParameterInteger('Hull''s MA periode 1', 1, 999, 13, true);
  nHullMA2 := CreateParameterInteger('Hull''s MA periode 2', 1, 999, 26, true);
  nMA1 := CreateParameterInteger('MA periode 1', 1, 999, 13, true);
  nMA2 := CreateParameterInteger('MA periode 2', 1, 999, 26, true);
  Period   := CreateParameterInteger('T3 Period', 1, 999, 20, true);
  Displace := CreateParameterInteger('T3 Displace LRF', 0, 999, 0, false);
  Trigger  := CreateParameterInteger('T3 EMA over LRF', 1, 999, 5, true);
  TP  := CreateParameterReal('Take profit (pt)', 0, 9999, 10, true);
  Mom1 := CreateParameterInteger('Mom 1', 1, 999, 1, true);
  Mom2 := CreateParameterInteger('Mom 2', 1, 999, 5, true);
  Mom3 := CreateParameterInteger('Mom 3', 1, 999, 10, true);

  with Indicator do
  begin
    RequiredBars := MaxInt(MaxInt(5*(nMA1+nMA2), nHullMA1+nHullMA2), 5*Period)+Mom1+Mom2+MOm3;
    AdvancedTrades := true;
  end;
  
  sHullMACD := SubtractSeries(HullMA(Close, nHullMA1), HullMA(Close, nHullMA2));
  sHullDiff := Momentum(sHullMACD, 1);

  sMACD := MACD(Close, nMA1, nMA2);
  sDiff := Momentum(sMACD, 1);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  sLR       := MovingRegression(Close,Period);
  sLRSlope  := MovingRegressionSlope(Close,Period);
  sForecast := ShiftSeries(AddSeries(sLR,sLRSlope),Displace);
  sMAFc     := MA(sForecast,MaExponential,Trigger);

  sMom1 := Momentum(Close, Mom1);
  sMom2 := Momentum(Close, Mom2);
  sMom3 := Momentum(Close, Mom3);

  iFirst := MaxInt(MaxInt(MaxInt(MaxInt(MaxInt(FirstvalidIndex(sHullDiff), FirstValidIndex(sDiff)),
    FirstValidIndex(sMAFc)), FirstValidIndex(sMom1)), FirstValidIndex(sMom2)), FirstValidIndex(sMom3));
  for i:=iFirst+1 to BarCount-1 do
  begin
    if SigTrigger = trLong then
    begin
      SigTrigger := trNone;
      if EnterLongAtOpen(i) then
      begin
        MP := 1;
        if i < Barcount-1 then TPLevel := Open[i] + TP;
        if High[i] >= TPLevel then SigTrigger := trExitLong; // exit next bar if TP level reached in opening bar
      end;
    end else
    if SigTrigger = trShort then
    begin
      SigTrigger := trNone;
      if EnterShortAtOpen(i) then
      begin
        MP := -1;
        if i < Barcount-1 then TPLevel := Open[i] - TP;
        if Low[i] <= TPLevel then SigTrigger := trExitShort; // exit next bar if TP level reached in opening bar
      end;
    end else
    if SigTrigger = trExitLong then
    begin
      ExitLongAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if SigTrigger = trExitShort then
    begin
      ExitShortAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if (MP > 0) and (High[i] >= TPLevel) then
    begin
      ExitLongLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 0) and (Low[i] <= TPLevel) then
    begin
      ExitShortLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 1) and (sHullDiff[i] > 0) and (sDiff[i] > 0) and (sDiff[i] > sDiff[i-1]) and (sMAFc[i] < sForecast[i]) and
       (sMom1[i] > 0) and (sMom2[i] > 0) and (sMom3[i] > 0) then
    begin
      SigTrigger := trLong;
    end else
    if (MP > -1) and (sHullDiff[i] < 0) and (sDiff[i] < 0) and (sDiff[i] < sDiff[i-1]) and (sMAFc[i] >= sForecast[i]) and
       (sMom1[i] < 0) and (sMom2[i] < 0) and (sMom3[i] < 0) then
    begin
      SigTrigger := trShort;
    end else
    if (MP > 0) and (sMAFc[i] >= sForecast[i]) then
    begin
      SigTrigger := trExitLong;
    end else
    if (MP < 0) and (sMAFc[i] < sForecast[i]) then
    begin
      SigTrigger := trExitShort;
    end;
  end;
  
  with CreateLine(sDiff) do
  begin
    Color := clLime;
  end;
  with CreateLine(sHullDiff) do
  begin
    Color := clYellow;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end.
---
Eric

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » vr jun 01, 2018 6:06 pm

Dank je en vriendelijke groet.

Even iets totaal anders:

Is het mogelijk indicatoren af te schermen zodat een gebruiker wel full functional deze kan
gebruiken, maar niet kan 'doorklikken' om te zien wat jij gemaakt hebt cq niet kan kopieeren.

Ik wil een kennis wel wat ter hand stellen maar niet in de keuken laten kijken.

petdev
Berichten: 76
Lid geworden op: wo jun 12, 2013 4:25 pm

Re: macd combo

Bericht door petdev » za jun 02, 2018 1:56 pm

Mijns inziens staat deze site voor kennis-verbreding en openheid t.a.v. code.
Zelf heb je hier volledig inzicht in de keuken. En er al vaak gratis gebruik van gemaakt.
Vraag me dus af wat de reden is dit een ander te onthouden.

Overigens: Er is de mogelijkheid tot maatwerk (zie Forumoverzicht / Diensten; onderaan de hoofdpagina).

Quote:
Kunnen uw vragen hier niet worden beantwoord, of wilt u uw handelssysteem liever niet in de openbaarheid brengen?

TA-script.com heeft alle expertise in huis om uw handelssysteem te implementeren.

Neem contact op met admin@ta-script.com voor een goed advies. Prijzen afhankelijk van de complexiteit, vanaf circa 250 euro.
Unquote.

Eric
Berichten: 3048
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Re: macd combo

Bericht door Eric » zo jun 03, 2018 5:41 pm

Het is mogelijk om de code te scramblen, maar alleen via mij. Ik heb het tot nu toe in 2 gevallen toegepast, in één geval had de bedenker zelf ook de systemen in TA-script geïmplementeerd, in het tweede geval heeft de bedenker betaald voor de TA-script ontwikkeling. Als het om een systeem gaat dat hier op forum is gemaakt, dan neig ik ernaar om het niet te doen. Vergelijk wat hier aan TA-script code wordt gepubliceerd met een GNU GPL software licentie; je mag het gebruiken, je mag het doorgeven of verkopen aan een ander, maar je moet de broncode erbij leveren.

---
Eric

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » ma jun 11, 2018 10:01 pm

Code: Selecteer alles

{- Filename: Tesjoeva's MACD system 2 -}

function HullMA(Prices: TSeries; Period: integer): TSeries;
begin
// Integer (Square Root (Period)) WMA [2 x Integer (Period/2) WMA (Price) - Period WMA (Price)]
//  waverage(2 * waverage(close, period/2) - waverage(close,period), SquareRoot(Period))
  Result := MA(SubtractSeries(MultiplySeriesBy(MA(Prices, maWeighted, Period div 2), 2),
                              MA(Prices, maWeighted, Period)),
               maWeighted, trunc(sqrt(Period)));
end;

type
  TSigTrigger = (trNone, trLong, trShort, trExitLong, trExitShort);

var
  SigTrigger: TSigTrigger;
  nHullMA1, nHullMA2, nMA1, nMA2, i, iFirst, Period, Displace, Trigger, Mom1, Mom2, Mom3, MP: integer;
  TPLevel, TP: real;
  sHullMACD, sMACD, sHullDiff, sDiff, sZero, sMom1, sMom2, sMom3: TSeries;
  sLR, sLRSlope, sForecast, sMAFc: TSeries;
begin
  nHullMA1 := CreateParameterInteger('Hull''s MA periode 1', 1, 999, 13, true);
  nHullMA2 := CreateParameterInteger('Hull''s MA periode 2', 1, 999, 26, true);
  nMA1 := CreateParameterInteger('MA periode 1', 1, 999, 13, true);
  nMA2 := CreateParameterInteger('MA periode 2', 1, 999, 26, true);
  Period   := CreateParameterInteger('T3 Period', 1, 999, 20, true);
  Displace := CreateParameterInteger('T3 Displace LRF', 0, 999, 0, false);
  Trigger  := CreateParameterInteger('T3 EMA over LRF', 1, 999, 5, true);
  TP  := CreateParameterReal('Take profit (pt)', 0, 9999, 10, true);
  Mom1 := CreateParameterInteger('Mom 1', 1, 999, 1, true);
  Mom2 := CreateParameterInteger('Mom 2', 1, 999, 5, true);
  Mom3 := CreateParameterInteger('Mom 3', 1, 999, 10, true);

  with Indicator do
  begin
    RequiredBars := MaxInt(MaxInt(5*(nMA1+nMA2), nHullMA1+nHullMA2), 5*Period)+Mom1+Mom2+MOm3;
    AdvancedTrades := true;
  end;
  
  sHullMACD := SubtractSeries(HullMA(Close, nHullMA1), HullMA(Close, nHullMA2));
  sHullDiff := Momentum(sHullMACD, 1);

  sMACD := MACD(Close, nMA1, nMA2);
  sDiff := Momentum(sMACD, 1);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  sLR       := MovingRegression(Close,Period);
  sLRSlope  := MovingRegressionSlope(Close,Period);
  sForecast := ShiftSeries(AddSeries(sLR,sLRSlope),Displace);
  sMAFc     := MA(sForecast,MaExponential,Trigger);

  sMom1 := Momentum(Close, Mom1);
  sMom2 := Momentum(Close, Mom2);
  sMom3 := Momentum(Close, Mom3);

  iFirst := MaxInt(MaxInt(MaxInt(MaxInt(MaxInt(FirstvalidIndex(sHullDiff), FirstValidIndex(sDiff)),
    FirstValidIndex(sMAFc)), FirstValidIndex(sMom1)), FirstValidIndex(sMom2)), FirstValidIndex(sMom3));
  for i:=iFirst+1 to BarCount-1 do
  begin
    if SigTrigger = trLong then
    begin
      SigTrigger := trNone;
      if EnterLongAtOpen(i) then
      begin
        MP := 1;
        if i < Barcount-1 then TPLevel := Open[i] + TP;
        if High[i] >= TPLevel then SigTrigger := trExitLong; // exit next bar if TP level reached in opening bar
      end;
    end else
    if SigTrigger = trShort then
    begin
      SigTrigger := trNone;
      if EnterShortAtOpen(i) then
      begin
        MP := -1;
        if i < Barcount-1 then TPLevel := Open[i] - TP;
        if Low[i] <= TPLevel then SigTrigger := trExitShort; // exit next bar if TP level reached in opening bar
      end;
    end else
    if SigTrigger = trExitLong then
    begin
      ExitLongAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if SigTrigger = trExitShort then
    begin
      ExitShortAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if (MP > 0) and (High[i] >= TPLevel) then
    begin
      ExitLongLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 0) and (Low[i] <= TPLevel) then
    begin
      ExitShortLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 1) and (sHullDiff[i] > 0) and (sDiff[i] > 0) and (sDiff[i] > sDiff[i-1]) and (sMAFc[i] < sForecast[i]) and
       (sMom1[i] > 0) and (sMom2[i] > 0) and (sMom3[i] > 0) then
    begin
      SigTrigger := trLong;
    end else
    if (MP > -1) and (sHullDiff[i] < 0) and (sDiff[i] < 0) and (sDiff[i] < sDiff[i-1]) and (sMAFc[i] >= sForecast[i]) and
       (sMom1[i] < 0) and (sMom2[i] < 0) and (sMom3[i] < 0) then
    begin
      SigTrigger := trShort;
    end else
    if (MP > 0) and (sMAFc[i] >= sForecast[i]) then
    begin
      SigTrigger := trExitLong;
    end else
    if (MP < 0) and (sMAFc[i] < sForecast[i]) then
    begin
      SigTrigger := trExitShort;
    end;
  end;
  
  with CreateLine(sDiff) do
  begin
    Color := clLime;
  end;
  with CreateLine(sHullDiff) do
  begin
    Color := clYellow;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end.     
Hallo Eric,

Wil je zo vriendelijk zijn deze uit te breiden met een, te optimaliseren, stoploss?

Dank vast en groet,

Eric
Berichten: 3048
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Re: macd combo

Bericht door Eric » di jun 12, 2018 9:18 am

Dat kan:

Code: Selecteer alles

{- Filename: Tesjoeva's MACD system 2 -}

function HullMA(Prices: TSeries; Period: integer): TSeries;
begin
// Integer (Square Root (Period)) WMA [2 x Integer (Period/2) WMA (Price) - Period WMA (Price)]
//  waverage(2 * waverage(close, period/2) - waverage(close,period), SquareRoot(Period))
  Result := MA(SubtractSeries(MultiplySeriesBy(MA(Prices, maWeighted, Period div 2), 2),
                              MA(Prices, maWeighted, Period)),
               maWeighted, trunc(sqrt(Period)));
end;

type
  TSigTrigger = (trNone, trLong, trShort, trExitLong, trExitShort);

var
  SigTrigger: TSigTrigger;
  nHullMA1, nHullMA2, nMA1, nMA2, i, iFirst, Period, Displace, Trigger, Mom1, Mom2, Mom3, MP: integer;
  SLLevel, SL, TPLevel, TP: real;
  sHullMACD, sMACD, sHullDiff, sDiff, sZero, sMom1, sMom2, sMom3: TSeries;
  sLR, sLRSlope, sForecast, sMAFc: TSeries;
begin
  nHullMA1 := CreateParameterInteger('Hull''s MA periode 1', 1, 999, 13, true);
  nHullMA2 := CreateParameterInteger('Hull''s MA periode 2', 1, 999, 26, true);
  nMA1 := CreateParameterInteger('MA periode 1', 1, 999, 13, true);
  nMA2 := CreateParameterInteger('MA periode 2', 1, 999, 26, true);
  Period   := CreateParameterInteger('T3 Period', 1, 999, 20, true);
  Displace := CreateParameterInteger('T3 Displace LRF', 0, 999, 0, false);
  Trigger  := CreateParameterInteger('T3 EMA over LRF', 1, 999, 5, true);
  TP  := CreateParameterReal('Take profit (pt)', 0, 9999, 10, true);
  SL  := CreateParameterReal('Stoploss (pt)', 0, 9999, 10, true);
  Mom1 := CreateParameterInteger('Mom 1', 1, 999, 1, true);
  Mom2 := CreateParameterInteger('Mom 2', 1, 999, 5, true);
  Mom3 := CreateParameterInteger('Mom 3', 1, 999, 10, true);

  with Indicator do
  begin
    RequiredBars := MaxInt(MaxInt(5*(nMA1+nMA2), nHullMA1+nHullMA2), 5*Period)+Mom1+Mom2+MOm3;
    AdvancedTrades := true;
  end;

  sHullMACD := SubtractSeries(HullMA(Close, nHullMA1), HullMA(Close, nHullMA2));
  sHullDiff := Momentum(sHullMACD, 1);

  sMACD := MACD(Close, nMA1, nMA2);
  sDiff := Momentum(sMACD, 1);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  sLR       := MovingRegression(Close,Period);
  sLRSlope  := MovingRegressionSlope(Close,Period);
  sForecast := ShiftSeries(AddSeries(sLR,sLRSlope),Displace);
  sMAFc     := MA(sForecast,MaExponential,Trigger);

  sMom1 := Momentum(Close, Mom1);
  sMom2 := Momentum(Close, Mom2);
  sMom3 := Momentum(Close, Mom3);

  iFirst := MaxInt(MaxInt(MaxInt(MaxInt(MaxInt(FirstvalidIndex(sHullDiff), FirstValidIndex(sDiff)),
    FirstValidIndex(sMAFc)), FirstValidIndex(sMom1)), FirstValidIndex(sMom2)), FirstValidIndex(sMom3));
  for i:=iFirst+1 to BarCount-1 do
  begin
    if SigTrigger = trLong then
    begin
      SigTrigger := trNone;
      if EnterLongAtOpen(i) then
      begin
        MP := 1;
        if i < Barcount-1 then
        begin
          TPLevel := Open[i] + TP;
          SLLevel := Open[i] - SL;
        end;
        if High[i] >= TPLevel then SigTrigger := trExitLong; // exit next bar if TP level reached in opening bar
        if Low[i] <= SLLevel then SigTrigger := trExitLong; // exit next bar if SL level reached in opening bar
      end;
    end else
    if SigTrigger = trShort then
    begin
      SigTrigger := trNone;
      if EnterShortAtOpen(i) then
      begin
        MP := -1;
        if i < Barcount-1 then
        begin
          TPLevel := Open[i] - TP;
          SLLevel := Open[i] + SL;
        end;
        if Low[i] <= TPLevel then SigTrigger := trExitShort; // exit next bar if TP level reached in opening bar
        if High[i] >= SLLevel then SigTrigger := trExitShort; // exit next bar if SL level reached in opening bar
      end;
    end else
    if SigTrigger = trExitLong then
    begin
      ExitLongAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if SigTrigger = trExitShort then
    begin
      ExitShortAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if (MP > 0) and ((High[i] >= TPLevel) or (Low[i] <= SLLevel)) then
    begin
      ExitLongLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 0) and ((Low[i] <= TPLevel) or (High[i] >= SLLevel)) then
    begin
      ExitShortLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 1) and (sHullDiff[i] > 0) and (sDiff[i] > 0) and (sDiff[i] > sDiff[i-1]) and (sMAFc[i] < sForecast[i]) and
       (sMom1[i] > 0) and (sMom2[i] > 0) and (sMom3[i] > 0) then
    begin
      SigTrigger := trLong;
    end else
    if (MP > -1) and (sHullDiff[i] < 0) and (sDiff[i] < 0) and (sDiff[i] < sDiff[i-1]) and (sMAFc[i] >= sForecast[i]) and
       (sMom1[i] < 0) and (sMom2[i] < 0) and (sMom3[i] < 0) then
    begin
      SigTrigger := trShort;
    end else
    if (MP > 0) and (sMAFc[i] >= sForecast[i]) then
    begin
      SigTrigger := trExitLong;
    end else
    if (MP < 0) and (sMAFc[i] < sForecast[i]) then
    begin
      SigTrigger := trExitShort;
    end;
  end;

  with CreateLine(sDiff) do
  begin
    Color := clLime;
  end;
  with CreateLine(sHullDiff) do
  begin
    Color := clYellow;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end.
---
Eric

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » di jun 12, 2018 11:02 am

dank je, is prima zo.

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » do sep 06, 2018 6:27 pm

Hallo Eric,

Ik heb in deze indicator een PT van 5.
Vandaag gaat deze short op 544.78 en het slot is 539.97.

Toch geen exit obv de PT; hoe zou dit kunnen?

Code: Selecteer alles

{- Filename: Tesjoeva's MACD system 2 -}

function HullMA(Prices: TSeries; Period: integer): TSeries;
begin
// Integer (Square Root (Period)) WMA [2 x Integer (Period/2) WMA (Price) - Period WMA (Price)]
//  waverage(2 * waverage(close, period/2) - waverage(close,period), SquareRoot(Period))
  Result := MA(SubtractSeries(MultiplySeriesBy(MA(Prices, maWeighted, Period div 2), 2),
                              MA(Prices, maWeighted, Period)),
               maWeighted, trunc(sqrt(Period)));
end;

type
  TSigTrigger = (trNone, trLong, trShort, trExitLong, trExitShort);

var
  SigTrigger: TSigTrigger;
  nHullMA1, nHullMA2, nMA1, nMA2, i, iFirst, Period, Displace, Trigger, Mom1, Mom2, Mom3, MP: integer;
  SLLevel, SL, TPLevel, TP: real;
  sHullMACD, sMACD, sHullDiff, sDiff, sZero, sMom1, sMom2, sMom3: TSeries;
  sLR, sLRSlope, sForecast, sMAFc: TSeries;
begin
  nHullMA1 := CreateParameterInteger('Hull''s MA periode 1', 1, 999, 13, true);
  nHullMA2 := CreateParameterInteger('Hull''s MA periode 2', 1, 999, 26, true);
  nMA1 := CreateParameterInteger('MA periode 1', 1, 999, 13, true);
  nMA2 := CreateParameterInteger('MA periode 2', 1, 999, 26, true);
  Period   := CreateParameterInteger('T3 Period', 1, 999, 20, true);
  Displace := CreateParameterInteger('T3 Displace LRF', 0, 999, 0, false);
  Trigger  := CreateParameterInteger('T3 EMA over LRF', 1, 999, 5, true);
  TP  := CreateParameterReal('Take profit (pt)', 0, 9999, 10, true);
  SL  := CreateParameterReal('Stoploss (pt)', 0, 9999, 10, true);
  Mom1 := CreateParameterInteger('Mom 1', 1, 999, 1, true);
  Mom2 := CreateParameterInteger('Mom 2', 1, 999, 5, true);
  Mom3 := CreateParameterInteger('Mom 3', 1, 999, 10, true);

  with Indicator do
  begin
    RequiredBars := MaxInt(MaxInt(5*(nMA1+nMA2), nHullMA1+nHullMA2), 5*Period)+Mom1+Mom2+MOm3+500;
    AdvancedTrades := true;
  end;

  sHullMACD := SubtractSeries(HullMA(Close, nHullMA1), HullMA(Close, nHullMA2));
  sHullDiff := Momentum(sHullMACD, 1);

  sMACD := MACD(Close, nMA1, nMA2);
  sDiff := Momentum(sMACD, 1);
  sZero := FillSeries(CreateSeries(BarCount), 0);

  sLR       := MovingRegression(Close,Period);
  sLRSlope  := MovingRegressionSlope(Close,Period);
  sForecast := ShiftSeries(AddSeries(sLR,sLRSlope),Displace);
  sMAFc     := MA(sForecast,MaExponential,Trigger);

  sMom1 := Momentum(Close, Mom1);
  sMom2 := Momentum(Close, Mom2);
  sMom3 := Momentum(Close, Mom3);

  iFirst := MaxInt(MaxInt(MaxInt(MaxInt(MaxInt(FirstvalidIndex(sHullDiff), FirstValidIndex(sDiff)),
    FirstValidIndex(sMAFc)), FirstValidIndex(sMom1)), FirstValidIndex(sMom2)), FirstValidIndex(sMom3));
  for i:=iFirst+1 to BarCount-1 do
  begin
    if SigTrigger = trLong then
    begin
      SigTrigger := trNone;
      if EnterLongAtOpen(i) then
      begin
        MP := 1;
        if i < Barcount-1 then
        begin
          TPLevel := Open[i] + TP;
          SLLevel := Open[i] - SL;
        end;
        if High[i] >= TPLevel then SigTrigger := trExitLong; // exit next bar if TP level reached in opening bar
        if Low[i] <= SLLevel then SigTrigger := trExitLong; // exit next bar if SL level reached in opening bar
      end;
    end else
    if SigTrigger = trShort then
    begin
      SigTrigger := trNone;
      if EnterShortAtOpen(i) then
      begin
        MP := -1;
        if i < Barcount-1 then
        begin
          TPLevel := Open[i] - TP;
          SLLevel := Open[i] + SL;
        end;
        if Low[i] <= TPLevel then SigTrigger := trExitShort; // exit next bar if TP level reached in opening bar
        if High[i] >= SLLevel then SigTrigger := trExitShort; // exit next bar if SL level reached in opening bar
      end;
    end else
    if SigTrigger = trExitLong then
    begin
      ExitLongAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if SigTrigger = trExitShort then
    begin
      ExitShortAtOpen(i);
      SigTrigger := trNone;
      MP := 0;
    end else
    if (MP > 0) and ((High[i] >= TPLevel) or (Low[i] <= SLLevel)) then
    begin
      ExitLongLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 0) and ((Low[i] <= TPLevel) or (High[i] >= SLLevel)) then
    begin
      ExitShortLimit(i, TPLevel);
      MP := 0;
    end else
    if (MP < 1) and (sHullDiff[i] > 0) and (sDiff[i] > 0) and (sDiff[i] > sDiff[i-1]) and (sMAFc[i] < sForecast[i]) and
       (sMom1[i] > 0) and (sMom2[i] > 0) and (sMom3[i] > 0) then
    begin
      SigTrigger := trLong;
    end else
    if (MP > -1) and (sHullDiff[i] < 0) and (sDiff[i] < 0) and (sDiff[i] < sDiff[i-1]) and (sMAFc[i] >= sForecast[i]) and
       (sMom1[i] < 0) and (sMom2[i] < 0) and (sMom3[i] < 0) then
    begin
      SigTrigger := trShort;
    end else
    if (MP > 0) and (sMAFc[i] >= sForecast[i]) then
    begin
      SigTrigger := trExitLong;
    end else
    if (MP < 0) and (sMAFc[i] < sForecast[i]) then
    begin
      SigTrigger := trExitShort;
    end;
  end;

  with CreateLine(sDiff) do
  begin
    Color := clLime;
  end;
  with CreateLine(sHullDiff) do
  begin
    Color := clYellow;
  end;
  with CreateLine(sZero) do
  begin
    Color := clSilver;
    LineContent := lcConstant;
  end;
end.      [code\]


bvd en vriendelijke groet,

Eric
Berichten: 3048
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Re: macd combo

Bericht door Eric » do sep 06, 2018 7:38 pm

Het is handiger om vragen over een indicator te stellen bij het topic dat bij die indicator hoort. Dan is er gelijk wat meer informatie over de indicator te vinden. En als je geluk hebt zelfs het antwoord op je vraag. ;-)

---
Eric

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » do sep 06, 2018 7:47 pm

Hallo Eric,
Je bent altijd glashelder, maar dit antwoord lijkt op een Zen koan....ik snap er niets van.

Ik heb de indicator toch bijgevoegd.

Kun je mijn vraag nog een herkansing geven?

vriendelijke groet.

Eric
Berichten: 3048
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Re: macd combo

Bericht door Eric » vr sep 07, 2018 9:11 am

Wat ik bedoel is dat je dezelfde vraag in het aangehaalde topic hebt gesteld. Weliswaar in het code-blok onder de indicator, dus wat moeilijk te vinden.
Hallo Eric,

Ik heb hier vandaag een entry op 556+ in de AEX (short)
De koers is gezakt tot iets boven 550, met een Profit target op 3.5 punt.

Deze is echter niet gegaan, iets dat ik vaker tegenkom.....
Dit komt bij verschillende timeframes voor, maar volkomen willekeurig (meestal gaat het goed)

Kun je er even naar kijken voor me, alvast bedankt en groet,
Daarop antwoord ik:
Een dag-grafiek kan geen meerdere signalen (entry en exit) op dezelfde dag geven. Dit geldt voor alle intervallen, per bar kan maar 1 signaal optreden.

---
Eric
waarna jij voorstelt om het sluitingssignaal in dat geval op de volgende opening te geven en ik dat ook zo heb geïmplementeerd.

Ergo: je zou het verwachte sluitingssignaal vanochtend gekregen moeten hebben bij de eerste koers.

---
Eric

tesjoeva
Berichten: 157
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: macd combo

Bericht door tesjoeva » vr sep 07, 2018 12:15 pm

Hallo Eric,

Klopt, en sorry voor mijn onbenul.

vriendelijke groet

Plaats reactie