Indikator Verschiedene Fragen - Seite 15

 

OnCalculate

Die Funktion OnCalculate() wird nur in benutzerdefinierten Indikatoren aufgerufen, wenn es notwendig ist, die Indikatorwerte durch das Ereignis Calculate zu berechnen.

Dies geschieht normalerweise, wenn ein neuer Tick für das Symbol empfangen wird, für das der Indikator berechnet wird.

Dieser Indikator muss nicht mit einem Preisdiagramm dieses Symbols verbunden sein.

Die Funktion OnCalculate() muss einen Rückgabetyp int haben. Es gibt zwei mögliche Definitionen. Innerhalb eines Indikators können Sie nicht beide Versionen der Funktion verwenden.

Die erste Form ist für jene Indikatoren gedacht, die auf einem einzigen Datenpuffer berechnet werden können. Ein Beispiel für einen solchen Indikator ist Custom Moving Average.

intOnCalculate(constint rates_total,// Größe des Preis[]-Arrays
constint prev_calculated,// Bars, die bei einem früheren Aufruf behandelt wurden
constint begin,// ab dem die signifikanten Daten beginnen
constdouble& price[]// zu berechnendes Array
);

 
Marco vd Heijden:

OnCalculate

Die Funktion OnCalculate() wird nur in benutzerdefinierten Indikatoren aufgerufen, wenn es notwendig ist, die Indikatorwerte durch das Ereignis Calculate zu berechnen.

Dies geschieht normalerweise, wenn ein neuer Tick für das Symbol empfangen wird, für das der Indikator berechnet wird.

Dieser Indikator muss nicht mit einem Preisdiagramm dieses Symbols verbunden sein.

Die Funktion OnCalculate() muss einen Rückgabetyp int haben. Es gibt zwei mögliche Definitionen. Innerhalb eines Indikators können Sie nicht beide Versionen der Funktion verwenden.

Die erste Form ist für jene Indikatoren gedacht, die auf einem einzigen Datenpuffer berechnet werden können. Ein Beispiel für einen solchen Indikator ist Custom Moving Average.

intOnCalculate(constint rates_total,// Größe des Preis[]-Arrays
constint prev_calculated,// Bars, die bei einem früheren Aufruf behandelt wurden
constint begin,// ab dem die signifikanten Daten beginnen
constdouble& price[]// zu berechnendes Array
);

Perfekt, Herr Marco, vielen Dank noch einmal.
 

(Ich verwende das Wort "Lag", das bedeutet, dass die Preisaktion, das Öffnen und Schließen von Aufträgen verzögert wird, nur ein Wort bringt meine MT4-Plattform zum Erliegen).

Ich verwende die folgende Funktion für meinen benutzerdefinierten Indikator.

int OnCalculate(const int rates_total, const int prev_calculated, const datetime & time[], const double & open[], const double & high[], const double & low[], const double & close[], const long & tick_volume[], const long & volume[], const int & spread[]){...}

Wenn ich schreibe unten Rückkehr Code zu meinem benutzerdefinierten Indikator dann meine benutzerdefinierte Indikator beginnt zu verzögern. Aber funktioniert richtig, was ich will.

return(0); // starts to lag...

Und wenn ich schreibe unten Return-Code zu meinem benutzerdefinierten Indikator dann meine benutzerdefinierte Indikator funktioniert nicht richtig, die ich will. Ich meine, während gefälschte MA Kreuz "Pfeil" nicht zurück zu früheren MA Kreuz Punkt.

return rates_total-1; // does not go back to previous MA cross point
return(rates_total-1); // and same thing here

F: Was kann ich für diese Situation tun, bitte?

Vielen Dank im Voraus.

 
Max Enrik: Und wenn ich schreibe unten zurück Code zu meinem benutzerdefinierten Indikator dann meine benutzerdefinierte Indikator funktioniert nicht richtig, die ich will. Ich meine, während gefälschte MA Kreuz " Pfeil " nicht zurück zu vorherigen MA Kreuz Punkt.
Stellen Sie Ihren gesamten Code ein. Das ist sinnlos ohne Kontext.
 
whroeder1:
Stellen Sie Ihren gesamten Code ein. Ohne Kontext ist das sinnlos.

Hier ist er.

Vielen Dank im Voraus.

Indikator Beispiel Chart 06

#property strict
#property indicator_chart_window
#property indicator_buffers 2

string arrowIcon="delete arrow icon";

int i;
double arrowLow,arrowHigh,priceOne,priceTwo,priceOne_pre,priceTwo_pre,bufferOne[],bufferTwo[];
color clrup=clrBlue,clrdown=clrRed;
datetime arrowTime;
//---------------------------------------------------------
// OnDeinit
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"delete");
   return;
  }
// OnInit
int OnInit()
  {
   IndicatorDigits(Digits);
// line
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrdown);
   SetIndexBuffer(0,bufferOne);

   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrup);
   SetIndexBuffer(1,bufferTwo);
//---
   return(0);
  }
// OnCalculate
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime  &time[],const double  &open[],const double  &high[],
                const double  &low[],const double  &close[],const long  &tick_volume[],
                const long  &volume[],const int  &spread[])
  {
//---
   int lookback=30; // I do not know what could I write here.
   for(i=Bars-1-MathMax(lookback,prev_calculated); i>=0; --i)
     {
      bufferOne[i]=iMA(Symbol(),0,lookback/2,0,MODE_EMA,PRICE_CLOSE,i);
      bufferTwo[i]=iMA(Symbol(),0,lookback,0,MODE_EMA,PRICE_CLOSE,i);

      priceOne = bufferOne[i];
      priceTwo = bufferTwo[i];
      priceOne_pre = bufferOne[i+5];
      priceTwo_pre = bufferTwo[i+5];

      // buy
      if(priceOne>priceTwo && priceOne_pre<=priceTwo_pre)
        {
         arrowTime=Time[i];
         //arrowLow  = iLow( Symbol(), 0, i );
         arrowLow=Low[i];

         objArrow();
         if(ObjectFind(0,arrowIcon)>=0)
           {
            ObjectMove(0,arrowIcon,0,arrowTime,arrowLow-5*Point);
            ObjectSetInteger(0,arrowIcon,OBJPROP_COLOR,clrup);
            ObjectSetInteger(0,arrowIcon,OBJPROP_ANCHOR,ANCHOR_TOP);
           }
        }
      // sell
      if(bufferOne[i]<bufferTwo[i] && priceOne_pre>=priceTwo_pre)
        {
         arrowTime = Time[i];
         arrowHigh = High[i];

         objArrow();
         if(ObjectFind(0,arrowIcon)>=0)
           {
            ObjectMove(0,arrowIcon,0,arrowTime,arrowHigh+5*Point);
            ObjectSetInteger(0,arrowIcon,OBJPROP_COLOR,clrdown);
            ObjectSetInteger(0,arrowIcon,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
           }
        }
     }
   Print("Time: ",arrowTime,"  Low: ",arrowLow);
//    Print( "priceOne ", DoubleToString( priceOne, Digits ), "  priceTwo ", DoubleToString( priceTwo, Digits ) );
//---
//return(0); // works correct but cause lags
   return(rates_total - 1); // no lags but does not go to previous ma cross after fake ma cross
  }
// objects
void objArrow()
  {
   if(ObjectFind(0,arrowIcon)<0)
     {
      ObjectCreate(0,arrowIcon,OBJ_ARROW,0,arrowTime,arrowLow);
      ObjectSetInteger(0,arrowIcon,OBJPROP_ARROWCODE,159);
      ObjectSetInteger(0,arrowIcon,OBJPROP_WIDTH,2);
     }
//---
   return;
  }
//+------------------------------------------------------------------+
 
Max Enrik: Ich meine, während gefälschte MA Kreuz "Pfeil" geht nicht zurück zu früheren MA Kreuz Punkt.
Sie nicht testen, dass und bewegen Sie es zurück.
 
whroeder1:
Man testet nicht darauf und verschiebt es zurück.

GUT! Danke!
 

Ich brauche noch eine klare Antwort.

Vielen Dank im Voraus.

 

Antwort ist:Prüfen Sie sowohl den aktuellen MA Cross als auch den vorherigen MA Cross.

#Buffer (array out of range in ) - Closed
#Custom Indicator Lagging - Closed

 

#Erstes Ergebnis der Schleife - Offen

string counts;
void _a()
{
    counts += "a - " + IntegerToString( ObjectsTotal( OBJ_ARROW ) );
    //---
    return;
}
void _b()
{
    counts += " - b - " + IntegerToString( ObjectsTotal( OBJ_ARROW ) );
    //---
    return;
}
Print( counts );
// while 1st loop: a - 2 - b - 4
// while 2nd loop: a - 2 - b - 4a - 2 - b - 4
// while 3rd loop: a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4
// and so on...
// But I like only 1st loop results even that loop runs 10 thousand times

Vielen Dank im Voraus.