Mt4 Fim do apoio. - página 32

 
Vitaly Muzichenko:

Colocá-lo, testá-lo, ele não funciona

Está sempre se mostrando falso.
Funcionou ou ainda não funcionou para você?
 
Реter Konow:
Obviamente, você não sabe ler códigos. )) Onde ela as devora?

em Karaganda.

 
Dmitry Fedoseev:

em karaganda

Existe alguma confusão? Talvez em Ulan-Ude?
 
George Merts:

Será que alguém realmente tem tanto assim?

Eu tenho 16 - e já estou me perguntando se é uma carga demais?

Eu tenho um prazo mínimo de M15... Mas ainda assim, pergunto-me quando é que a carga no terminal começa a ser crítica ?

Meu cliente me pede para verificar e escanear todos os símbolos no servidor a cada tique. E não são muitos, não poucos, mas 10 230... É aí que reside o problema...

 
Artyom Trishkin:

Tenho um cliente me pedindo para verificar e escanear em cada tique todos os caracteres do servidor. E não são muitos, não poucos, mas 10.230... Esse é o problema...

Lembro-me que havia um limite do número máximo de símbolos na janela do Market Watch para 1024. Não existe agora? Posso ter 10 mil?
 
Alexey Viktorov:
Existe alguma confusão? Talvez seja no Ulan-Ude?

Eu estava pensando que se uma pessoa realmente tem 600 instrumentos na visão geral do mercado e em cada carrapato ele verifica a chegada de uma nova barra para cada instrumento e cada período de tempo, pode ser caro...

Eu mesmo não negocio, portanto não sei exatamente quantas vezes esta função deve ser chamada na prática.

O loop duplo em símbolos e prazos na nova função de barra pode aumentar a carga somente se o número de símbolos e prazos for muito grande e a função for chamada em cada tick de centenas de símbolos. Talvez Dmitry esteja certo então.

Eu encurtei um loop na função.

 
Vladimir:
Lembro-me que havia um limite do número máximo de símbolos na janela do Market Watch para 1024. Não existe agora? Você pode ter 10 mil também?

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Mt4 Fim do Apoio.

Artyom Trishkin, 2017.09.11 14:37

Tenho um cliente me pedindo para verificar e escanear em cada tick todos os símbolos no servidor. E não são muitos, não poucos, mas 10.230... É aí que reside o problema...

Atenção... ;)
 

Aqui está a nova versão. Não é 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:
Você foi bem sucedido ou ainda não?

Peter, isso também não está funcionando para mim. Embora o algoritmo seja bastante rápido, é uma perda de tempo. Mas ainda não está funcionando. Não há tempo para descobrir.
Seu estilo de programação é estranho. Você pode colocar tudo isso com todas as variáveis e loops do OnInit e OnTimer em um único procedimento. Se alguém quiser usá-lo, tudo isso vai atrapalhar. E se houver 20 ou mais procedimentos com o mesmo conteúdo? Ela é implementadaaqui .

 
Реter Konow:

Eu estava pensando que se uma pessoa realmente tem 600 instrumentos na visão geral do mercado e em cada carrapato ele verifica a chegada de uma nova barra para cada instrumento e cada período de tempo, pode ser caro...

Eu mesmo não negocio, portanto não sei exatamente quantas vezes esta função deve ser chamada na prática.

O loop duplo em símbolos e prazos na nova função de barra pode aumentar a carga somente se o número de símbolos e prazos for muito grande e a função for chamada em cada tick de centenas de símbolos. Talvez Dmitry esteja certo então.

Encurtei um ciclo na função.

Dê uma olhada no código da Galina e veja o que você pode melhorar em seu código.

Sinceramente.
Razão: