Mt4 Ende der Unterstützung. - Seite 30

 
Реter Konow:

Die Last wird dem Computer durch die nachlässige Haltung des Entwicklers gegenüber der Kohärenz seines Mechanismus aufgebürdet. Der Wunsch, bei der Verbesserung des Systems Energie zu sparen. Unvernünftiger Verbrauch von Computerressourcen im Namen der Arbeitserleichterung.

Solange der Computer erfolgreich mit ineffizient geschriebenem Code zurechtkommt, wird der Entwickler weiterhin auf der Rechenleistung "schmarotzen". Dies ist eine Sackgasse.

Früher oder später wird sich der ineffiziente Mechanismus nicht mehr weiterentwickeln und durch ein besseres Gegenstück ersetzt werden.

Die Zeit und die Mühe des Menschen werden vergeudet, und sein Geistesprodukt wird im Mülleimer landen.

In der Welt des Wettbewerbs besteht dieses Risiko ständig.

Bei der Entwicklung von Mechanismen sollten wir in erster Linie an deren Leistung denken und in zweiter Linie an den Komfort und die Bequemlichkeit, mit der wir unsere Arbeitszeit verbringen).

Sie haben immer noch keine Funktion geschrieben, um einen neuen Balken im prozeduralen Stil zu definieren.

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Mt4 Ende der Unterstützung.

Artyom Trishkin, 2017.09.10 23:21

Ich hatte das Ziel, dass das Endergebnis seines prozeduralen Codes in einer solchen Schleife funktioniert:

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Реter Konow:

Ja, das haben wir gestern besprochen.

Ich hatte früher mit einer anderen Plattform zu tun, und dort wurden die Balken nach der Zeit gebildet, unabhängig von den eingehenden Kursen (siehe TWS).

Mir wurde gesagt, dass dies bei MT nicht der Fall ist.

Ich werde eine Ankunftskontrolle hinzufügen, um ein neues Bar-Ereignis zu bestätigen.

Ich schaue mir das jetzt schon eine Weile an. Interessante Plattform, aber soweit ich weiß, ist sie nicht kostenlos, und wenn man nicht sicher ist, dass man damit Geld verdient, ist es schade, für die Nutzung des Spielzeugs zu bezahlen...

 

Offenbar ist mein Versuch, den Standpunkt des Autodidakten zu erklären, gescheitert...

 
Vladimir:

Gibt es im Prinzip ein Beispiel dafür? Auch wenn es nicht Ihre sind? Ich habe große Zweifel. In den frühen 2000er Jahren hörte ich auf, die Anzahl der fehlerbereinigten und funktionierenden Codezeilen zu zählen, die ich schrieb, weil sie eine Million überstieg und uninteressant wurde.

Ein einfaches Beispiel wäre, dem EA eine weitere n-fache Reihe von Eingängen mit unterschiedlichen Eingangsparametern hinzuzufügen.
Und natürlich die Beibehaltung dieser n-Positionen, mit separaten Parametern, bis zum Abschluss.

...Und höchstwahrscheinlich (bei Verwendung von oop) hätten Sie weniger Codezeilen. Obwohl, es sind geschickt bei der Aufblähung oop Code)

 
Aleksey Altukhov:

Ich weiß nicht, ob es schon jemand vorgeschlagen hat, aber warum nicht alles von MT4 auf MT5 umstellen, dann würden alle umziehen.


Und wer würde diesen Berg von angesammelten EAs, Indikatoren und Skripten übertragen?

 

Ich glaube, ich habe ein primitives Beispiel für die Brauchbarkeit von OOP gefunden. Hier ist eine Funktion zum Füllen eines Arrays mit einem bestimmten Wert. Es gibt acht Varianten, je nach Art der Anordnung.

Stellen Sie sich vor, Sie müssen eine Funktion schreiben, die eine Reihe von Parametern übergeben muss, dann eine andere, dann eine dritte... Mit dem algorithmischen Ansatz erhalten Sie N verschiedene Funktionsnamen. Es scheint, dass es nichts falsch ist, können Sie 8 solche Funktionen wie ArrayInitializeInt()ArrayInitializeDouble() und so weiter zu schreiben.Aber es ist schön, nicht über den Typ des Arrays nachdenken zu müssen, nur eine Funktion in jedem Fall zu verwenden, und wie sicher es ist, das Array zu verwechseln, das man dort einfügt...

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Entwicklung einer neuen Lösung für die neue Barfunktion. Sie ist einfacher und prägnanter. Sie hat die Möglichkeit, eine Benachrichtigung über ein neues Bar-Ereignis für jedes der in der Marktübersicht verfügbaren Symbole und für jeden der voreingestellten Zeitrahmen zu erhalten.

Wenn Sie Fehler entdecken, kommentieren Sie bitte.

//+------------------------------------------------------------------+
//|                                                  Новый бар 2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
datetime Время_последнего_бара;

int      Частота_таймера        = 25;
int      Всех_символов;
int      Таймфреймы[7]          = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int      Всех_таймфреймов       = 7;
int      Количество_баров[][7];
bool     События_нового_бара[][7];

string   Символы[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time[0];
   //-------------------------------------------------------------   
   //Узнаем сколько символов есть в обзоре рынка.
   //---------------------------------------------------------
   Всех_символов = SymbolsTotal(true);
   //---------------------------------------------------------   
   //Устанавливаем размер массива Символы. Внутри него будут записаны
   //имена всех символов, которые есть в окне обзоре рынка.
   //---------------------------------------------------------
   ArrayResize(Символы,Всех_символов);
   //---------------------------------------------------------
   //Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".
   //В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа
   //и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги
   //события нового бара для каждого символа и каждого таймфрейма. 
   //---------------------------------------------------------
   ArrayResize(Количество_баров,Всех_символов);
   ArrayResize(События_нового_бара,Всех_символов);
   //---------------------------------------------------------
   //Записываем наименования символов обзора рынка в массив "Символы[]".
   //---------------------------------------------------------
   for(int a1 = 0; a1 < Всех_символов; a1++)
     {
      Символы[a1] = SymbolName(a1 + 1,true); 
      //Возможно, нумерация символов в обзора рынка идет с нуля.
      //Тогда: Символы[a1] = SymbolName(a1,true);
     }
   //---------------------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
 static bool Начало_отсчета;
 static int  Минута;
 //---------------------------
 //Нам нужен корректный старт отсчета. Это должно быть время начала бара.
 //---------------------------
 if(!Начало_отсчета && Time[0] != Время_последнего_бара)Начало_отсчета = true; 
 //--------------------------- 
 if(Начало_отсчета)Минута++;
 //--------------------------- 
 //В следующем цикле, мы будем обращатся к функции iBars (раз в минуту) для получения количества баров на 
 //каждом из символов и таймфреймов, которые будем проходить в цикле.
 //Далее, будем сравнивать записанное количество баров с текущим и при 
 //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".
 //---------------------------
 if(Минута*Частота_таймера >= 60000)
   {
    for(int a1 = 0; a1 < Всех_символов; a1++)
      {
       string Этот_символ = Символы[a1];
       //---------------------------------
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          int Этот_таймфрейм = Таймфреймы[a2];
          //------------------------------------------
          int Текущее_количество_баров = iBars(Этот_символ,Этот_таймфрейм);
          //------------------------------------------
          if(Текущее_количество_баров > Количество_баров[a1][a2])
            {
             //------------------------------------------------------------
             //Если это не самая первая запись в массив Количества баров,
             //то фиксируем событие нового бара.
             //------------------------------------------------------------
             if(Количество_баров[a1][a2])События_нового_бара[a1][a2]  = true;
             //------------------------------------------------------------
             //Устанавливаем новое значение текущего количества баров.
             //------------------------------------------------------------
             Количество_баров   [a1][a2]  = Текущее_количество_баров;
            }
          //------------------------------------------
         }
      }
    //---------
    Минута = 0;
   }
 //-----------------------------------------------
    
}
//+------------------------------------------------------------------+






//---------------------------------------------------------------------
//Функция Новый_бар() принимает наименование символа и таймфрейм.
//Она делает цикл по массиву символов, находит совпадение наименований и 
//с запрашиваемым символом, и далее ищет нужный таймфрейм для получения
//индекса ячейки массива в которой он находится. 
//Найдя индекс ячейки имени нужного символа и индекс ячейки нужного
//таймфрейма, функция обращается к массиву "События_нового_бара" и 
//возвращает факт события нового бара или его отсутствие.
//После возврата флага события, функция снимает этот флаг.
//Следовательно, флаг события можно получить только один раз за бар.
//---------------------------------------------------------------------
bool Новый_бар(string Символ, int Таймфрейм)
{
 bool Новый_бар;
 //-----------------------
 for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    if(Символы[a1] == Символ)
      {
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          if(Таймфреймы[a2] == Таймфрейм)
            {
             Новый_бар  = События_нового_бара[a1][a2];
             if(Новый_бар)События_нового_бара[a1][a2] = 0;
             return(Новый_бар);
            }
         }
      }
   }
 //-----------------------
 return(false);
}
//+------------------------------------------------------------------+
 
Реter Konow:

Entwicklung einer neuen Lösung für die neue Barfunktion. Sie ist einfacher und prägnanter. Sie hat die Möglichkeit, eine Benachrichtigung über ein neues Bar-Ereignis für jedes der in der Marktübersicht verfügbaren Symbole und für jeden der voreingestellten Zeitrahmen zu erhalten.

Wenn Sie Fehler entdecken, kommentieren Sie bitte.


4 Zyklen, ist das nicht cool? bei 600 Symbolen in der Marktübersicht wird das Terminal jede Minute sterben ....

 
Реter Konow:

Entwicklung einer neuen Lösung für die neue Barfunktion. Sie ist einfacher und prägnanter. Es wurde die Möglichkeit implementiert, eine Benachrichtigung über ein neues Bar-Ereignis für jedes der in der Marktübersicht verfügbaren Symbole und für jeden der voreingestellten Zeitrahmen zu erhalten.

Wenn Sie Fehler entdecken, kommentieren Sie bitte.

Ich erwarte nicht, dass diese Funktion in OnTimer() springt, und ich habe bereits auf meine Idee kommentiert

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Mt4 Ende Unterstützung.

Alexey Viktorov, 2017.09.11 10:09

Offenbar ist mein Versuch, eine autodidaktische Sichtweise zu erklären, gescheitert...


 
Реter Konow:

Entwicklung einer neuen Lösung für die neue Barfunktion. Sie ist einfacher und prägnanter. Sie hat die Möglichkeit, eine Benachrichtigung über ein neues Bar-Ereignis für jedes der in der Marktübersicht verfügbaren Symbole und für jeden der voreingestellten Zeitrahmen zu erhalten.

Wenn Sie Fehler entdecken, kommentieren Sie bitte.

Was die Kommentare zum Code betrifft: Was ist, wenn Sie die Eröffnung der aktuellen Periode und nur ein Symbol im Programm definieren müssen? Die gesamte Struktur wird alle Schleifen? Das ist nicht rational.

ps; Und warum sollte ich einen Millisekunden-Timer starten? Ist ein zweiter Timer nicht genug?

Grund der Beschwerde: