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

 
neverness:

Ich habe Ihnen direkt gesagt, dass Sie andere nicht belehren sollten, wenn Sie selbst keine Ahnung haben.

Hilfe sollte "qualifiziert" sein, nicht "von der Straße"!

Definieren Sie das Problem noch einmal neu, was genau benötigt wird.

 
Vitaly Muzichenko:

Beschreiben Sie die Aufgabe noch einmal genau, was benötigt wird.

Ich interessiere mich für die Möglichkeit, Daten in MT4/MT5 zwischen verschiedenen Modulen zu übertragen.

Zum Beispiel:

Wie überträgt man Daten von einem Indikator zu einem anderen?

Wie überträgt man Daten von einem Indikator in ein Skript?

Wie überträgt man Daten vom Indikator zum Expert Advisor? usw. ... und so weiter.

Das einfache Hinzufügen der übertragenen Daten zu einer separaten Datei und das anschließende Lesen dieser Daten aus der Datei in anderen Modulen ist ein recht naheliegender und gängiger Weg, um sie zu übertragen.

In diesem Fall gibt es jedoch ein Problem mit der Synchronisierung der übertragenen/gelesenen Daten.

Intuitiv nehme ich an, dass das MT4/MT5-Terminal einen bestimmten gemeinsamen Pufferspeicherbereich haben muss und dass es Verfahren geben muss, die den Datenaustausch über diesen Bereich regeln.

Aber ich habe in der Beschreibung nichts dergleichen gefunden.

 
neverness:

Ich interessiere mich für das MT4/MT5-Übertragungsverfahren zwischen verschiedenen Modulen.

Zum Beispiel:

Wie überträgt man Daten von einem Indikator zu einem anderen?

Wie überträgt man Daten von einem Indikator in ein Skript?

Wie überträgt man Daten vom Indikator zum Expert Advisor? usw. ... und so weiter.

Das einfache Hinzufügen der übertragenen Daten zu einer separaten Datei und das anschließende Lesen dieser Daten aus der Datei in anderen Modulen ist ein recht naheliegender und gängiger Weg, um sie zu übertragen.

In diesem Fall gibt es jedoch ein Problem bei der Synchronisierung der übertragenen/gelesenen Daten.

Intuitiv nehme ich an, dass das MT4/MT5-Terminal einen bestimmten gemeinsamen Pufferspeicherbereich haben muss und dass es einige Verfahren geben muss, die den Datenaustausch über diesen Bereich regeln.

Aber ich habe nichts dergleichen in der Beschreibung gefunden.

Nun, die Datenübertragung kann über eine Datei oder eine globale Variable des Terminals erfolgen.

Wenn es eine globale Variable ist:

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

Dies ist der einfachste Weg, um zwischen allen Programmen in einem Terminal auszutauschen

 
Vitaly Muzichenko:

Nun, die Datenübertragung kann über eine Datei oder eine globale Variable des Terminals erfolgen, wie zuvor geschrieben

Wenn eine globale Variable:

Dies ist der einfachste Weg, um zwischen allen Programmen in einem Terminal auszutauschen

Gut. Schreiben wir in Indikator einen Ausdruck:

GlobalVariableSet("Sname", 123.25); Dieses Ereignis tritt z.B. bei onTick() auf.

Aber Skripte arbeiten nicht mit Datenarrays, und sie haben kein OnTick()-Ereignis. Wie das Skript weiß, dass das OnTick()-Ereignis eingetreten ist und die Prozedur anwenden sollte, um neue Daten zu erhalten

GlobalVariableGet("Sname");

Sie können das Ereignis OnTimer() anstelle von OnTick() verwenden. Aber das Skript hat sein eigenes OnTimer(), während der Indikator sein eigenes hat, also sind sie nicht miteinander verbunden.

Hier liegt das Problem:

Wie kann sichergestellt werden, dass die EreignisseGlobalVariableSet("Sname", 123.25); und GlobalVariableGet("Sname"); synchron sind?

Oder gibt es ein Verfahren, das die Änderung des "Sname"-Werts überwacht? Wie OnChange.

Das heißt, woher weiß das Skript, dass der Indikator den Wert von "Sname" geändert hat und dieser Wert 125,35 geworden ist?

Wo ist die Brücke zwischenGlobalVariableSet("Sname", 123.25); und GlobalVariableGet("Sname"); ?

Sie sind in verschiedenen Programmen.


 
neverness:

GUT. Lassen Sie uns einen Ausdruck in den Indikator schreiben:

GlobalVariableSet("Sname", 123.25); Dieses Ereignis tritt z.B. ein, wenn OnTick().

Aber Skripte arbeiten nicht mit Datenarrays, und sie haben kein OnTick()-Ereignis. Wie das Skript weiß, dass das OnTick()-Ereignis eingetreten ist und die Prozedur anwenden sollte, um neue Daten zu erhalten

GlobalVariableGet("Sname");

Sie können das Ereignis OnTimer() anstelle von OnTick() verwenden. Aber das Skript hat sein eigenes OnTimer(), während der Indikator sein eigenes hat und sie nicht miteinander verbunden sind.

Hier liegt das Problem:

Wie kann sichergestellt werden, dass die EreignisseGlobalVariableSet("Sname", 123.25); und GlobalVariableGet("Sname"); synchron sind?

Oder gibt es ein Verfahren, das die Änderung des "Sname"-Werts überwacht? Wie OnChange.

Das heißt, woher weiß das Skript, dass der Indikator den Wert von "Sname" geändert hat und dieser Wert 125,35 geworden ist?

Wo ist die Brücke zwischenGlobalVariableSet("Sname", 123.25); und GlobalVariableGet("Sname"); ?

Sie sind in verschiedenen Programmen.

Das Bindeglied ist eine Computerfestplatte. Record Ich denke, das Problem ist nicht, und Sie können es in jedem Fall zu bekommen, auch in dem Skript, es unterscheidet sich nicht von, wie Sie den aktuellen Wert ASK und BID bekommen


P.S. Ich füge einen Indikator und ein Skript als Beispiel bei, im Indikator werden die Tickvolumina aufgezeichnet

Indikator

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   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[])
  {
//---
  ArraySetAsSeries(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Drehbuch

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
Dateien:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

Das Bindeglied ist die Festplatte des Computers. Ich denke, es wird kein Problem sein, es zu schreiben, aber Sie können es von jedem Ereignis abrufen, sogar in einem Skript, es ist nicht anders, als wenn Sie die aktuellen ASK- und BID-Werte erhalten

Super!

Und wie soll das gehen?

Nennen Sie mir ein Beispiel.

Zum Beispiel, wie man einen solchen Fall simuliert.

Der Indikator empfängt Daten, berechnet die Varianz der Daten und bereitet Ellipsenpunktkoordinaten für das Skript vor (4 globale Variablen Q1,Q2,T1,T2, die an das Skript übergeben werden).

Nun sollte der Indikator dem Skript einen Befehl geben, der die Ellipse unter Verwendung dieser globalen Variablen zeichnet.

Wie kann der Indikator das tun?

 
Vitaly Muzichenko:

Das Bindeglied ist die Festplatte des Computers. Ich denke, es wird kein Problem sein, aufzuzeichnen, aber Sie können es von jedem Ereignis auch im Skript erhalten, es unterscheidet sich nicht davon, wie Sie die aktuellen Werte von ASK und BID erhalten


P.S. Ich füge einen Indikator und ein Skript als Beispiel bei, im Indikator werden die Tickvolumina aufgezeichnet

Indikator

Das Drehbuch

In Ihrem Beispiel funktioniert das Skript nur einmal - beim Start, d. h. wenn das Ereignis OnStart() eintritt.

Und wie dann?

Wo ist die Synchronisierung?

Wie können Sie das Skript synchron mit dem Indikator arbeiten lassen?

Wie kann das Skript beispielsweise aktiviert werden, wenn das Volumen einen bestimmten Wert überschreitet?

 
neverness:

In Ihrem Beispiel funktioniert das Skript also nur einmal - beim Start, d. h. wenn das Ereignis OnStart() eintritt.

Und wie dann?

Wo ist die Synchronisierung?

Wie können Sie das Skript synchron mit dem Indikator arbeiten lassen?

Wie kann das Skript beispielsweise aktiviert werden, wenn das Volumen einen bestimmten Wert überschreitet?

Es ist Ihre Aufgabe, wie Sie mit dem Skript arbeiten. Vielleicht ist es einfacher, einen Expert Advisor zu erstellen als ein Skript?

Ein Indikator, der Werte angibt:

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   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[])
  {
//---
  ArraySetAsSeries(time,true);
  ArraySetAsSeries(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Ein einfaches Beispiel für ein Skript in einer Schleife:

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.S. Ich habe den Code korrigiert.

 
Vitaly Muzichenko:

Es bleibt Ihnen überlassen, wie Sie mit dem Skript arbeiten. Wäre es nicht einfacher für Sie , einen EA statt eines Skripts zu erstellen?

Ein Indikator, der Werte angibt:


Ein einfaches Beispiel für ein Skript in einer Schleife:

Ich habe verstanden, dass es in MQL keine Möglichkeit gibt, verschiedene Module zu synchronisieren.

Gut. Dann habe ich eine Frage. Was ist, wenn ich die Schaltfläche auf dem Feld platziere und das Skript an diese Schaltfläche leite?

Gibt es eine solche Möglichkeit in MQL, oder gibt es auch keine?

Schließlich muss das Skript ja irgendwie gestartet werden!

 
neverness:

Ich weiß, dass es in MQL keine Möglichkeit gibt, verschiedene Module zu synchronisieren.

Gut. Dann habe ich eine Frage. Was ist, wenn ich die Schaltfläche auf dem Feld platziere und das Skript an diese Schaltfläche leite?

Gibt es eine solche Möglichkeit in MQL, oder gibt es auch keine?

Das Skript muss irgendwie gestartet werden!

Das Thema ist alt, aber immer noch lesenswert, oder vielleicht schlägt jemand etwas Neues vor. Ich führe keine Skripte aus und arbeite überhaupt nicht mit ihnen)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...