Mt4 Fin de soporte. - página 30

 
Реter Konow:

La carga recae sobre el ordenador por la actitud negligente del desarrollador respecto a la coherencia de su mecanismo. El deseo de ahorrar energía en la mejora del sistema. Consumo desmedido de recursos informáticos en nombre de facilitar su trabajo.

Mientras el ordenador se enfrente con éxito a un código escrito de forma ineficiente, el desarrollador seguirá "parasitando" la capacidad de procesamiento. Este es un camino sin salida.

Tarde o temprano, el mecanismo ineficiente dejará de evolucionar y será sustituido por otro mejor.

El tiempo y el esfuerzo del hombre serán desperdiciados y su obra acabará en el cubo de la basura.

En el mundo de la competencia, este riesgo existe todo el tiempo.

Al diseñar los mecanismos, debemos pensar en su rendimiento en primer lugar, y en la comodidad y el confort de pasar nuestras horas de trabajo en segundo lugar).

Todavía no has escrito una función para definir una nueva barra en estilo procedimental.

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Mt4 Fin de soporte.

Artyom Trishkin, 2017.09.10 23:21

Tenía un objetivo para el resultado final de su código de estilo procedimental para trabajar en un bucle de este tipo:

   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:

Sí, ya lo discutimos ayer.

Yo solía tratar con otra plataforma y allí las barras se formaban por tiempo, independientemente de las cotizaciones que entraran (mira en TWS).

Me han dicho que no es el caso de MT.

Añadiré una comprobación de llegada de la cotización para confirmar un nuevo evento de ocurrencia del bar.

Lo he estado mirando durante un tiempo. Interesante plataforma, pero según tengo entendido no es gratuita, y si no estás seguro de ganar dinero, es una pena pagar por usar el juguete...

 

Parece que mi experimento de intentar explicar el punto de vista autodidacta ha fracasado...

 
Vladimir:

¿Existe, en principio, un ejemplo de ello? ¿Aunque no sea el suyo? Tengo profundas dudas. A principios de la década de 2000 dejé de contar el número de líneas de código depuradas y en funcionamiento que escribía porque superaba el millón, y dejaba de ser interesante.

Un ejemplo elemental sería añadir otra serie n de entradas al EA, con diferentes parámetros de entrada.
Y, por supuesto, mantener estas n-posiciones, con parámetros separados, hasta el cierre.

...Y muy probablemente (usando oop) líneas de código, tendrías menos. Aunque, hay adeptos a inflar el código oop)

 
Aleksey Altukhov:

No sé si alguien lo ha sugerido, pero por qué no pasar todo lo que hay en MT4 a MT5, así todos se moverían.


¿Y quién transferiría esta montaña de EAs, indicadores y scripts acumulados?

 

Creo que he encontrado un ejemplo primitivo de la utilidad de la POO. Esta es una función para llenar un array con un valor especificado. Hay ocho variedades, según el tipo de matriz.

Imagina que tienes que escribir una función que necesita pasar un conjunto de parámetros, luego otro, luego un tercero... Usando el enfoque algorítmico obtendrás N nombres de funciones diferentes. Parece que no hay nada malo, puedes escribir 8 funciones como ArrayInitializeInt()ArrayInitializeDouble() y así sucesivamente. Pero es bueno no pensar en el tipo de array, sólo usar una función en cualquier caso, y lo seguro que es mezclar qué array pones ahí...

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

Desarrollado una nueva solución para la nueva función de bar. Es más sencillo y conciso. Tiene la posibilidad de recibir notificaciones sobre el nuevo evento de barra en cualquiera de los símbolos que están disponibles en la visión general del mercado y en cualquiera de los plazos preestablecidos.

Si ve algún error, coméntelo.

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

Desarrollado una nueva solución para la nueva función de bar. Es más sencillo y conciso. Tiene la posibilidad de recibir notificaciones sobre el nuevo evento de barra en cualquiera de los símbolos que están disponibles en la visión general del mercado y en cualquiera de los plazos preestablecidos.

Si ve algún error, coméntelo.


4 ciclos ¿no es genial? a 600 símbolos en la visión general del mercado cada minuto el terminal morirá ....

 
Реter Konow:

Se ha desarrollado una nueva solución para la nueva función de bar. Es más sencillo y conciso. Tiene la posibilidad de recibir notificaciones sobre el nuevo evento de barra en cualquiera de los símbolos que están disponibles en la visión general del mercado y en cualquiera de los plazos preestablecidos.

Si ve algún error, coméntelo.

No espero que esta función salte a OnTimer() y ya he comentado mi idea

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

Soporte final de Mt4.

Alexey Viktorov, 2017.09.11 10:09

Parece que mi experimento de intentar explicar un punto de vista autodidacta ha fracasado...


 
Реter Konow:

Se ha desarrollado una nueva solución para la nueva función de bar. Es más sencillo y conciso. Tiene la posibilidad de recibir notificaciones sobre el nuevo evento de barra en cualquiera de los símbolos que están disponibles en la visión general del mercado y en cualquiera de los plazos preestablecidos.

Si ve algún error, coméntelo.

En cuanto a los comentarios sobre el código: ¿Y si necesita definir la apertura del periodo actual y sólo un símbolo en el programa? ¿La estructura completa hará un bucle de todos los bucles? No es racional.

ps; ¿Y por qué debería iniciar un temporizador de milisegundos? ¿No es suficiente un segundo temporizador?