Mt4 Fin de l'assistance. - page 32

 
Vitaly Muzichenko:

Je l'ai mis, je l'ai testé, ça ne marche pas.

C'est toujours faux.
Cela a-t-il fonctionné pour vous ou pas encore ?
 
Реter Konow:
Vous ne savez manifestement pas comment lire les codes. )) Où les dévore-t-elle ?

à Karaganda.

 
Dmitry Fedoseev:

en karaganda

Y a-t-il une confusion ? Peut-être à Ulan-Ude ?
 
George Merts:

Je me demande si quelqu'un en a vraiment autant ?

J'en ai 16 - et je me demande déjà si ce n'est pas une charge trop lourde ?

J'ai une échéance minimale de M15... Mais quand même, je me demande quand la charge sur le terminal commence à être critique ?

Mon client me demande de vérifier et de scanner tous les symboles sur le serveur à chaque tick. Et il n'y a pas beaucoup, pas peu, mais 10 230... C'est là que réside le problème...

 
Artyom Trishkin:

J'ai un client qui me demande de vérifier et de scanner à chaque tic tous les personnages sur le serveur. Et il n'y a pas beaucoup, pas peu, mais 10 230... C'est le problème...

Je me souviens qu'il y avait une limite du nombre maximum de symboles dans la fenêtre Market Watch à 1024. N'existe-t-il pas maintenant ? Je peux avoir 10 000 ?
 
Alexey Viktorov:
Y a-t-il une confusion ? Peut-être que c'est dans l'Ulan-Ude ?

Je me disais que si une personne a vraiment 600 instruments dans l'aperçu du marché et qu'à chaque tick elle vérifie l'arrivée d'une nouvelle barre pour chaque instrument et chaque timeframe, cela pourrait être coûteux....

Je ne fais pas moi-même de commerce, donc je ne sais pas exactement combien de fois cette fonction doit être appelée en pratique.

La double boucle sur les symboles et les horizons temporels dans la fonction de nouvelle barre peut augmenter la charge uniquement si le nombre de symboles et d'horizons temporels est très important et que la fonction est appelée à chaque tick de centaines de symboles. Peut-être que Dmitry a raison alors.

J'ai raccourci une boucle dans la fonction.

 
Vladimir:
Je me souviens qu'il y avait une limite du nombre maximum de symboles dans la fenêtre Market Watch à 1024. N'existe-t-il pas maintenant ? Vous pouvez aussi avoir 10 mille ?

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Mt4 Fin du support.

Artyom Trishkin, 2017.09.11 14:37

J'ai un client qui me demande de vérifier et de scanner à chaque tic tous les symboles sur le serveur. Et il n'y a pas beaucoup, pas peu, mais 10 230... C'est là que réside le problème...

Attention... ;)
 

Voici la nouvelle version. Ce n'est pas définitif.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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:
Avez-vous réussi ou pas encore ?

Peter, ça ne marche pas pour moi non plus. Bien que l'algorithme soit assez rapide, c'est une perte de temps. Mais ça ne marche pas encore. Pas le temps d'y penser.
Votre style de programmation est étrange. Vous pouvez mettre tout cela avec toutes les variables et les boucles de OnInit et OnTimer dans une seule procédure. Si quelqu'un veut l'utiliser, tous ces trucs vont le gêner. Que faire s'il y a 20 procédures ou plus avec le même contenu ? Il est mis en œuvreici .

 
Реter Konow:

Je me disais que si une personne a vraiment 600 instruments dans l'aperçu du marché et qu'à chaque tick elle vérifie l'arrivée d'une nouvelle barre pour chaque instrument et chaque timeframe, cela peut être coûteux....

Je ne fais pas moi-même de commerce, donc je ne sais pas exactement combien de fois cette fonction doit être appelée en pratique.

La double boucle sur les symboles et les horizons temporels dans la fonction de nouvelle barre peut augmenter la charge uniquement si le nombre de symboles et d'horizons temporels est très important et que la fonction est appelée à chaque tick de centaines de symboles. Peut-être que Dmitry a raison alors.

J'ai raccourci un cycle dans la fonction.

Jetez un œil au code de Galina et voyez ce que vous pouvez améliorer dans votre code.

Sincèrement.