Mt4 Fim do apoio. - página 30

 
Реter Konow:

O ônus é colocado no computador pela atitude negligente do desenvolvedor em relação à coerência de seu mecanismo. Um desejo de economizar energia para melhorar o sistema. Consumo exagerado de recursos informáticos em nome da facilitação de seu trabalho.

Enquanto o computador lidar com o código escrito de forma ineficiente, o desenvolvedor continuará a "parasitar" o poder de processamento. Esta é uma estrada sem saída.

Mais cedo ou mais tarde, o mecanismo ineficiente deixará de evoluir e será substituído por um homólogo melhor.

O tempo e o esforço do homem serão desperdiçados e sua cria acabará no caixote do lixo.

No mundo competitivo, este risco existe o tempo todo.

Projetando mecanismos, devemos pensar em seu desempenho em primeiro lugar, e no conforto e conveniência de passar nosso horário de trabalho no segundo).

Você ainda não escreveu uma função para definir uma nova barra em estilo processual.

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Mt4 Fim do apoio.

Artyom Trishkin, 2017.09.10 23:21

Eu tinha um objetivo para o resultado final de seu código de estilo de procedimento de trabalhar em tal laço:

   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:

Sim, discutimos isso ontem.

Eu costumava lidar com outra plataforma e ali as barras eram formadas pelo tempo, independentemente das citações que chegavam (veja em TWS).

Disseram-me que esse não é o caso na MT.

Acrescentarei um cheque de chegada de cotação para confirmar um novo evento de ocorrência de bar.

Já faz um tempo que estamos olhando para ela. Plataforma interessante, mas como entendo que não é de graça, e se você não tem certeza de ganhar dinheiro, é uma pena pagar para usar o brinquedo...

 

Aparentemente, minha experiência de tentar explicar o ponto de vista autodidata falhou.

 
Vladimir:

Existe, em princípio, um exemplo disso? Mesmo que não seja seu? Tenho profundas dúvidas. No início dos anos 2000, parei de contar o número de linhas de código de depuração e de trabalho que escrevi, porque excedeu um milhão, tornou-se desinteressante.

Um exemplo elementar seria adicionar outra série n de entradas à EA, com parâmetros de entrada diferentes.
E, é claro, mantendo estas n-posições, com parâmetros separados, até o fechamento.

...E o mais provável (usando oop) linhas de código, você teria menos. Embora, há adeptos em inchar o código oop)

 
Aleksey Altukhov:

Não sei se alguém o sugeriu, mas por que não mudar tudo em MT4 para MT5, então todos se mudariam.


E quem transferiria esta montanha de EAs, indicadores e roteiros acumulados?

 

Acho que encontrei um exemplo primitivo da usabilidade do OOP. Aqui está uma função para preencher uma matriz com um valor especificado. Existem oito variedades, dependendo do tipo de matriz.

Imagine que você precisa escrever uma função que precisa passar um conjunto de parâmetros, depois outro, depois um terceiro... Usando a abordagem algorítmica, você terá N nomes de funções diferentes. Parece que não há nada de errado, você pode escrever 8 funções como ArrayInitializeInt()ArrayInitializeDouble() e assim por diante. Mas é bom não pensar no tipo de matriz, basta usar uma função em qualquer caso, e como é seguro misturar qual matriz você colocou lá...

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

Desenvolveu uma nova solução para a nova função de barra. É mais simples e mais conciso. Ela tem a possibilidade de receber notificação sobre o novo evento de bar em qualquer um dos símbolos disponíveis na visão geral do mercado e em qualquer um dos prazos pré-estabelecidos.

Se você vir algum erro, por favor, comente.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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:

Desenvolveu uma nova solução para a nova função de barra. É mais simples e mais concisa. Ela tem a possibilidade de receber notificação sobre o novo evento de bar em qualquer um dos símbolos disponíveis na visão geral do mercado e em qualquer um dos prazos pré-estabelecidos.

Se você vir algum erro, por favor, comente.


4 ciclos não é legal ? a 600 símbolos na visão geral do mercado a cada minuto o terminal vai morrer ....

 
Реter Konow:

Desenvolveu uma nova solução para a nova função de barra. É mais simples e mais conciso. Implementou a possibilidade de receber notificação sobre o novo evento de bar em qualquer um dos símbolos disponíveis na visão geral do mercado e em qualquer um dos prazos pré-estabelecidos.

Se você vir algum erro, por favor, comente.

Não espero que esta função salte para o OnTimer() e já comentei a minha idéia

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

Suporte final Mt4.

Alexey Viktorov, 2017.09.11 10:09

Aparentemente, minha experiência de tentar explicar um ponto de vista autodidata falhou.


 
Реter Konow:

Desenvolveu uma nova solução para a nova função de barra. É mais simples e mais conciso. Ela tem a possibilidade de receber notificação sobre o novo evento de bar em qualquer um dos símbolos disponíveis na visão geral do mercado e em qualquer um dos prazos pré-estabelecidos.

Se você vir algum erro, por favor, comente.

Quanto aos comentários sobre o código: E se você precisar definir a abertura do período atual e apenas um símbolo no programa? Toda a estrutura irá fazer o loop de todos os loops? Não é racional.

ps; E por que devo iniciar um temporizador de milissegundos? Um segundo timer não é suficiente?

Razão: