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

 
Igor Zakharov:

Nur nicht die aus dem Kalender. 30-Tage-Balken rückwärts (Sonntage, Samstage)

Nach der Funktion ohne den Verschiebungsparameter zu urteilen, machen Sie das in 5 und Sie haben die Frage in 4 gestellt :)

Ja, 30 Takte sind 21 Arbeitstage, wenn Sie von gestern an zählen. (24.02.2019 - 25.01.2019)

Ich habe

Für den Monat durchschnittliche Kerzengröße : 598

Für eine Woche durchschnittliche Kerzengröße : 519

Und iATR() gibt zehnstellige Zahlen aus...

Ich weiß also noch nicht, wie man es benutzt.

 
Alexander Layzerevich:

Und iATR() gibt zehnstellige Zahlen aus...

In der Regel handelt es sich um Dezimalbrüche (d.h. wie der Preis. Um in Punkte umzurechnen, müssen Sie durch _Point dividieren).

Zur Veranschaulichung: Euro/Dollar ab heute - 560 Pips auf Tagesbasis für den Monat.


 
Igor Zakharov:

In der Regel Dezimalbrüche (d.h. wie der Preis. Um in Punkte umzurechnen, dividieren Sie durch _Point).

Zur Veranschaulichung: Euro/Dollar ab heute - 560 Pips auf Tagesbasis für einen Monat.


Ich habe es in MQL4 überprüft:

iATR

 
Igor Zakharov:

In der Regel Dezimalbrüche (d.h. wie der Preis. Um in Punkte umzurechnen, dividieren Sie durch _Point).

Zur Veranschaulichung: Euro/Dollar ab heute - 560 Pips auf Tagesbasis für einen Monat.


Ich habe es in MQL5 überprüft. Ich habe den folgenden Code geschrieben, um dies zu überprüfen:

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

Das zeigt sich hier:

iATR

D.h., es wird ein Wert angezeigt, aber ein anderer...

 
Alexander Layzerevich:

Ich habe es in MQL5 überprüft. Ich habe diesen Code geschrieben, um das zu überprüfen:

Dies ist die Ausgabe:

D.h. es wird ein Wert angezeigt, aber es wird ein anderer angezeigt...

In MQL5 ist eine solche Konstruktion der Arbeit mit dem Indikator nicht geeignet

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

Zuerst müssen Sie ein Handle erstellen, und das haben Sie getan, und erst danach können Sie Werte aus demCopyBuffer holen

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

In MQL5 ist eine solche Konstruktion der Arbeit mit dem Indikator nicht geeignet

Zuerst müssen Sie ein Handle erstellen, was Sie jetzt getan haben, und danach können Sie Werte aus demCopyBuffer abrufen

Danke, ich werde das berücksichtigen und den Code umschreiben.

Ich schreibe es gerade in MT4 und verwende #include <MT4Orders.mqh>, um es in MT5 zu testen.

Vielleicht unterstützt die Bibliothek keine Indikatoren.

 
Alexander Layzerevich:

Danke, ich werde das berücksichtigen und den Code umschreiben.

Ich schreibe es einfach in MT4 und verwende #include <MT4Orders.mqh>, um es in MT5 zu testen.

Vielleicht unterstützt die Bibliothek keine Indikatoren.

Ja, nur Handelsfunktionen.

 
Alexander Layzerevich:

Danke, ich werde das berücksichtigen und den Code umschreiben.

Ich schreibe es einfach in MT4 und verwende #include <MT4Orders.mqh>, um es in MT5 zu testen.

Möglicherweise unterstützt die Bibliothek keine Indikatoren.

Es ist ein sehr schneller Weg, zwei Plattformen zu kombinieren, es funktioniert, aber es ist besser, dies nicht in mql5 zu tun

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %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 ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

Und wenden Sie den Indikator auf dieselbe Weise an wie in mql4

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

Dies ist eine sehr schnelle Möglichkeit, die beiden Plattformen zu kombinieren, es funktioniert, aber es ist besser, dies nicht in mql5 zu tun

Und wenden Sie den Indikator auf dieselbe Weise an wie in mql4

Herzlichen Dank für den Code.

Es hat funktioniert:

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %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 ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

Jetzt habe ich zu Beginn des EA-Starts gemittelte Daten. Und diese Daten werden jedes Mal neu berechnet, wenn ich die Funktion aufrufe.

So wie ich es verstehe, muss ich einen Pufferspeicher mit den berechneten Daten anlegen, um den Aufruf zu begrenzen.

Wir müssen also die Bedingung für die Neuberechnung festlegen. Montags" und wenn nichts im Puffer ist.

D.h. deklarieren Sie die Variable buferStep = -1; und inOnTick() wenn buferStep <0 oder "Monday" dann neu berechnen.

Auch hier komme ich nicht weiter: Wie kann der Roboter erklären, dass heute "Montag" ist?

 
Alexander Layzerevich:

Herzlichen Dank für den Code.

Das hat folgendermaßen funktioniert:

Ich habe jetzt die gemittelten Daten beim Start des EA. Und diese Daten werden bei jedem Aufruf der Funktion neu berechnet.

So wie ich es verstehe, muss ich einen Pufferspeicher mit den berechneten Daten anlegen, um den Aufruf zu begrenzen.

Wir müssen also die Bedingung für die Neuberechnung festlegen. Montags" und wenn nichts im Puffer ist.

D.h. deklarieren Sie die Variable buferStep = -1; und inOnTick() wenn buferStep <0 oder "Monday" dann neu berechnen.

Auch hier habe ich ein Problem: Wie kann der Roboter erklären, dass heute "Montag" ist?

Ich möchte nicht den Montag verwenden, sondern nur die Anzahl der vergangenen Tage. Und ich würde es bei jedem neuen Balken bekommen, um den Expert Advisor nicht bei jedem Tick mit Berechnungen zu belasten.