Mt4 Fin de soporte. - página 32

 
Vitaly Muzichenko:

Lo puse, lo probé, no funciona

Siempre se muestra falso.
¿Te ha funcionado o no?
 
Реter Konow:
Es evidente que no sabes leer los códigos. )) ¿Dónde los devora?

en Karaganda.

 
Dmitry Fedoseev:

en karaganda

¿Hay alguna confusión? ¿Tal vez en Ulan-Ude?
 
George Merts:

Me pregunto si alguien tiene realmente tanto?

Tengo 16, y ya me pregunto si es demasiada carga.

Tengo un plazo mínimo de M15... Pero aún así, me pregunto cuándo la carga del terminal empieza a ser crítica.

Mi cliente me pide que compruebe y escanee todos los símbolos del servidor en cada momento. Y no son muchos, ni pocos, sino 10.230... Ahí es donde está el problema...

 
Artyom Trishkin:

Tengo un cliente que me pide que compruebe y escanee en cada tic todos los personajes del servidor. Y no son muchos, ni pocos, sino 10.230... Ese es el problema...

Recuerdo que había un límite del número máximo de símbolos en la ventana de Market Watch a 1024. ¿No existe ahora? ¿Puedo tener 10 mil?
 
Alexey Viktorov:
¿Hay alguna confusión? ¿Tal vez esté en el Ulan-Ude?

Estaba pensando que si una persona realmente tiene 600 instrumentos en la visión de mercado y en cada tick comprueba la llegada de una nueva barra para cada instrumento y cada marco temporal, puede ser costoso...

Yo mismo no comercio, así que no sé exactamente cuántas veces debe llamarse esta función en la práctica.

El doble bucle sobre símbolos y plazos en la función de nueva barra puede aumentar la carga sólo si el número de símbolos y plazos es muy grande y se llama a la función en cada tick de cientos de símbolos. Tal vez Dmitry tenga razón entonces.

He acortado un bucle de la función.

 
Vladimir:
Recuerdo que había un límite del número máximo de símbolos en la ventana de Market Watch a 1024. ¿No existe ahora? ¿También puedes tener 10 mil?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Fin de soporte de Mt4.

Artyom Trishkin, 2017.09.11 14:37

Tengo un cliente que me pide que compruebe y escanee en cada tic todos los símbolos del servidor. Y no son muchos, ni pocos, sino 10.230... Ahí es donde está el problema...

Atención... ;)
 

Aquí está la nueva versión. No es definitivo.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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:
¿Lo has conseguido o no?

Peter, a mí tampoco me funciona. Aunque el algoritmo es bastante rápido, es una pérdida de tiempo. Pero todavía no funciona. No hay tiempo para resolverlo.
Su estilo de programación es extraño. Puedes poner todo esto con todas las variables y bucles de OnInit y OnTimer en un procedimiento. Si alguien quiere usarlo, todo esto se interpone. ¿Y si hay 20 o más procedimientos con el mismo contenido? Se aplicaaquí .

 
Реter Konow:

Estaba pensando que si una persona realmente tiene 600 instrumentos en la visión general del mercado y en cada tick comprueba la llegada de una nueva barra para cada instrumento y cada marco temporal, podría ser costoso...

Yo mismo no comercio, así que no sé exactamente cuántas veces debe llamarse esta función en la práctica.

El doble bucle sobre símbolos y plazos en la función de nueva barra puede aumentar la carga sólo si el número de símbolos y plazos es muy grande y se llama a la función en cada tick de cientos de símbolos. Tal vez Dmitry tenga razón entonces.

He acortado un ciclo en la función.

Echa un vistazo al código de Galina y mira qué puedes mejorar en tu código.

Sinceramente.