Mt4 Ende der Unterstützung. - Seite 32

 
Vitaly Muzichenko:

Eingebaut, getestet, funktioniert nicht

Es wird immer falsch angezeigt.
Hat es bei Ihnen funktioniert oder noch nicht?
 
Реter Konow:
Sie wissen offensichtlich nicht, wie man Codes liest. )) Wo verschlingt sie sie?

in Karaganda.

 
Dmitry Fedoseev:

in Karaganda

Gibt es hier Verwirrung? Vielleicht in Ulan-Ude?
 
George Merts:

Ich frage mich, ob jemand wirklich so viel hat?

Ich habe 16 - und ich frage mich schon, ob das nicht zu viel ist?

Ich habe einen Zeitrahmen von mindestens M15... Dennoch frage ich mich, ab wann die Belastung des Terminals kritisch wird?

Mein Kunde bittet mich, alle Symbole auf dem Server bei jedem Tick zu überprüfen und zu scannen. Und es sind nicht viele, nicht wenige, sondern 10 230... Genau da liegt das Problem...

 
Artyom Trishkin:

Ich habe einen Kunden, der mich bittet, alle Zeichen auf dem Server bei jedem Tick zu überprüfen und zu scannen. Und es sind nicht viele, nicht wenige, sondern 10.230... Das ist das Problem...

Ich erinnere mich, dass die maximale Anzahl der Symbole im Market Watch-Fenster auf 1024 begrenzt war. Gibt es das jetzt nicht mehr? Kann ich 10.000 haben?
 
Alexey Viktorov:
Gibt es hier Verwirrung? Vielleicht ist es in Ulan-Ude?

Ich dachte, wenn jemand wirklich 600 Instrumente in der Marktübersicht hat und bei jedem Tick das Eintreffen eines neuen Balkens für jedes Instrument und jeden Zeitrahmen prüft, könnte es teuer werden...

Ich selbst handele nicht, daher weiß ich nicht genau, wie oft diese Funktion in der Praxis aufgerufen werden sollte.

Die Doppelschleife für Symbole und Zeitrahmen in der Funktion "Neuer Balken" kann die Belastung nur erhöhen, wenn die Anzahl der Symbole und Zeitrahmen sehr groß ist und die Funktion bei jedem Tick von Hunderten von Symbolen aufgerufen wird. Vielleicht hat Dmitry also recht.

Ich habe eine Schleife in der Funktion verkürzt.

 
Vladimir:
Ich erinnere mich, dass die maximale Anzahl der Symbole im Market Watch-Fenster auf 1024 begrenzt war. Gibt es das jetzt nicht mehr? Sie können auch 10.000 haben?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Mt4 Ende der Unterstützung.

Artyom Trishkin, 2017.09.11 14:37

Ich habe einen Kunden, der mich bittet, alle Symbole auf dem Server zu überprüfen und zu scannen, sobald er sie sieht. Und es sind nicht viele, nicht wenige, sondern 10.230... Genau da liegt das Problem...

Achtung... ;)
 

Hier ist die neue Version. Es ist noch nicht endgültig.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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 Всех_символов;

string Символы[];
int    Таймфреймы[7] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int    Всех_таймфреймов = 7;


int    Количество_баров[][7];
bool   События_нового_бара[][7];

//+------------------------------------------------------------------+
#define  M1    0
#define  M5    1
#define  M15   2
#define  M30   3
#define  H1    4
#define  H4    5
#define  D1    6
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {Alert("!!!");
//--- 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] == Символ)
      {
       Новый_бар  = События_нового_бара[a1][Таймфрейм];
       if(Новый_бар)События_нового_бара[a1][Таймфрейм] = 0;
       return(Новый_бар);  
      }
   }
 //-----------------------
 return(false);
}
//--------------------------
//+------------------------------------------------------------------+
 
Реter Konow:
Ist es Ihnen gelungen oder noch nicht?

Peter, bei mir funktioniert es auch nicht. Obwohl der Algorithmus recht schnell ist, ist er eine Zeitverschwendung. Aber es funktioniert noch nicht. Keine Zeit, das herauszufinden.
Ihr Programmierstil ist seltsam. Sie können all diese Dinge mit allen Variablen und Schleifen aus OnInit und OnTimer in eine Prozedur packen. Wenn jemand sie benutzen will, ist all dieses Zeug im Weg. Was ist, wenn es 20 oder mehr Verfahren mit demselben Inhalt gibt? Sie wirdhier umgesetzt.

 
Реter Konow:

Ich dachte, wenn jemand wirklich 600 Instrumente in der Marktübersicht hat und bei jedem Tick das Eintreffen eines neuen Balkens für jedes Instrument und jeden Zeitrahmen prüft, könnte es teuer werden...

Ich selbst handele nicht, daher weiß ich nicht genau, wie oft diese Funktion in der Praxis aufgerufen werden sollte.

Die Doppelschleife für Symbole und Zeitrahmen in der Funktion "Neuer Balken" kann die Belastung nur erhöhen, wenn die Anzahl der Symbole und Zeitrahmen sehr groß ist und die Funktion bei jedem Tick von Hunderten von Symbolen aufgerufen wird. Vielleicht hat Dmitry also recht.

Ich habe einen Zyklus in der Funktion verkürzt.

Schauen Sie sich Galinas Code an und sehen Sie, was Sie in Ihrem Code verbessern können.

Mit freundlichen Grüßen.
Grund der Beschwerde: