МТ5. Последний билд. Проблемы. - страница 4

 

Тест OnTimer:

//+------------------------------------------------------------------+
//|                                                  TestOnTimer.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//--- input parameters
input uchar    InpSeconds=6;  // Seconds
//---
datetime       first_time  = 0;  // время, когда был первый заход в OnTimer()
long           count_time  = 0;  // количество заходов
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   if(!EventSetTimer(InpSeconds))
     {
      Print("Error create timer!");
      return(INIT_FAILED);
     }
//---
   first_time=0;  // время, когда был первый заход в OnTimer()
   count_time=0;  // количество заходов
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   long estimated_count_time=long(TimeLocal()-first_time); //  расчётное количество заходов
   estimated_count_time/=InpSeconds;
   estimated_count_time++;

   Comment("Реальное кол-во заходов: ",count_time,"\n",
           "Расчётное количество заходов: ",estimated_count_time);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(first_time==0)
      first_time=TimeLocal();

   count_time++;
  }
//+------------------------------------------------------------------+

Со всем остальным - также: пишем, проверяем, потом говорим. Если не проверите и предоставите проверку - это будет расценено как поток лжи.

Файлы:
 
Vladimir Karputov:

Тест OnTimer:

Со всем остальным - также: пишем, проверяем, потом говорим. Если не проверите и предоставите проверку - это будет расценено как поток лжи.

Да что Вы сразу угрожать? Я что, ребенок чтоли какой то? ... ))))

Установил на график и что дальше?

 
Renat Akhtyamov:

Да что Вы сразу угрожать? ))))

Установил на график и что дальше?


Вообще-то это Ваши слова:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

МТ5. Последний билд. Проблемы.

Renat Akhtyamov, 2017.06.06 11:20

Впервые - сначала написал эксперта на МТ5, и всё-таки пришлось произвести возврат на МТ4.

Что не понравилось?

1. Глючит OnTimer() - есть пропуски тиков и их прилично. Поставил тик равный 10 секундам. Фактически иногда период между тиками доходил до 2-х минут.

...


Поэтому теперь Ваш ход - оправдывайтесь.

 
Vladimir Karputov:


Вообще-то это Ваши слова:


Поэтому теперь Ваш ход - оправдывайтесь.

А что мне оправдываться?

Что я должен показать и что я должен увидеть после запуска Вашего кода?

Вот снял видео. Два таймера. На черном фоне МТ5, на белом МТ4. Период таймера - 10 секунд в обоих случаях.. Коды экспертов идентичны.

 
Renat Akhtyamov:

А что мне оправдываться?

Что я должен показать и что я должен увидеть после запуска Вашего кода?

Вот снял видео. Два таймера. На черном фоне МТ5, на белом МТ4. Период таймера - 10 секунд в обоих случаях.. Коды экспертов идентичны.


Задаю третий раз вопрос - на этот раз в последний раз: где код вывода времени на экран?

И на всякий случай (предполагаю с достоверностью 99%, что Ваша ошибка именно в этом) отсылаю Вас к первоисточнику: Дата и время. Посмотрите в чём разница между

TimeCurrent

Возвращает последнее известное время сервера (время прихода последней котировки) в формате datetime


 и

TimeLocal

Возвращает локальное компьютерное время в формате datetime

 
Vladimir Karputov:


Задаю третий раз вопрос - на этот раз в последний раз: где код вывода времени на экран?

И на всякий случай (предполагаю с достоверностью 99%, что Ваша ошибка именно в этом) отсылаю Вас к первоисточнику: Дата и время. Посмотрите в чём разница между

TimeCurrent

Возвращает последнее известное время сервера (время прихода последней котировки) в формате datetime


 и

TimeLocal

Возвращает локальное компьютерное время в формате datetime

//МТ4

Prn_txt("TM_txt", xp+35, yp-5, 0, "Tahoma", 30, clrBlack, TimeToString(TimeLocal(),TIME_SECONDS),0);

//+------------------------------------------------------------------+
int Prn_txt(string Name, int X, int Y, int Corner, string Font, int Font_Size, color CLR, string TXT,int Window)
   {
      ObjectDelete(0,Name);
      ObjectCreate(0,Name,OBJ_LABEL,Window,0,0,0,0);
      ObjectSetInteger(0,Name,OBJPROP_XDISTANCE,X);
      ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,Y);
      ObjectSetInteger(0,Name,OBJPROP_CORNER,Corner);
      ObjectSetString(0,Name,OBJPROP_TEXT,TXT);
      ObjectSetString(0,Name,OBJPROP_FONT,Font);
      ObjectSetInteger(0,Name,OBJPROP_FONTSIZE,Font_Size);
      ObjectSetInteger(0,Name,OBJPROP_COLOR,CLR);
      return(0);
   }

//МТ5

Prn_txt("TM_txt", xp+35, yp-5, 0, "Tahoma", 30, clrBlack, TimeToString(TimeLocal(),TIME_SECONDS),0);

//+------------------------------------------------------------------+
int Prn_txt(string Name, int X, int Y, int Corner, string Font, int Font_Size, color CLR, string TXT,int Window)
   {
      ObjectDelete(0,Name);
      ObjectCreate(0,Name,OBJ_LABEL,Window,0,0,0,0);
      ObjectSetInteger(0,Name,OBJPROP_XDISTANCE,X);
      ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,Y);
      ObjectSetInteger(0,Name,OBJPROP_CORNER,Corner);
      ObjectSetString(0,Name,OBJPROP_TEXT,TXT);
      ObjectSetString(0,Name,OBJPROP_FONT,Font);
      ObjectSetInteger(0,Name,OBJPROP_FONTSIZE,Font_Size);
      ObjectSetInteger(0,Name,OBJPROP_COLOR,CLR);
      return(0);
   }

ИДЕНТИЧНЫ!

выключить Вашего эксперта, ато чо та Вы напугали ))) ? :


//..Ответа не дождался. Выключаю. Надо будет - еще раз включу.

 

Неужели так трудно выложить код? Пример:  - код который можно скомпилировать, воспроизвести и даже скачать. 

От Вас только непонятный кусок в котором куча неоправданного расточительства ресурсов, но целостного кода для компиляции и воспроизведения нет. 

Пожалуйста при написании программ, делайте более правильно: 

  • объект следует создавать в OnInit() - не нужно его каждый раз удалять, потом создавать и затем менять его свойства каждый раз при заходе в процедуру
  • при заходе в процедуру можно поступать двумя способами:
    • проверить - есть ли объект с таким именем (ObjectFind) - если объект найден, значит просто меняем его свойство (OBJPROP_TEXT), если не найден, тогда создаём его и меняем его свойство (OBJPROP_TEXT):

//--- изменим текст объекта
   if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
     {
      Print(__FUNCTION__,
            ": не удалось изменить текст! Код ошибки = ",GetLastError());
      return(false);
     }

    • можно не искать объект (в надежде, что никто его не удалил) и сразу менять его свойство (OBJPROP_TEXT)
  • после изменения свойства графического объекта необходимо перерисовать график (ChartRedraw).
Также большие подозрения, что Вы свою процедуру Prn_txt вызываете из OnTick() - что даёт неверные результаты на не быстром рынке (разный интервал между тиками + Вы не обновляете экран после изменения свойств графического объекта).

 
Vladimir Karputov:

Неужели так трудно выложить код? Пример:  - код который можно скомпилировать, воспроизвести и даже скачать. 

От Вас только непонятный кусок в котором куча неоправданного расточительства ресурсов, но целостного кода для компиляции и воспроизведения нет. 

Пожалуйста при написании программ, делайте более правильно: 

  • объект следует создавать в OnInit() - не нужно его каждый раз удалять, потом создавать и затем менять его свойства каждый раз при заходе в процедуру
  • при заходе в процедуру можно поступать двумя способами:
    • проверить - есть ли объект с таким именем (ObjectFind) - если объект найден, значит просто меняем его свойство (OBJPROP_TEXT), если не найден, тогда создаём его и меняем его свойство (OBJPROP_TEXT):

    • можно не искать объект (в надежде, что никто его не удалил) и сразу менять его свойство (OBJPROP_TEXT)
  • после изменения свойства графического объекта необходимо перерисовать график (ChartRedraw).
Также большие подозрения, что Вы свою процедуру Prn_txt вызываете из OnTick() - что даёт неверные результаты на не быстром рынке (разный интервал между тиками + Вы не обновляете экран после изменения свойств графического объекта).

Код своего эксперта выложить не могу. Однако повторно проверил - вызов принта идет из OnTimer() в обоих случаях.

Владимир, всё это правильно. Ресурсы мои и их предостаточно.

Однако факт остается фактом - в МТ4 всё норм при абсолютной идентичности кода.

Чтобы проверить, достаточно создать пустой шаблон эксперта, вставить в OnTimer строку с вызовом принта и внизу, после кода разместить функцию принта, а в OnInit() инициализировать таймер на период в 10 секунд.

Ну не мне же Вас учить, я то в программировании почти что ноль.

 

Вот пример на двух объектах - один отображает локальное время ПК из OnTick(), а второй отображает локальное время ПК из OnTimer():

//+------------------------------------------------------------------+
//|                                        TestOnTickOnTimer.mq5.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameters
input uchar    InpSeconds=10;  // Seconds
//---
string NameOnTick="OnTick";
string NameOnTimer="OnTimer";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   if(!EventSetTimer(InpSeconds))
     {
      Print("Error create timer!");
      return(INIT_FAILED);
     }
//--- creates obj_label
   if(!LabelCreate(0,NameOnTick,0,30,30,CORNER_LEFT_UPPER,NameOnTick,"Arial",
      10,clrBlue,0.0,ANCHOR_LEFT_UPPER))
     {
      Print("Error create obj_label ",NameOnTick);
      return(INIT_FAILED);
     }
   if(!LabelCreate(0,NameOnTimer,0,30,30,CORNER_RIGHT_UPPER,NameOnTimer,"Arial",
      10,clrRed,0.0,ANCHOR_RIGHT_UPPER))
     {
      Print("Error create obj_label ",NameOnTimer);
      return(INIT_FAILED);
     }
//--- redraw the chart and wait for half a second 
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   LabelTextChange(0,NameOnTick,"OnTick: "+TimeToString(TimeLocal(),TIME_SECONDS));
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   LabelTextChange(0,NameOnTimer,"OnTimer: "+TimeToString(TimeLocal(),TIME_SECONDS));
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Create a text label                                              | 
//+------------------------------------------------------------------+ 
bool LabelCreate(const long              chart_ID=0,               // chart's ID 
                 const string            name="Label",             // label name 
                 const int               sub_window=0,             // subwindow index 
                 const int               x=0,                      // X coordinate 
                 const int               y=0,                      // Y coordinate 
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // chart corner for anchoring 
                 const string            text="Label",             // text 
                 const string            font="Arial",             // font 
                 const int               font_size=10,             // font size 
                 const color             clr=clrRed,               // color 
                 const double            angle=0.0,                // text slope 
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // anchor type 
                 const bool              back=false,               // in the background 
                 const bool              selection=false,          // highlight to move 
                 const bool              hidden=true,              // hidden in the object list 
                 const long              z_order=0)                // priority for mouse click 
  {
//--- reset the error value 
   ResetLastError();
//--- create a text label 
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": failed to create text label! Error code = ",GetLastError());
      return(false);
     }
//--- set label coordinates 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- set the chart's corner, relative to which point coordinates are defined 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- set the text 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- set text font 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- set font size 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- set the slope angle of the text 
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- set anchor type 
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- set color 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
////--- display in the foreground (false) or background (true) 
//   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
////--- enable (true) or disable (false) the mode of moving the label by mouse 
//   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
//   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
////--- hide (true) or display (false) graphical object name in the object list 
//   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
////--- set the priority for receiving the event of a mouse click in the chart 
//   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- successful execution 
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Change the label text                                            | 
//+------------------------------------------------------------------+ 
bool LabelTextChange(const long   chart_ID=0,   // chart's ID 
                     const string name="Label", // object name 
                     const string text="Text")  // text 
  {
//--- reset the error value 
   ResetLastError();
//--- change object text 
   if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
     {
      Print(__FUNCTION__,
            ": failed to change the text! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution 
   return(true);
  }
//+------------------------------------------------------------------+


Добавлено: подправил - забыл внести ChartRedraw().

Файлы:
 
Vladimir Karputov:

Да. Комиссия начисляется на сделку закрытия. То есть на круг. Если же просто сделка открытия - то комиссии не будет, а вот когда будет сделка закрытия - тогда комиссия и появится (если по условиям торгового счёта комиссия начисляется).

Ни дня без лжи...

Комиссия начисляется ДВА раза, при открытии позиции и при закрытии...

От конфет я добрей не стану, да и от пива тоже... Не предлагай.те.

Причина обращения: