Fractals Calculation

 

Hi,

I have a question about Fractals Visualization.

Sometimes it seems be wrong. I want to trade a buy / long position when the Fractals arrow shows down, but its 50% to 50%... are there fractals which I cant see in the chart? Or is my code wrong???

I use following code:

void updateFractals()
{
  MqlRates PriceArray[];
  ArraySetAsSeries(PriceArray, true);
  int Data = CopyRates(_Symbol, _Period, 0,3,PriceArray);
  double UpperFractalsArray[], LowerFractalsArray[];
  
  int FractalDefinition = iFractals(_Symbol, _Period);
  
  ArraySetAsSeries(UpperFractalsArray, true);
  ArraySetAsSeries(LowerFractalsArray, true);
  
  CopyBuffer(FractalDefinition, UPPER_LINE, 1, 3, UpperFractalsArray);
  CopyBuffer(FractalDefinition, LOWER_LINE, 1, 3, LowerFractalsArray);
  
  double UpperFractalsValue = UpperFractalsArray[1];
  double LowerFractalsValue = LowerFractalsArray[1];
  
  if(UpperFractalsValue == EMPTY_VALUE)
    UpperFractalsValue = 0;
    
  if(LowerFractalsValue == EMPTY_VALUE)
    LowerFractalsValue = 0;
    
  //going down
  if((UpperFractalsValue != 0) && (UpperFractalsValue > PriceArray[1].high)) 
  {
    //SELL
    sellFlag = 1;
    buyFlag = 0;
  }

  //going up
  if((LowerFractalsValue != 0) && (LowerFractalsValue < PriceArray[1].low)) 
  {
    //Buy
    buyFlag = 1;
    sellFlag = 0;
  }
}

Thanks and best regards

Fractals - Bill Williams' Indicators - MetaTrader 5 Hilfe
Fractals - Bill Williams' Indicators - MetaTrader 5 Hilfe
  • www.metatrader5.com
Alle Märkte sind dadurch charakterisiert, dass keine Trend-Bewegungen vorliegen. Nur zu etwa 15-30% liegen Trend-Bewegungen vor. Dies sind...
 
  1. Wir können hier deutsch reden :)
  2. Könntest Du bitte ein Screenshot machen, wo der Code warum falsch liegt, wenn der seine Pfeile (nicht) zeigt.
 

Kann ich machen, siehe Anhang :-)

irgendwie scheint das hier ein großen Einfluss zu haben:

  double UpperFractalsValue = UpperFractalsArray[1];
  double LowerFractalsValue = LowerFractalsArray[1];

Hätte gerne das Verhalten bzw. die Pfeile so berechnet wie diese im Chart ausgegeben werden.

Dateien:
Fractals.png  6 kb
 
Gambzor #:

Kann ich machen, siehe Anhang :-)

irgendwie scheint das hier ein großen Einfluss zu haben:

Hätte gerne das Verhalten bzw. die Pfeile so berechnet wie diese im Chart ausgegeben werden.

??

Und was ist jetzt daran nicht so wie Du es Dir vorstellst?

Aber vielleicht liegt das daran, wie Du das Array verwendest, das CopyBuffer liefert. Setz im Editor den Kursor auf die Funktion und drück F1. Lies und versteh das Beispiel, was steht bei welchem Index!

 

Naja der letzte Fractal-Pfeil (rote Markierung) vor dem Buy zeigt nach oben, er sollte aber den Buy erst ausführen, wenn der letzte Fractal-Pfeil (blaue Markierung) nach unten zeigt, siehe neues Bild. Manchmal klappt das auch, aber irgendwie bildet meine Funktion/Code nicht exakt das Verhalten der Fractals ab die im Chart zu sehen sind.


Danke für den Tipp CopyBuffer, aber verstehe irgendwie nicht genau was da angepasst werden muss, hast du da eine Idee? :-)

Dateien:
 
Gambzor #:

Naja der letzte Fractal-Pfeil (rote Markierung) vor dem Buy zeigt nach oben, er sollte aber den Buy erst ausführen, wenn der letzte Fractal-Pfeil (blaue Markierung) nach unten zeigt, siehe neues Bild. Manchmal klappt das auch, aber irgendwie bildet meine Funktion/Code nicht exakt das Verhalten der Fractals ab die im Chart zu sehen sind.


Danke für den Tipp CopyBuffer, aber verstehe irgendwie nicht genau was da angepasst werden muss, hast du da eine Idee? :-)

Überprüf im Code, wann (Index) welcher Fractal erscheint, es gibt ja zwei Puffer, einer für oben einer für unten.
 

Kann dir irgendwie nicht ganz folgen, welchen Index meinst du?

Habe die Buffer wie folgt kopiert:

  CopyBuffer(FractalDefinition, UPPER_LINE, 1, 3, UpperFractalsArray);
  CopyBuffer(FractalDefinition, LOWER_LINE, 1, 3, LowerFractalsArray);

UPPER für den oberen und LOWER für den unteren meinst du das?

 
Gambzor #:

Kann dir irgendwie nicht ganz folgen, welchen Index meinst du?

Habe die Buffer wie folgt kopiert:

UPPER für den oberen und LOWER für den unteren meinst du das?

Also Du möchtest:

 //going up
  if((LowerFractalsValue != 0) && (LowerFractalsValue < PriceArray[1].low)) 
  {
    //Buy
    buyFlag = 1;
    sellFlag = 0;
  }

Dann prüf mal mit dem Debugger (und vergleiche die Werte mit den Werten der Bars auf dem Chart) welche Werte LowerFractalsValue und  PriceArray[1].low haben.

Der Kauf ist genau so wie es obiges if verlangt: das Tief-Fraktal ganz links und der Kauf nach der ersten Bar mit einem Tief kleiner als das Fraktal links davon - gelbe Pfeile.

Nach der blauen Kreis gibt es keine Bar mit einem Tief kleiner als dieses Fraktal.

Alles so wie Du es programmiert hast.


 

Kann schon sein das ich das vielleicht unbeabsichtigt so programmiert habe :-)

Die lila Markierung (siehe neues Bild im Anhang) ist zwar ein down Fractal, sollte aber zurückgesetzt werden von der roten Markierung und bei der grünen Markierung ist kein down Fractal eingezeichnet im Chart.

Habe das mal mit dem Debugger ausprobiert nachfolgende Funktion bzw. das IF(true) wird 5 bis 20 mal so häufig aufgerufen wie ein down fractal im Chart gezeichnet wird. Würde gern, dass das IF nur dann aufgerufen wird bzw. true ist, wenn im Chart auch ein down Fractal gezeichnet wird:

 //going up
  if((LowerFractalsValue != 0) && (LowerFractalsValue < PriceArray[1].low)) 
  {
    //Buy
    buyFlag = 1;
    sellFlag = 0;
  }


Glaube verstehe jetzt deine Anmerkung, muss ich den down Fractal Buffer irgendwie abfangen ob zwischendurch ein up Fractal gezeichnet wurde? Weil dieser nur auf die down Fractals schaut?

Dateien:
 

Hab bisschen gebraucht aber habe es jetzt glaube ich verstanden.

Der Code wurde bei jedem Tick ausgeführt deswegen wurde die IF Anweisung mehrfach mit true ausgeführt.

Zudem war mir nicht ganz klar das 2 Kerzen davor und danach benötigt werden, sodass das grau gezeichnete Fractal immer etwas in der Vergangenheit liegt.

Vielen Dank nochmal für deine Hilfe und ich sollte öfter mal mit dem Debugger arbeiten! :-)


Der nachfolgende Code macht ungefähr das was ich vor hatte:

double lastDownFractal = 0;
double lastUpFractal = 0;

void updateFractals()
{
  MqlRates PriceArray[];
  ArraySetAsSeries(PriceArray, true);
  int Data = CopyRates(_Symbol, _Period, 0,5,PriceArray);
  double UpperFractalsArray[], LowerFractalsArray[];
  
  int FractalDefinition = iFractals(_Symbol, _Period);
  
  ArraySetAsSeries(UpperFractalsArray, true);
  ArraySetAsSeries(LowerFractalsArray, true);
  
  CopyBuffer(FractalDefinition, UPPER_LINE, 1, 3, UpperFractalsArray);
  CopyBuffer(FractalDefinition, LOWER_LINE, 1, 3, LowerFractalsArray);
  
  double UpperFractalsValue = UpperFractalsArray[1];
  double LowerFractalsValue = LowerFractalsArray[1];

  
  
  if(UpperFractalsValue == EMPTY_VALUE)
    UpperFractalsValue = 0;
    
  if(LowerFractalsValue == EMPTY_VALUE)
    LowerFractalsValue = 0;
  
     
  //going down
  if((UpperFractalsValue != 0) && (UpperFractalsValue != lastUpFractal)) 
  {
    //SELL
    sellFlag = 1;
    buyFlag = 0;
    lastUpFractal = UpperFractalsValue;
  }

  //going up
  if((LowerFractalsValue != 0) && (lastDownFractal != LowerFractalsValue)) 
  {
       //Buy
       buyFlag = 1;
       sellFlag = 0;  
       lastDownFractal = LowerFractalsValue;
  }
  
  if(LowerFractalsValue == 0)
     lastDownFractal = 0;
     
  if(UpperFractalsValue == 0)
     lastUpFractal = 0;
     
}