Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 838

 

Wie kann ich die Höchst- und Tiefstwerte des Indikators leeren? Wenn ich zum Beispiel einen Höchstwert von 100 und einen Mindestwert von 0 festlege und der Indikator alles anzeigen soll, wie kann ich das organisieren? Das Problem ist, dass ich einen Indikator mit mehreren Modi schreibe, von denen einer max und min verwendet, aber nach dem Umschalten des Modus in den Eingabeparametern bleibt der max 100, sowie der min 0


MQL5

 
Alekseu Fedotov:

Sie haben den vonAbweichung(Kanal) zurückgegebenen Wert bereits aufgerufen und an die FunktionHüllkurven(........) übergeben

und in der FunktionHüllkurven(........) selbst deklarieren Sie den letzten Parameter, der diesen Wert annimmt


wie diese

Danke, das macht jetzt mehr Sinn.

 

Ich habe den Code für MT5 nach Ihren Ratschlägen leicht modifiziert, so dass er wie folgt aussieht:

input  string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

input  ENUM_TIMEFRAMES   Time_Frames    = PERIOD_M5;             // Временной период
       int                Ma_Period     = 120;                   // Период
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes(int buff, double _Deviation)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if(handle<0)
   {
    Print("Failed to create handle iEnvelopes, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator iEnvelopes, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Nur verstehe ich jetzt nicht, warum bei jedem Tick überall der erste berechnete Wert geschrieben wird.

Berechnungen

Können Sie mir sagen, wie man das beheben kann?
 
Alexander Layzerevich:

Ich habe den Code für MT5 nach Ihren Ratschlägen leicht modifiziert, so dass er wie folgt aussieht:

Nur verstehe ich jetzt nicht, warum bei jedem Tick überall ein berechneter Wert geschrieben wird.

//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------

Das ist sofort ersichtlich. Auch ohne hervorgehoben zu werden.

 
Artyom Trishkin:

Sie fällt sofort ins Auge. Auch ohne die Hervorhebung.

Ich danke Ihnen.

 

Alle Fragen von Neulingen zu MQL4, Hilfe und Diskussion über Algorithmen und Codes

WinProject, 2019.05.07 18:38

Können Sie mir bitte sagen, warum der gleiche Code in MT4 funktioniert, aber nicht in MT5 funktioniert? In MT5 ist die Variable strNum immer =1, aber in MT4 funktioniert der ++ Zähler wie er sollte und strNum = Anzahl der Zeilen in der Datei.

int strNum;
void OnStart()
  {
 FileNum();
 Alert1();
  } 

  void FileNum()
{
      int handle=FileOpen("File.csv",FILE_CSV|FILE_READ,';');
      strNum=0; 
      while(!FileIsEnding(handle))
{
      FileReadString(handle);
      strNum++;
      if(FileIsEnding(handle)==true)
      break;
}
      FileClose(handle);
}

      void Alert1()
{
      Alert (strNum);
}

Ich antworte mir selbst, es kann für diejenigen nützlich sein, die keine Schleife in MT5 beim Öffnen oder Lesen von Dateien in Array oder Struktur haben. In MT5 sollten Sie im Gegensatz zu MT4 beim Lesen von .csv-Dateien zusätzlichdas Dateiöffnungsflag FILE_ANSIsetzen.

D.h. im MT5 sollte die Zeile wie folgt aussehen:

int handle=FileOpen("File.csv",FILE_READ|FILE_ANSI|FILE_CSV,";");

Warum, das weiß ich nicht, vielleicht weiß es jemand?

 
Wenn das EA-Protokoll eine Benachrichtigung in diesem Format anzeigt - uninit reason 3 (die Benachrichtigung ist auf den Wechsel des TMs zurückzuführen), der Roboter aber nicht aus dem Diagramm entfernt wird, werden dann die Werte der Variablen und alle erhaltenen Berechnungen beibehalten?
 

Ich erhalte "OrderSend error 130" aus unbekanntem Grund, das Programm läuft im Strategietester auf dem Demokonto, also kann es keine Einschränkungen vom Broker geben, soweit ich das verstehe, Stops Level = 30. Ich erhalte diese Fehlermeldung in regelmäßigen Abständen während des Tests und der Stop ist in Prozent der ATR für alle Trades festgelegt, aber einige Aufträge werden erfolgreich platziert, während andere nicht erfolgreich sind.

      Print("!!!long level = ", level, ", stop = ", NormalizeDouble(level - stop, Digits));
      if(Bid < level) {
         tickets[orders] = OrderSend(symbol, OP_BUYSTOP, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                                                                           
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
      else { 
         tickets[orders] = OrderSend(symbol, OP_BUYLIMIT, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

Es kommt vor, dass ein Auftrag mehrmals abgelehnt wird und dann durchgeht...



 

Wie kann ich denselben Code in CodeBase für verschiedene Sprachgruppen veröffentlichen (z. B. wie kann ich ein Formular auf dem Marktplatz für die entsprechende Sprache ausfüllen)?


Ich habe dies bereits in CodeBase gesehen, hier ist ein Beispiel


Wie kann ich dasselbe tun?

 

Wenn Sie z. B. die Kerzengröße mit der Maus verringern, ändern sich die Werte des Indikators, aber keine der Tausenden von Kerzen im Indikatorcode sagt etwas über die Änderung der Kerzengröße aus.