Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 186

 
¡por favor, aconsejar el mejor indicador de señal en este sitio ... siempre y cuando sea libre de costo, por supuesto!
 
barabashkakvn:
¿Y "bastantes cálculos basados en la historia" se suman a un conjunto dinámico?

Existe, sí :) Bueno, más concretamente, se utilizan varias matrices dinámicas, pero se supone que no deben crecer hasta un tamaño demasiado grande.

Y sobre la división por la mitad, no parece haber mucha diferencia en el segmento que se tome y en el número de entradas que tenga. Por término medio, un día se gestiona en 2500-3500 ms, pero una semana hay que esperar unos minutos. No tengo un registro adecuado a mano en este momento, no puedo estar seguro de cuánto. Pero un orden de magnitud superior a 5 veces al día, y la mayor parte del tiempo se emplea en el último o los dos últimos días. Un mes, en cambio, se puede dejar toda la noche y por la mañana probablemente seguirá colgado >.>

 
Lone_Irbis:


Y sobre lo de dividirlo por la mitad, no parece haber mucha diferencia en qué sección tomar y cuántas entradas tiene.

Incluir una prueba de avance con una proporción de 1 / 2. Dividirá automáticamente el historial en períodos. Además, también descubrirá si merece la pena.
 
Lone_Irbis:
Me pregunto si hay un artículo en alguna parte como "las razones más comunes de la lentitud de EA". Estoy tratando de entender por qué el Asesor Experto en el Probador de Estrategias vuela al principio pero se ralentiza más adelante. No está en la fase de desarrollo para que sea tan crítica (la velocidad es suficiente para el desarrollo de mecanismos y herramientas básicas). Pero sigue siendo un inconveniente que los segmentos de más de una semana no tengan sentido, porque después la velocidad ya tiende a cero.

Intenta poner un barril de pintura en sus ruedas y deslizarlo detrás de ti cuando lo necesites.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Линейное торможение - ошибка программиста или особенность работы MT4?
Линейное торможение - ошибка программиста или особенность работы MT4?
  • www.mql5.com
Такая работа просто убивает возможность оперативной настройки советника.
 
MetaDriver:

Intenta poner el barril de pintura sobre sus ruedas y deslizarlo detrás de ti según sea necesario.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Es una parábola interesante :) Gracias por el consejo. Todo lo que queda es encontrar ese barril en particular... O más bien barriles. Sin embargo, ya tengo una vaga sospecha de los manipuladores de las noticias y los niveles de resistencia...
 
Lone_Irbis:
Es una parábola entretenida :) Gracias por el consejo. Lo único que queda es encontrar el barril... O más bien barriles. Sin embargo, ya tengo una vaga sospecha de los manipuladores de las noticias y los niveles de resistencia...
La mayoría de las veces ese barril es "el principio de los tiempos" - el Asesor Experto trata de reanalizar su propio historial de operaciones (o alguna otra información acumulada) en cada barra (tick).
 
Recientemente me he centrado en la creación de paneles, así que mi pregunta es. Estoy creando dos etiquetas OBJ_RECTANGLE_LABEL y OBJ_LABEL y no sé cómo arrastrar OBJ_RECTANGLE_LABEL sobre el gráfico para que OBJ_LABEL se arrastre exactamente como uno. ¿Quizás haya algún mecanismo de vinculación entre ellos y una acción sobre uno provoque lo mismo en el otro (todos los demás)?
 
MetaDriver:
La mayoría de las veces ese barril es "el principio del tiempo" - el propio historial de operaciones (o alguna otra información acumulada) que un Asesor Experto trata de reanalizar en cada barra (tick).

¡О! Sorprendentemente, el problema se encontró y se arregló literalmente en minutos. De hecho, el problema estaba en el historial de operaciones, que repasaba cada tick. La función que heredé del código a la "el más simple Asesor Experto para mql5" que se utilizó en el principio. De alguna manera se me ha olvidado desde entonces. Parece que funciona, así que creo que para qué molestarse... Obviamente, será mejor que busque entre los restos de ese código :) Por si acaso alguien ha buscado aquí con retrasos similares, voy a publicar el fragmento problemático y mi trabajo creativo sobre el tema en un intento de resolver este problema. No sé cuánto más "correcta" es mi versión en relación con la fuente. Lo más probable es que sea exactamente el mismo código de mierda que todo lo que escribo. [A mí, por supuesto, no me importa. Si a alguien se le ocurre utilizar la pieza de abajo: tened en cuenta que el autor es un shitcoder autodidacta. ^^] Pero al menos no parece que se haya roto nada y el robot vuela como un avión :) Bueno, comparado con lo que era, al menos. El juicio de dos meses pasó en un minuto, lo que sigue siendo un bonito contraste con el original de más de 6 horas %)

Era:

// Эта функция вызывалась дважды за каждый тик. С ее помощью записывались две глобальные переменные: 
// с ценой последнего ордера и числом открытых ордеров (да, взятый за исходник код был примером самого простейшего мартина). 
double History(bool LastPrice = false){
   long Ticket, OldTicket = 0, PosID, Magic, Dir;
   double PriceOpen = 0, Count = 0;
   ENUM_DEAL_TYPE CheckDir;
   if(Sell) CheckDir = DEAL_TYPE_SELL; 
   else if(Buy) CheckDir = DEAL_TYPE_BUY;
   
   HistorySelect(0, Now);
   int HistoryTotal = HistoryDealsTotal();
   // Проблемное место было тут: в цикле перебиралась вся история торговли, что в начале немного. 
   // Но даже за сутки счетчик доходил до сотни (не рискну предположить, сколько там набиралось за месяц). 
   // И этот бессмысленный и беспощадный процесс повторялся на каждом тике вообще без всякой на то причины.
   for (int i=0; i < HistoryTotal; i++){ 
      Ticket = (int)HistoryDealGetTicket(i);
      PosID  = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
      Magic  = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
      Dir    = HistoryDealGetInteger(Ticket, DEAL_TYPE);
      
      if(LastPrice) { // Этой частью добывалась цена
         if(PosID == PositionID && Magic == MagicNumber && Dir == CheckDir) {
            if(Ticket > OldTicket) {
               PriceOpen = HistoryDealGetDouble(Ticket, DEAL_PRICE);
               OldTicket = Ticket;
            }
         }
      }
      
      else { // А тут оно считало ордера
         if(PosID == PositionID && Magic == MagicNumber) Count++;
      }                              
   }
   
   if(LastPrice) return(PriceOpen);
   else return(Count);
}

Se convirtió:

// Вызывается она теперь только в конце функций создания/изменения/закрытия позиций. Если открытых нет - глобальные переменные просто обнуляются.
// Хотя в принципе, если вызывать ее не каждый тик, а только на изменениях, вероятно и старая версия не тормозила бы так уж сильно
void History(){
   long Ticket, PosID, Magic, Dir;
   bool GotPrice = false;
   Total = 0;
   HistorySelect(0, Now);
   int HistoryTotal = HistoryDealsTotal();
   
   // Похоже, что быстрее будет считать с обратного конца
   for(int i=HistoryTotal;i>=0;i--){
      Ticket = (int)HistoryDealGetTicket(i);
      PosID  = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
      Magic  = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
      Dir    = HistoryDealGetInteger(Ticket, DEAL_TYPE);
      
      if(PosID == PositionID && Magic == MagicNumber) {
         // Корявую конструкцию заменяем на... другую корявую конструкцию... но она хотя бы компактнее :)
         Total++; 
         if(!GotPrice){
            LastOrderPrice = HistoryDealGetDouble(Ticket, DEAL_PRICE);
            GotPrice = true; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
         }
      }
      // Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем цикл
      else if(PosID > 0 && PosID < PositionID) break; 
   }
}

De todos modos, gracias por la ayuda :) Sin el consejo, probablemente no se me habría ocurrido buscar en esos rincones lejanos y polvorientos del código durante mucho tiempo...

 
Lone_Irbis:

¡О! Sorprendentemente, el problema se encontró y se arregló literalmente en minutos. De hecho, el problema estaba en el historial de operaciones, que repasaba cada tick. La función que heredé del código a la "el más simple Asesor Experto para mql5" que se utilizó en el principio. De alguna manera se me ha olvidado desde entonces. Parece que funciona, así que creo que para qué molestarse... Al parecer, todavía tengo que buscar entre los restos de ese código :) Por si acaso alguien ha buscado aquí con retrasos similares, voy a publicar el fragmento problemático y mi trabajo creativo sobre el tema en un intento de resolver este problema. No sé cuánto más "correcta" es mi versión en relación con la fuente. Lo más probable es que sea exactamente el mismo código de mierda que todo lo que escribo. [A mí, por supuesto, no me importa. Si a alguien se le ocurre utilizar la pieza de abajo: tened en cuenta que el autor es un shitcoder autodidacta. ^^] Pero al menos no parece que se haya roto nada y el robot vuela como un avión :) Bueno, comparado con lo que era, al menos. El juicio de dos meses pasó en un minuto, lo que sigue siendo un bonito contraste con el original de más de 6 horas %)

Era:

Se convirtió:

De todos modos, gracias por la ayuda :) Sin el consejo, probablemente no se me habría ocurrido buscar en esos rincones lejanos y polvorientos del código durante mucho tiempo...

Bien.
 
paladin800:
Recientemente me he centrado en la creación de paneles, así que mi pregunta es. Estoy creando dos etiquetas OBJ_RECTANGLE_LABEL y OBJ_LABEL y no sé cómo arrastrar OBJ_RECTANGLE_LABEL sobre el gráfico para que OBJ_LABEL se arrastre exactamente como uno. ¿Quizás haya un mecanismo para unirlos entre sí y que una acción sobre uno provoque la misma acción sobre el otro (todos los demás)?

No existe tal mecanismo, así que tendré que crear uno yo mismo. Afortunadamente, no es tan difícil. Pero habrá que trabajar un poco.

Buena suerte.

Razón de la queja: