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

 
Galim_V:

So können Sie Folgendes ändern

es gibt viele Fehler im Code, in

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

es ist besser, die Preise zu normalisieren, dann werden sie funktionieren, dann wird der Server einen Fehler von "falschen Preisen" ausgeben, es ist wünschenswert,StopLoss_SELL zu normalisieren

und höchstwahrscheinlich müssen Sie prüfen, ob der StopLoss gleich Null ist - es ist nicht wünschenswert, reelle Zahlen zu vergleichen, um gleich zu sein, Sie sollten versuchen, reelle Zahlen mit > oder < zu vergleichen

 
Jessy111:

Helfen Sie mir, einen Fehler im Indikator zu beheben. Er zeichnet nicht das Tageshoch und -tief, wenn er sich auf der letzten Kerze der Stunde befindet.

Ich habe den Indikator skizziert, Ihr Code mag die Arbeit mit Strings nicht, ich würde ihn einfacher schreiben, hier ist ein Beispiel. Wenn Ihre Aufgabe jedoch darin besteht, die Zeitverschiebung des Servers zu berücksichtigen, dann ist der umgekehrte Weg erforderlich.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 i,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Mein Beispiel ist auch kein Beispiel, ich habe es schnell geschrieben, ich denke, ich hätte beim ersten Durchlauf nicht vom Ende der Historie bis zum Anfang zählen sollen, sondern vom Null-Balken bis zur Historie, dann wäre der Code kürzer gewesen und hätte den aktuellen Tag schneller berechnen können - der Zyklus wäre kürzer gewesen,

Aber ich habe es im Tester überprüft, es scheint ohne Probleme zu funktionieren, lass es so sein, es ist spät, ich bin müde... Ich habe ein schlechtes Beispiel gegeben (((

 
Igor Makanu:

der Code enthält eine Menge Fehler, in

es ist besser, die Preise zu normalisieren, dann werden sie funktionieren, dann wird der Server einen Fehler von "falschen Preisen" ausgeben, es ist wünschenswert,StopLoss_SELL zu normalisieren

Und höchstwahrscheinlich müssen Sie prüfen, ob der StopLoss gleich Null ist, und es ist nicht wünschenswert, reelle Zahlen zu vergleichen, um gleich zu sein, sollten Sie versuchen, reelle Zahlen zu vergleichen, um > oder <

Das ist richtig. Ich habe soeben eine Stelle im Code aufgezeigt, warum er Marktaufträge nicht modifiziert: Die Anforderung eines Stopps vom Markt ergibt 0.

 
Igor Makanu:

Hier ist ein skizzierter Indikator, ich mag deinen Code mit Strings nicht, ich würde ihn einfacher schreiben, hier ist ein Beispiel. Wenn Ihre Aufgabe jedoch darin besteht, die Zeitverschiebung des Servers zu berücksichtigen, müssen Sie es anders machen.

Mein Beispiel ist auch kein Beispiel, ich habe es schnell geschrieben, ich denke, ich hätte beim ersten Durchlauf nicht vom Ende der Historie bis zum Anfang zählen sollen, sondern vom Null-Balken bis zur Historie, dann wäre der Code kürzer gewesen und hätte den aktuellen Tag schneller berechnen können - der Zyklus wäre kürzer gewesen,

Aber ich habe es im Tester überprüft, es scheint ohne Probleme zu funktionieren, lass es so sein, es ist spät, ich bin müde... Schlechtes Beispiel gegeben (((

Es ist nicht mein Code, ich habe ihn im Internet gefunden, ich kann keine Indikatoren schreiben. :)

Für was es wert ist ein schlechtes Beispiel, ich wirklich mochte Ihre Indikator, es funktioniert in der Strategie-Tester und auf realen Charts.

Vielen Dank für die schnelle Hilfe!

Darf ich Sie außerdem bitten, die Linien, die den Kanal zeichnen, zu entfernen? Ich habe sie auf dem Screenshot mit roten Pfeilen markiert.

Und wenn es nicht zu viel Mühe macht, fügen Sie bitte eine Funktion hinzu, mit der Sie die Linienbildung am aktuellen Tag aus- und einschalten können. Ich habe sie auf dem Bildschirmfoto mit blauen Pfeilen markiert. https://prnt.sc/kuuj3e

Vielen Dank im Voraus!

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

Hallo Liebes!

Bitte geben Sie an, wie die OnInit()-Prozedur ausgeführt werden soll;

nachdem die Variablen des Expert Advisors geändert wurden!?

Wenn der Expert Advisor auf dem Chart platziert wird, gibt es OnInit(); aber wenn Variablen geändert werden, gibt es kein OnInit!?

Wie kann man das Ereignis der Variablenänderung des Expert Advisors erkennen?

Bitte helfen Sie mit Ratschlägen, oder besser gesagt mit Code, wie man es macht!?

 
Игорь:

Hallo Liebes!

Bitte geben Sie an, wie die OnInit()-Prozedur ausgeführt werden soll;

nachdem die Variablen des Expert Advisors geändert wurden!?

Wenn der Expert Advisor auf dem Chart platziert wird, gibt es OnInit(); aber wenn Variablen geändert werden, gibt es kein OnInit!?

Wie kann man das Ereignis der Variablenänderung des Expert Advisors erkennen?

Bitte helfen Sie mit Ratschlägen, oder besser gesagt mit Code, wie man es macht!?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

Experimentieren Sie mit diesem Code, lesen Sie die Meldung im EA-Log (wechseln Sie die TF, geben Sie die Variable ein, starten Sie das Terminal neu, ohne den EA zu schließen...)

und die zweite Option besteht darin, eine Variable im globalen Bereich mit dem Modifikator static zu beschreiben

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Experimentieren Sie mit einem solchen Code, lesen Sie die Meldung im Log des Expert Advisors (wechseln Sie die TF, geben Sie die Variable ein, laden Sie das Terminal neu, ohne den Expert Advisor zu schließen...)

und die zweite Option besteht darin, eine Variable im globalen Bereich mit dem Modifikator static zu beschreiben

Im globalen Bereich mit dem Modifikator static????? Das ist eine Art Perversion.

 
Alexey Viktorov:

Auf globaler Ebene mit dem statischen Modifikator static????? Das ist eine Art Perversion.

Aber aus meiner Erfahrung, als MT4-Builds oft aktualisiert wurden, ist es besser, sie nach klassischem C++ zu schreiben, als bei der Kommunikation mit den Entwicklern die Antwort zu bekommen "schreibe den Code richtig".



ZS: Ich erinnere mich, warum ich angefangen habe, den statischen Modifikator global zu schreiben, wenn ich sichergehen will, dass ich den Variablenwert während des MQL-Programmlaufs nicht "verliere". Früher (vor etwa 5 Jahren) gab es die #property strict Precompiler-Direktive nicht und beim Aktivieren von Dateien (#include oder library - ich weiß es nicht mehr) habe ich einmal "meine Variable verloren", da die Variablennamen mit dem Variablennamen übereinstimmten.Ich wurde von MQL verflucht, aber später fand ich diesen Fehler zufällig. Aber wenn ich einen statischen Modifikator schreiben würde, würde der Compiler auch in diesem Fall einen Kompilierungsfehler anzeigen.

Der aktuelle MT4-Compiler ist ziemlich praktisch und zuverlässig, und mit der #property strict-Direktive brauche ich solche Vorsichtsmaßnahmen vielleicht nicht, aber ich schreibe aus Gewohnheit statisch, wenn ich den Wert einer Variablen nicht "verlieren" will

ZZZY: dieser Modifikator hat keinen Einfluss auf die Ausführungsgeschwindigkeit des MQL-Programms, und es ist bequem für mich, meinen Code später zu öffnen, und nachdem ich statisch gesehen habe, werde ich genau wissen, dass diese Variable einen Wert hat, der wichtig ist, um während der Programmausführung nicht zu verlieren".

 
Igor Makanu:

Aber aus meiner Erfahrung, als MT4-Builds oft aktualisiert wurden, ist es besser, sie nach klassischem C++ zu schreiben, als bei der Kommunikation mit Entwicklern auf die Antwort "schreibe den Code richtig" zu hören



ZS: Ich erinnere mich, warum ich angefangen habe, den statischen Modifikator global zu schreiben, wenn ich sichergehen will, dass ich den Variablenwert während des MQL-Programmlaufs nicht "verliere". Früher (vor etwa 5 Jahren) gab es die #property strict Precompiler-Direktive nicht und beim Aktivieren von Dateien (#include oder library - ich weiß es nicht mehr) habe ich einmal "meine Variable verloren", da die Variablennamen mit dem Variablennamen übereinstimmten.Ich wurde von MQL verflucht, aber später fand ich diesen Fehler zufällig. Aber wenn ich einen statischen Modifikator schreiben würde, würde der Compiler auch in diesem Fall einen Kompilierungsfehler anzeigen.

Der aktuelle Compiler ist MT4, ziemlich handlich und zuverlässig, und mit der Direktive #property strict, vielleicht brauche ich nicht solche Vorsichtsmaßnahmen, aber ich schreibe statisch als Gewohnheit, wenn ich nicht will, "verlieren einen Wert" einer Variablen

ZZZY: dieser Modifikator beeinträchtigt nicht die Ausführungsgeschwindigkeit des MQL-Programms, und es ist bequem für mich, meinen Code nach einiger Zeit zu öffnen, und nachdem ich statisch gesehen habe, werde ich genau wissen, dass diese Variable einen Wert hat, der wichtig ist, um während der Programmausführung nicht zu verlieren".

Der Compiler gibt eine Warnung aus, wenn die Variablennamen mit denen in der Include-Datei übereinstimmen. Für mich ist eine Warnung gleichbedeutend mit einem Fehler, und ich reagiere darauf auch so. Und globale Level-Variablen mit einem statischen Modifikator sind wie Butter.

Aber... Wenn Sie so schreiben wollen, kann Ihnen das niemand verbieten.

 
Alexey Viktorov:

Aber... Aber... wenn Sie es so schreiben wollen, kann Ihnen das niemand verbieten.

Ich habe Zweifel an meiner Einzigartigkeit in dieser Angelegenheit... Ich bin nicht der einzige, Suche durch die MQL5-Ordner fand ich solche Deklarationen mit statischen Modifikator auf globaler Ebene in mehreren Quellen von MT5 Lieferung

Sogar im Artikel "RANDOM DECISION FOREST IN THE SUMMARY" habe ich im Quellcode eine Deklaration auf der globalen Ebene gefunden: static datetime last_time=0;

so schrieb ich, wie ich es für richtig halte, zuzuordnen und werden, ich nicht 100% der Variablen auf der globalen Ebene zu beschreiben als statisch

Gott beschützt die Bedürftigen, sagte die Nonne... ))))

Grund der Beschwerde: