Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1151

 
Maksym Mudrakov:

Der Fehler könnte in der Anzahl der Stellen nach dem Dezimalpunkt liegen:


Das ist nicht der Fehler, die Daten werden nicht in der Historie berechnet, aber von dem Moment an, in dem das Symbol erstellt wird, wird alles korrekt berechnet, ich vermute, dass die Funktion zur Berechnung der Historie nicht korrekt funktioniert, d.h. es ist ein Fehler.
 
Guten Tag, meine Herren.

Ich habe ein solches Problem, ich habe gerade mit MT5 angefangen, ich übertrage meine Indikatoren von MT4 und ich bin auf einige Probleme gestoßen. Ich muss iMA in einer Zeile verwenden und den Wert eines bestimmten Index abrufen. Ich habe Nachrichten im Forum gesehen und verwende die Funktion iMAGet (sowie die ähnliche Funktion iATRGet usw.). Wie ich sehe, die Funktionen nicht mehr funktionieren, dann diese Frage: wie man anmutig einen einzigen iMA-Wert erhalten? Ich habe versucht, dies mit den oben genannten Funktionen zu erreichen:

NormalizeDouble(iMAGet(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW), shift), Digits())

Ich weiß, dass es schlecht ist, ohne zu prüfen, aber ich muss alten MT4-Code portieren, ich konnte nicht an eine andere Möglichkeit denken, um es einfacher zu machen (ich habe Dutzende von Assistenten, und sie alle arbeiten auf verschiedenen Zeitrahmen). Ich kann die Assistenten nicht in oninit initialisieren, weil der Code drei Schritte verschachtelt ist und ich den benötigten Assistenten nicht ohne Probleme aufrufen kann. Kurz gesagt, mein Ziel ist es also, die

Diese :

NormalizeDouble(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW, shift), Digits())

In etwas, das auf MT5 ohne irgendwelche drastischen Gesten funktioniert.

 
Olga Miakhovich:
Guten Tag, meine Herren.

Ich habe ein Problem, ich habe gerade MT5 gestartet und habe Probleme damit, wenn ich meine Indikatoren von MT4 übertrage. Ich muss iMA in einer Zeile verwenden und den Wert eines bestimmten Index abrufen. Ich habe Nachrichten im Forum gesehen und verwende die Funktion iMAGet (sowie die ähnliche Funktion iATRGet usw.). Wie ich sehe, die Funktionen nicht mehr funktionieren, dann diese Frage: wie man anmutig einen einzigen iMA-Wert erhalten? Ich habe versucht, dies mit den oben genannten Funktionen zu erreichen:


Ich weiß, es ist schlecht, ohne zu überprüfen, aber ich habe zu portieren alten MT4-Code, ich konnte nicht denken, von einem anderen Weg, um es einfacher (ich habe Dutzende von Assistenten, und sie alle arbeiten auf verschiedenen Zeitrahmen). Ich kann die Assistenten nicht in oninit initialisieren, weil der Code drei Schritte verschachtelt ist und ich den benötigten Assistenten nicht ohne Probleme aufrufen kann. Kurz gesagt, mein Ziel ist es also, die

Diese :

In etwas, das auf MT5 ohne irgendwelche drastischen Gesten funktioniert.

Sehen Sie sich die Beispiele in kodobase an, zum Beispiel dieses:https://www.mql5.com/ru/code/27161

Grundsätzlich: Erstellen eines Indikator-Handles in OnInit()

handle_iMA_High=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                       Inp_MA_ma_method,PRICE_HIGH);
//--- if the handle is not created
   if(handle_iMA_High==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator (\"Price High\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }

Dann kopieren Sie das/die benötigte(n) Element(e) in die Zwischenablage und arbeiten damit

if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

https://www.mql5.com/ru/docs/series/copybuffer

 
Vitaly Muzichenko:

Schauen Sie sich Beispiele in der kodobase an, z. B. dieses:https://www.mql5.com/ru/code/27161

Grundsätzlich: Indikator-Handle in OnInit() erzeugen

Dann kopieren Sie das/die erforderliche(n) Element(e) in den Puffer und arbeiten damit

https://www.mql5.com/ru/docs/series/copybuffer

Wie ich bereits geschrieben habe, ist die Initialisierung in OnInit für mich nicht geeignet. Ich habe mit allen Timeframes gleichzeitig arbeiten, habe ich alle Masken in jedem TF zu initialisieren, und dann in Code, wo ich einige Wert verwenden, tun etwas wie dieses:

if(timeframe = PERIOD_M5)
        CopyBuffer(handle_ma_m5, ...)
if(timeframe = PERIOD_M15)
        CopyBuffer(handle_ma_m15, ...)
...

Und so mit jedem Aufruf jedes Armbands. Der Code wird einfach zu einem verwirrenden Durchfall werden.

Und jede neue Bar muss sie irgendwie aktualisieren?

Gibt es eine Funktion wie CopyBuffer, aber das Kopieren nicht ein Array, sondern einen Wert durch erforderliche Index?

 
Olga Miakhovich:

Wie ich bereits geschrieben habe, ist die Initialisierung in OnInit für mich nicht geeignet. Ich habe mit allen Timeframes gleichzeitig arbeiten, habe ich alle Masken in jedem TF zu initialisieren, und dann in Code, wo ich einige Wert verwenden, tun etwas wie dieses:

Und so mit jedem Aufruf jedes Armbands. Der Code wird einfach zu einem Wirrwarr.

Und jeder neue Balken muss irgendwie aktualisiert werden?

Gibt es eine Funktion wie CopyBuffer, aber Kopieren nicht ein Array, sondern einen einzelnen Wert durch den richtigen Index?

Erstellen Sie ein Array von Handles inOnInit() und arbeiten Sie mit ihnen.

CopyBuffer(...) in die Funktion einfügen, sie mit dem Indikator-Handle und dem gewünschten Index aus dem Array füttern, und die Funktion wird den Preis zurückgeben

 
Vitaly Muzichenko:

Erstellen Sie ein Array von Handles inOnInit() und arbeiten Sie mit ihnen.

CopyBuffer(...) der Einfachheit halber in eine Funktion umwandeln, den Indikator-Handle und den gewünschten Index aus dem Array übergeben, und die Funktion wird den Preis zurückgeben

allerdings sehr unbequem)

 
Olga Miakhovich:

(es ist allerdings peinlich))

Eher ungemütlich ))))

 
Vitaly Muzichenko:

Erstellen Sie ein Array von Handles inOnInit() und arbeiten Sie mit ihnen.

CopyBuffer(...) in die Funktion für die Benutzerfreundlichkeit, dort füttern Sie den Indikator-Handle und den erforderlichen Index aus dem Array, und die Funktion wird den Preis zurückgeben

Das andere Problem von CopyBuffer ist, dass es einen Indikatorpuffer für sich selbst benötigt. Ich habe insgesamt hundert Indikatoren, die in Berechnungen verwendet werden, um einen einzigen Indikator zu erhalten. Muss ich hundert Puffer erstellen, um diese Werte zu speichern?

 
Olga Miakhovich:

Ein weiteres Problem mit CopyBuffer ist, dass es notwendigerweise einen Indikatorpuffer für sich selbst benötigt. Ich habe insgesamt weniger als hundert Indikatoren, und sie werden in Berechnungen verwendet, um einen einzigen Indikator zu erhalten. Muss ich hundert Puffer erstellen, um diese Werte zu speichern?

Suchen Sie nach Codebeispielen in der CodeBase von scriptor - dort finden Sie alles.
Eigentlich können Sie den MA für jeden Balken berechnen.
 
Ich brauche ein Beispiel, um das folgende Problem zu lösen: Es gibt einen Indikator ¹1 im Chart mit einem Dutzend grafischer Puffer (keine Wavecaps und anderes Zeug) und der Basisindikator ¹2 sollte einige Puffer vom Indikator ¹1 nehmen und sie als Hixogramme (egal wie) bereits im Basement anzeigen. Vielen Dank im Voraus, für MT5.
Grund der Beschwerde: