Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 196

 
Vitaly Muzichenko:

Dies ist das Layout, es gibt keinen Unterschied zwischen 4 und 5

Das Handle sollte einmal bei OnInit() erstellt werden, nicht bei jedem Schritt. Sie wissen das immer noch nicht?

 
gelöscht, muss darüber nachdenken.
 
Vitaly Muzichenko:

Wie wäre es damit?

Und auf diese Weise schaffen Sie immer noch einen Griff für jeden Tick. Verwenden Sie den Styler und Sie werden die Logikfehler sofort sehen:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int hMA=-1;
   int handle=iMA(symb,tf,period,ma_shift,method,price);
   if(handle<hMA)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   hMA=handle;
   return(buf[0]);
#endif
  }
 
Vladimir Karputov:

Aber Sie erstellen immer noch einen Griff für jeden Tick. Verwenden Sie den Styler und Sie werden die Logikfehler sofort sehen:

Wie diese

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
   }
   if(handle<0) {
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
Der Rest des Peak-Suchcodes ist plattformübergreifend
 
Vitaly Muzichenko:

Ich glaube schon.

Der Rest des Peak-Suchcodes ist plattformübergreifend

Ja, es ist...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int handle=-1;
   if(handle<0)
     {
      handle=iMA(symb,tf,period,ma_shift,method,price);
     }
   if(handle<0)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   return(buf[0]);
#endif
  }

eindeutig besser. Dieser Block ist jedoch fehl am Platz - er sollte unmittelbar nach der Erstellung des Griffs platziert werden.

 
Vladimir Karputov:

Ja, jetzt

eindeutig besser. Dieser Block befindet sich jedoch an der falschen Stelle - er sollte unmittelbar nach der Erstellung des Griffs platziert werden.

Der beste Weg ist wahrscheinlich wie folgt, es wird einmal ein Erstellungsfehler ausgegeben, aber dann gibt es weniger Prüfungen für if(...)

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
 
Vitaly Muzichenko:

Der beste Weg ist wahrscheinlich so, es wird einmal ein Erstellungsfehler ausgegeben, aber dann gibt es weniger Prüfungen auf if(...).

Ich kann in deinem Chaos nichts sehen - alles verschwimmt.

Verwenden Sie den Styler.
 
Vladimir Karputov:

Ich kann in deinem Brei nichts erkennen - alles ist wie aus einem Guss.

Verwenden Sie den Styler.

Wenn überhaupt, dann habe ich meinen Stil nicht im Styler gesehen, und davon gibt es ja so viele

Dateien:
cc.PNG  100 kb
 

Leider basiert mein Indexer auf MQL4 und diese Funktion ist nur ein kleiner Teil davon.

Aus diesem Grund ist es nicht so effizient, MQL5 zu implementieren, und es wäre langwierig und problematisch, das Ganze neu zu schreiben.

 
GlaVredFX:

Leider basiert mein Indexer auf MQL4 und diese Funktion ist nur ein kleiner Teil davon.

Aus diesem Grund ist es nicht so effizient, MQL5 zu implementieren, und es wäre langwierig und problematisch, das Ganze neu zu schreiben.

Ein Indikator wird in MQL5 im Durchschnitt in einer halben Stunde neu geschrieben. Mit einer Tasse Kaffee.