Ошибки, баги, вопросы - страница 2225

 
Andrey Khatimlianskii:

По-хорошему, вся работа с таймером должна быть обернута в класс, и все части программы, где нужен таймер, должны им пользоваться через этот класс.

Иначе за ним не уследить.

причем в этом классе можно задефайнить OnTimer, EventSetMillisecondTimer, EventSetTimer, EventKillTimer, как это делал Фабер в библе Init_Sync.mqh. И тогда полный контроль. Хорошая идея. Спасибо.

 
Nikolai Semko:

причем в этом классе можно задефайнить OnTimer, EventSetMillisecondTimer, EventSetTimer, EventKillTimer, как это делал Фабер в библе Init_Sync.mqh. И тогда полный контроль. Хорошая идея. Спасибо.

Ждем в КБ ;)

 
Andrey Khatimlianskii:

Разумно было бы сделать это на уровне платформы, а нам дать возможность запускать несколько таймеров под разные нужды )

ну да...
Так было бы гораздо проще. Но легкие пути для пацанов, а мужы легких путей не ищут  :))

 
Andrey Khatimlianskii:

Ждем в КБ ;)

Надеюсь, дойдут когда-нибудь руки...

 
Dmitri Custurov:

Я пробовал и по фэн шую, и так - результат тот же. Дело в том, что все работает в 99% случаев, а мне нужно 100%. На данный момент мне главное логику правильно собрать, красоту буду потом наводить.

Забыл добавить только то, что вышеупомянутая ошибка появляется в тестере. Когда кидаю на график, такого не наблюдаю, или нужно просто дождаться необходимого экстремума, где эта ошибка опять себя проявит.

вещественные нужно сравнивать правильно

/*!
   \brief   Сравнение вещественных double
   \return true в случае равно, иначе false
*/
bool CompDouble(const double a_one,const double a_two) {
   if(fabs(a_one - a_two) <= DBL_EPSILON * fmax(fabs(a_one), fabs(a_two)))
      return true;    // числа равны с относительной точностью DBL_EPSILON
//---
   return false;
}
/*!
   \brief   Сравнение вещественных float
   \return true в случае равно, иначе false
*/
bool CompFloat(const float a_one,const float a_two) {
   if(fabs(a_one - a_two) <= FLT_EPSILON * fmax(fabs(a_one), fabs(a_two)))
      return true;    // числа равны с относительной точностью FLT_EPSILON
//---
   return false;
}
 
Спасибо за совет. Работает. Я уже на OrderSelect грешил.
 
Andrey Khatimlianskii:

Ждем в КБ ;)

Решение оказалось гораздо проще, чем я думал. 

Пример индикатора, в котором можно узнать статус Таймера. Достаточно только добавить одну строчку  #include  <Timer.mqh> и OnTimer() под контролем.

#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("Таймер выключен");
  }

А вот сам класс:

//+------------------------------------------------------------------+
//|                                                        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
Результат:
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)	Таймер выключен
Файлы:
Timer.mqh  3 kb
 
Nikolai Semko:

Решение оказалось гораздо проще, чем я думал. 
...


Хотел написать о уровне кодинга в сообществе в целом, однако опустим во избежания неприятностей...
На мой взгляд, по хорошему, задача решается через реализацию синглтона или статического класса, который реализует управление таймером и предоставляет возможность "подписки" на событие таймера,
"подписка" реализуется через передачу указателя на функцию, которая с определенной периодичностью должна вызываться.

 

Результаты торговли отличаются от теста по всем тикам. Подскажите куда копать - котировки перерисовываются, или как?

Тест по всем тикам - всегда выдает один и тот же результат. Реальная торговля - дает лишние сделки на том самом периоде.

Советник не выключался 2 недели. Тест так-же 2 недели. Раз 50 прогнал - всегда одинаково

 
Anton Ohmat:

Результаты торговли отличаются от теста по всем тикам. Подскажите куда копать - котировки перерисовываются, или как?

Тест по всем тикам - всегда выдает один и тот же результат. Реальная торговля - дает лишние сделки на том самом периоде.

Советник не выключался 2 недели. Тест так-же 2 недели. Раз 50 прогнал - всегда одинаково

Тест по "всем тикам" или по "реальным тикам"?