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

 

MT4, bitte helfen Sie der Gemeinschaft.
1. Im Expert Advisor, der auf dem M1-Chart arbeitet (mit Ticks oder mit einem Timer von 0,5 Sekunden), müssen Sie die Berechnungen zum Zeitpunkt einer neuen Kerze auf dem H1-Chart durchführen.
Wir können den Beginn der M1 Kerze fangen, nach der letzten M1 Kerze jeder Stunde (NN:00 Minuten), aber es ist nicht sehr schön ... Außerdem kann es sein, dass die H1-Kerze zu diesem Zeitpunkt nicht erscheint.
Vielleicht hat es jemand eleganter gemacht?
2. Wie viel länger dauert es, die Indikatorwerte über iCustom() abzurufen, verglichen mit dem Indikatorcode im Expert Advisor-Text?
3. wenn der Code des Indikators in den Text der Expert Advisor ist viel schneller zu berechnen, wie in der Expert Advisor an den M1-Chart, um den Indikator-Wert auf dem H1-Chart zu berechnen?

 
MikeZv:

MT4, ich bitte die Community um Hilfe.
1. Wenn Sie mit dem Expert Advisor auf dem M1-Chart arbeiten (mit Ticks oder mit einem Timer von 0,5 Sekunden), müssen Sie die Berechnungen in dem Moment durchführen, in dem eine neue Kerze auf dem H1-Chart erscheint.
Wir können den Beginn der M1 Kerze fangen, nach der letzten M1 Kerze jeder Stunde (NN:00 Minuten), aber es ist nicht sehr schön ... Außerdem kann es sein, dass die H1-Kerze zu diesem Zeitpunkt nicht erscheint.
Vielleicht hat es jemand eleganter gemacht?
2. Wie viel länger dauert es, die Indikatorwerte über iCustom() abzurufen, verglichen mit dem Indikatorcode im Expert Advisor Text?
3. wenn der Code des Indikators in den Text der Expert Advisor ist viel schneller zu berechnen, wie in der Expert Advisor an den M1-Chart, um den Indikator-Wert auf dem H1-Chart zu berechnen?

Die Antwort auf die erste Frage: Die Funktion definiert einen neuen Balken.

bool NevBar(int period)
  {
   static datetime StatTime;

   if(StatTime!=iTime(NULL,period,0))
     {
      StatTime=iTime(NULL,period,0);
      return(true);
     }
   return(false);
  }

Anwendungsbeispiel

int OnInit()
  {
//---
   NevBar(PERIOD_H1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(NevBar(PERIOD_H1))
     {
      производим вычисления.
     }
  }
//+------------------------------------------------------------------+

 
Sergey Gritsay:

Die Antwort auf die erste Frage: Die Funktion definiert einen neuen Balken.

Vielen Dank Sergey, ich habe die Dokumentation durchgesehen, aber irgendwie habe ich iTime() übersehen ... :
Und warumwird NevBar() inOnInit() aufgerufen?

 
MikeZv:

Der erste Funktionsaufruf, sonst wird er sofort ausgelöst. Um sicherzustellen, dassOnInit() nicht aufgerufen wird

bool NevBar(int period)
  {
   static datetime StatTime;
   
   if(StatTime==0)StatTime=iTime(NULL,period,0);

   if(StatTime!=iTime(NULL,period,0))
     {
      StatTime=iTime(NULL,period,0);
      return(true);
     }
   return(false);
  }
 
Sergey Gritsay:

Der erste Funktionsaufruf, sonst wird er sofort ausgelöst. Um sicherzustellen, dassOnInit() nicht aufgerufen wird

Vielen Dank, Sergej! Auf dem Forum wurde ich stark erschreckt: "Verwenden Sie keine statischen Variablen! " :)
 
MikeZv:
Vielen Dank, Sergej! Im Forum wurde ich zu Tode erschreckt: "Verwenden Sie keine statischen Variablen! " :)
Hören Sie nicht hin, wenn Sie sie benutzen müssen - benutzen Sie sie mutig, aber richtig!
 
MikeZv:
Vielen Dank, Sergej! Im Forum wurde ich zu Tode erschreckt: "Verwenden Sie keine statischen Variablen! " :)
Ich höre zum ersten Mal davon und frage mich, was daran so beängstigend ist. Ich benutze sie auch selten, aber für bestimmte Aufgaben sind sie besser.
 
Sergey Gritsay:
Ich höre zum ersten Mal von ihnen und frage mich, was daran so beängstigend ist. Ich benutze sie auch selten, aber sie sind für bestimmte Aufgaben besser geeignet.
Das Problem ist, dass eine statische Variable nur verwendet werden kann, wenn NevDay() während der gesamten Laufzeit des EA für dasselbe Symbol und denselben Zeitrahmen aufgerufen wird. Bei 2 oder mehr Symbolen gibt NevDay() falsche Werte zurück. My Expert Advisor ist für mehrere Währungen ausgelegt ... :(
 
MikeZv:
Der Punkt ist, dass die statische Variable nur verwendet werden kann, wenn NevDay() für dasselbe Symbol und denselben Zeitrahmen aufgerufen wird. Wenn es 2 oder mehr Symbole gibt, gibt NevDay() falsche Werte zurück. Mein Expert Advisor ist mehrwährungsfähig ... :(

Wenn Sie es für den Mehrwährungsmodus benötigen, hier ist ein Beispiel, es funktioniert in MT4 und MT5

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int SymbolTotal=SymbolsTotal(true);
   Comment("SymbolTotal = ",SymbolTotal);
   for(int i=0;i<SymbolTotal;i++)
     {
      if(NewBar(SymbolTotal,i,SymbolName(i,true),PERIOD_H1))
        {
         Alert(SymbolName(i,true)," Новый бар на Н1");
        }
     }

  }
//+------------------------------------------------------------------+
bool NewBar(int size,int i,string symbol,ENUM_TIMEFRAMES  period)
  {
   datetime curbar[];
   static datetime lastbar[];
   ArrayResize(curbar,size);
   ArrayResize(lastbar,size);

   curbar[i]=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);

   if(lastbar[i]==0)lastbar[i]=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar[i]!=curbar[i])
     {
      lastbar[i]=curbar[i];
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
 
MikeZv:
Der Punkt ist, dass die statische Variable nur verwendet werden kann, wenn NevDay() für dasselbe Symbol und denselben Zeitrahmen aufgerufen wird. Wenn es 2 oder mehr Symbole gibt, gibt NevDay() falsche Werte zurück. Mein Expert Advisor ist mehrwährungsfähig ... :(

Hier ist eine weitere Option, die die Klasse

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              new_bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: new_bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

CNevBar *eurusd_H1; // объявим экземпляр класса для симмвола EURUSD
CNevBar *eurusd_M15; // объявим экземпляр класса для симмвола EURUSD

CNevBar *audusd_M30; // объявим экземпляр класса для симмвола AUDUSD
CNevBar *audusd_M5; // объявим экземпляр класса для симмвола AUDUSD

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   eurusd_H1=new CNevBar();// создадим экземпляр класса для симмвола EURUSD
   audusd_M30=new CNevBar();// создадим экземпляр класса для симмвола AUDUSD
   eurusd_M15=new CNevBar();// создадим экземпляр класса для симмвола EURUSD
   audusd_M5=new CNevBar();// создадим экземпляр класса для симмвола AUDUSD

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   delete eurusd_H1;// удалим экземпляр класса для симмвола EURUSD
   delete audusd_M30;// удалим экземпляр класса для симмвола AUDUSD
   delete eurusd_M15;// удалим экземпляр класса для симмвола EURUSD
   delete audusd_M5;// удалим экземпляр класса для симмвола AUDUSD

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(eurusd_H1.new_bar("EURUSD",PERIOD_H1))
     {
      Alert("EURUSD"," Новый бар на Н1");
     }

   if(eurusd_M15.new_bar("EURUSD",PERIOD_M15))
     {
      Alert("EURUSD"," Новый бар на M15");
     }

   if(audusd_M30.new_bar("AUDUSD",PERIOD_M30))
     {
      Alert("AUDUSD"," Новый бар на M30");
     }
   if(audusd_M5.new_bar("AUDUSD",PERIOD_M5))
     {
      Alert("AUDUSD"," Новый бар на M5");
     }

//---

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

Testergebnis

2016.02.20 21:09:43     2015.01.10 00:00  тест3 test started
2016.02.20 21:09:45     2015.01.12 00:00  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:09:47     2015.01.12 00:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M30
2016.02.20 21:09:50     2015.01.12 00:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:09:53     2015.01.12 00:05  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:09:59     2015.01.12 00:10  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:04     2015.01.12 00:15  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:04     2015.01.12 00:15  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:10     2015.01.12 00:20  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:13     2015.01.12 00:25  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:16     2015.01.12 00:30  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:16     2015.01.12 00:30  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M30
2016.02.20 21:10:16     2015.01.12 00:30  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:23     2015.01.12 00:35  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:26     2015.01.12 00:40  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:29     2015.01.12 00:45  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:29     2015.01.12 00:45  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:34     2015.01.12 00:50  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:36     2015.01.12 00:55  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: EURUSD Новый бар на Н1
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M30
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:46     2015.01.12 01:05  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:50     2015.01.12 01:10  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:55     2015.01.12 01:15  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:55     2015.01.12 01:15  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:57     2015.01.12 01:17  Tester: stop button pressed