Mt4 Fin de soporte. - página 34

 

Volviendo al tema del hilo. Los resultados de la encuesta "¿Qué plataforma utilizas?" se han publicado hace una o dos horas http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/:

"Así, según los resultados de la votación, la plataforma MetaTrader 4 del proveedor de software comercial MetaQuotes gana con una ventaja significativa, la preferencia del 63% de los participantes. El producto estrella del mismo proveedor, MetaTrader 5, recibió el 19% de los votos. Al mismo tiempo, el 21% de los que han votado utilizan "otras" plataformas de negociación, no incluidas en la lista."

Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
  • Vadim Sviderski
  • ru.forexmagnates.com
В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
 
Dmitry Fedoseev:

¿Quizás no sabes lo que significa "rápido"?

Aunque creo que sí lo sé))
No tengo tiempo para probarlo ahora mismo.
No he estudiado el código de Peter en detalle, pero lo pasé por el perfilado. El ciclo completo de generación de datos duró aproximadamente 1 microsegundo. Este es el mejor resultado hasta el momento con la suposición de que no se necesitarán arreglos globales en el código para que funcione completamente.
 
Реter Konow:

¿Funciona bien su solución? Si es bueno, es genial.

¿Y los cientos de herramientas? ¿No habrá una superposición?

Como dije de entrada "no es una obra maestra", es sólo un esfuerzo autodidacta para aprender POO. Pero funciona sin ningún problema. Antes de este, mql4 funcionaba bien en mql5, pero no funcionaba correctamente. Tengo un tema en alguna parte - He tenido una larga discusión de alto nivel con Drummer...

Tal vez tenga que añadir otra variante a la función para cientos de instrumentos, pero el nombre seguirá siendo el mismo. Y esto es, en mi opinión, el plus más agradable de la OOP. Si dominas la POO más a fondo, puede que encuentres ventajas aún más agradables, pero... no en mi vida...

 
Nikolai Semko:
Aunque creo que sí lo sé))
Simplemente no tengo tiempo para probarlo ahora mismo.
No he estudiado el código de Peter en detalle, pero lo pasé por el perfilado. El ciclo completo de generación de datos duró aproximadamente 1 microsegundo. Este es el mejor resultado hasta el momento con la suposición de que no se necesitarán arreglos globales en el código para que funcione completamente.

De todos modos, has demostrado que no lo sabes.

 
Dmitry Fedoseev:

Aun así, has demostrado que no sabes.

Muy bien, como quieras. No lo sé. Estoy derrotado y tu pie está en mi pecho. ¡¡¡Enhorabuena!!! Que lo disfrutes.
 
Dmitry Fedoseev:

No tienes ni idea de la idiotez que has demostrado, es una completa anormalidad. Pero no voy a mostrar exactamente dónde, porque a todos ustedes no les interesa mi opinión)))

Cualquier persona está interesada en opinar sólo con argumentos válidos.

El argumento "hay que hacerlo porque yo lo hago" no interesa a nadie.

En este caso concreto, los nombres de las variables no se corresponden con lo que se acepta es un argumento débil. Esto no fue escrito para CodeBase.

 

Es curioso como todos ustedes se sientan en el póker de la cruz aquí. Sigue sentado, hace que el mundo que te rodea sea más divertido.

 
Dmitry Fedoseev:

Es curioso como todos ustedes se sientan en el póker de la cruz aquí. Sigue sentado, hace que el mundo que te rodea sea más divertido.


¡Bien hecho, Dimitri!
Si Peter es un maestro en avivar fuegos, tú eres un maestro en apagarlos ))))

 
Alexey Volchanskiy:

Hasta ahora, incluso MOFT no soporta MT5, lo que es frustrante para mí, ya que he estado picando los spreads allí. ¿Y qué significa el apoyo? ¿Lanzamiento de nuevas versiones? Bueno, si no se encuentran errores críticos, tal vez no haya ninguno nuevo.

Me he arrastrado en parte a MT5, pero como bien ha señalado Dmitiry, las condiciones son mejores en MT4 por ahora.

No lo es. La velocidad y la calidad de laejecución de órdenes en MT5 crean un entorno agradable para acostumbrarse a lo mejor (hay spreads sanos y, de hecho, muy bajos durante los períodos de liquidez, el ejemplo es el mismo Robo(MT5)). Lo que a su vez da ventajas al límite de órdenes en determinados niveles de liquidez. /*<= y esto puede compensar con creces los gastos generales (spread y comisión si la cuenta tiene comisión).

De los ejemplos de esto /*las flechas verdes son los niveles de límite que establecí, y las flechas rojas a azules son cómo funcionó la orden real*/:

 

Esta variante de la función no tiene ninguna función New_bar();

Esta es la opción que más recursos ha proporcionado. Además, tiene otra ventaja: el nuevo evento de la barra se guarda todas las veces que el código del usuario se ejecuta en un evento de temporizador o de tic.

Anteriormente, sólo se podía obtener este evento una vez y la bandera se borraba con New_bar(). La función especial ahora borra la matriz "event_new_bar[][]" una vez por minuto y se llama sólo después de la ejecución del código personalizado.

Las funciones personalizadas pueden acceder directamente a la matriz y recuperar la información de los nuevos eventos de barra cada vez que se ejecuta el código en un evento de temporizador o de tic.

Los recursos se ahorran aún más.

//+------------------------------------------------------------------+
//|                                                  Новый бар 3.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()
  {
//--- 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;
   }
 //-----------------------------------------------
 //Здесь наш код...
 //Здесь наш код...
 //Здесь наш код...
 //-----------------------------------------------
 //После завершения всех вызовов на этом событии таймера
 //снимаем флаги событий нового бара.
 if(!Минута)Снять_событие_нового_бара();
 //-----------------------------------------------   
}
//+------------------------------------------------------------------+
//Функция снимает флаги событий нового бара.
//Эта процедура осуществляется после выполнения всего пользовательского
//кода один раз в минуту. Вплоть до момента очищения массива флагов 
//новых баров, все функции могут их видеть обращаясь к массиву напрямую.
//+------------------------------------------------------------------+
void Снять_событие_нового_бара()
{
 for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
      {
       События_нового_бара[a1][a2] = false;
      }
   }
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//Пример использования событий нового бара в пользовательском функционал.
//Просто обращаемся к глобальному массиву "События_нового_бара[a1][a2]" напрямую
//и используем событие в наших торговых алгоритмах.
//+------------------------------------------------------------------+
void Моя_стратегия_торговли_на_новых_барах()
{
  for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    string Этот_символ    = Символы[a1];
    //----------------------------------
    for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
      {
       bool   Новый_бар      = События_нового_бара[a1][a2];
       int    Этот_таймфрейм = Таймфреймы[a2];
       //----------------------------------
       if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M15)
         {
          //Купить();
         }
       //---------------------------------- 
       if(Новый_бар && Этот_символ == "AUDUSD" && Этот_таймфрейм == PERIOD_M30)
         {
          //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+
Razón de la queja: