Errores, fallos, preguntas - página 2226

 
Andrey Khatimlianskii:

Esperando en la KB ;)

La solución resultó ser mucho más sencilla de lo que pensaba.

Un ejemplo de indicador, en el que se puede conocer el estado del Temporizador. Sólo tienes que añadir una línea #include <Timer.mqh> y OnTimer() bajo control.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#include  <Timer.mqh>

int OnInit()
  {
   if(iTimer.On) Print("Таймер включен, период таймера = "+IntegerToString(iTimer.curPer)+" миллисеккунд"); else Print("Таймер выключен");
   EventSetMillisecondTimer(2201);
   return(INIT_SUCCEEDED);
  }
////////////////////////////////////////////  
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
///////////////////////////////////////////// 
void OnTimer()
  {
   if(iTimer.On) Print("Таймер включен, период таймера = "+IntegerToString(iTimer.curPer)+" миллисеккунд"); else Print("Таймер выключен");
   EventKillTimer();
   if(iTimer.On) Print("Таймер включен, период таймера = "+IntegerToString(iTimer.curPer)+" миллисеккунд"); else Print("Таймер выключен");
  }

Y aquí está la clase en sí:

//+------------------------------------------------------------------+
//|                                                        Timer.mqh |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                         https://www.mql5.com/ru/users/nikolay7ko |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Nikolay Semko"
#property link      "https://www.mql5.com/ru/users/nikolay7ko"
#property link      "SemkoNV@bk.ru"  

///////////////////////////////////////////////////////////////////////////
class CTimer
  {
public:
                     CTimer() {curPer=0; On=false;}
                    ~CTimer() {}
   bool              On;
   int               curPer;
   void              AddNewProgTimerSec(int per){EventSetTimer(per); curPer=per*1000; On=true;}
   void              AddNewProgTimerMilliSec(int per) {EventSetMillisecondTimer(per); curPer=per; On=true;}
   void              KillProgTimer() {EventKillTimer(); curPer=0; On=false;}
  };
///////////////////////////////////////////////////////////////////////////
static CTimer iTimer;

#define EventSetMillisecondTimer iTimer.AddNewProgTimerMilliSec
#define EventSetTimer iTimer.AddNewProgTimerSec
#define EventKillTimer iTimer.KillProgTimer
Resultado:
2018.07.12 21:10:37.177	TestСTimer (EURUSD.m,M5)	Таймер выключен
2018.07.12 21:10:39.385	TestСTimer (EURUSD.m,M5)	Таймер включен, период таймера = 2201 миллисеккунд
2018.07.12 21:10:39.385	TestСTimer (EURUSD.m,M5)	Таймер выключен
Archivos adjuntos:
Timer.mqh  3 kb
 
Nikolai Semko:

La solución era mucho más sencilla de lo que pensaba.
...


Quería escribir sobre el nivel de codificación de la comunidad en general, pero vamos a omitirlo para evitar problemas...
En mi opinión, una buena manera de resolver el problema es implementar una clase singleton o estática, que implemente el control del temporizador y proporcione la capacidad de "suscribirse" a un evento del temporizador,
La "suscripción" se implementa pasando un puntero a una función que debe ser llamada a determinados intervalos.

 

Los resultados de las operaciones son diferentes a los de la prueba en todos los ticks. ¿Me puede decir dónde escarbar - las cotizaciones están sobredimensionadas o qué?

La prueba de las garrapatas siempre da el mismo resultado. Comercio real - nos da operaciones adicionales en el mismo período.

El Asesor Experto no se ha apagado durante 2 semanas. La prueba también ha estado funcionando durante 2 semanas. Lo he hecho 50 veces.

 
Anton Ohmat:

Los resultados de las operaciones son diferentes a los de la prueba en todos los ticks. ¿Me puede decir dónde escarbar - las cotizaciones están sobredimensionadas, o qué?

La prueba de las garrapatas siempre da el mismo resultado. Comercio real - da operaciones adicionales en el mismo período.

El Asesor Experto no se ha detenido durante 2 semanas. La prueba también ha estado funcionando durante 2 semanas. Lo he hecho 50 veces y siempre ha sido lo mismo.

¿La prueba se realiza utilizando "todas las garrapatas" o "garrapatas reales"?

 
Para todos los ticks, el parámetro superior
 
Anton Ohmat:
Para todas las garrapatas - parámetro superior

En el modo "Todos los ticks", los ticks son modelados por el probador a partir de las barras de minutos. Aquí hay un artículo sobre los diferentes modos de prueba. https://www.mql5.com/ru/articles/2612

Тестирование торговых стратегий на реальных тиках
Тестирование торговых стратегий на реальных тиках
  • www.mql5.com
В данной статье мы покажем результаты тестирования простой торговой стратегии в 3-х режимах: "OHLC на M1" с использованием только цен Open,High, Low и Close минутных баров; затем детальное моделирование в режиме "Все тики", и самое достоверное тестирование в режиме "Каждый тик на основе реальных тиков" с использованием записанных тиков из...
 
Acabo de ejecutarlo - obtuve el mismo resultado
 
Sergey Dzyublik:


Quería escribir sobre el nivel de codificación de la comunidad en general, pero vamos a omitirlo para evitar problemas...
En mi opinión, una buena manera de resolver el problema es implementar una clase singleton o estática, que implemente el control del temporizador y proporcione la capacidad de "suscribirse" al evento del temporizador,
La "suscripción" se implementa pasando un puntero a una función que debe ser llamada a determinados intervalos.

Debes ser un muy buen programador si dices cosas tan sensatas. Y gracias por la corrección política :)).
Ciertamente tengo una visión de cómo crear un politímero práctico. Su visión ha ampliado aún más mi visión. Gracias.

 
Sergey Dzyublik:

el problema se resuelve mediante la implementación de un singleton

¿Cómo se puede implementar un singleton en MQL5?
 
fxsaber:

Error en FileLoad. Si dos Agentes locales con la bandera FILE_COMMON intentan leer datos a través de FileLoad, uno de los Agentes falla.

Es posibleestablecer banderas apropiadas en FileOpen, pero no en FileLoad. Por lo tanto, permita el acceso al archivo a través de FileLoad si otro FileLoad lo lee.

¿Cómo pueden ayudarle estas banderas? Este es un ejemplohttps://www.mql5.com/ru/forum/1111/page1628#comment_2702870

Dos Asesores Expertos intentan leer datosa través de FileOpen (con la bandera FILE_SHARE_READ ). Resultado:Uno de los Asesores Expertos se bloquea


Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2016.08.03
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы