Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 492

 
Евгений:
Подскажите, в выходные как то можно проверить работоспособность скриптов открытия позиций?
Нет. На выходных в тестере стратегий можно проверять на открытие позиций только экспертов.
 
Karputov Vladimir:
Только индикатор обрабатывает в OnCalculate() все тики. Без пропусков.
Э нет. И он пропускает. Но меньше чем другие. Но пропускает
 
Victor Nikolaev:
Э нет. И он пропускает. Но меньше чем другие. Но пропускает
Индикатор может пропустить тик, только если индикатор при каждом входе в OnCalculate() использует ресурсоёмкие вычисления.
 
kashi_ann:

Это хорошо, спасибо.

Еще вопрос:

OrderSelect

Выбирает ордер для дальнейшей работы с ним. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

bool  OrderSelect( 
   ulong   ticket      // тикет ордера 
   );

Параметры

ticket

[in]  Тикет ордера. 

 Как этот тикет присваивается? Где его взять? Или как установить?

В справке же написано

OrderGetTicket

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

ulong  OrderGetTicket( 
   int  index      // номер в списке ордеров 
   );
 

Всем привет!

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

Вопрос: Почему? 

int OnInit()

  {

    EventSetTimer(1);

    MqlDateTime date;

    TimeLocal(date); 

    offtimeCreate(date); // Рисуем на графике заполненный прямоугольник (не торговая зона) с 21:00 до 23:59 в день указанный в переменной date

    return(INIT_SUCCEEDED); 

  } 

 ...

void onTimer()

  {

    MqlDateTime date;

    TimeLocal(date);

    if (date.hour==9 && date.min==0 && date.sec==0)  offtimeCreate(date); // Каждое утро, в 9:00, рисуем новую "не торговую зону" для дня указанного в переменной date

  } 

...
 
INGFX:

Всем привет!

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

Вопрос: Почему? 

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

Ошибки, баги, вопросы

Karputov Vladimir, 2016.01.09 20:51

С чего Вы взяли, что в таймере переменной date передаётся значение ранее определённое в OnInit()?

Нужно смотреть в вашу функцию, которая рисует зону. 

Дополнено:

Правильно будет OnTimer, а не onTimer 

 

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

Ошибки, баги, вопросы

INGFX, 2016.01.09 21:20

Потому что А) Вижу визуально, "временная зона" рисуется не сегодня с 21:00 до 23:59, а с вчерашнего 21:00 до сегодняшнего 23:59 

Б) Если открыть свойства графического объекта (закрашенный прямоугольник - "временная зона") , то видно, что первая переменная не изменилась, т.е. она имеет значение как вчерашняя 21:00

...
bool offtimeCreate(MqlDateTime &stm)
  {
    color clr=Black;
    datetime tm1,tm2;
    tm1 = StringToTime((string)stm.year+"."+(string)stm.mon+"."+(string)stm.day+" 21:00");
    tm2 = StringToTime((string)stm.year+"."+(string)stm.mon+"."+(string)stm.day+" 23:59");

    RectangleCreate(0,"offtime",0,tm1,0,tm2,200,clr); // chrart_id,object_name,sub_window,time1,price1,time2,price2,color

    return(true);
  }
...

 
Karputov Vladimir:
Правильно будет OnTimer, а не onTimer 
Ну да OnTimer, ошибся когда сюда переписывал ... в самом коде все правильно 
 
INGFX:
Ну да OnTimer, ошибся когда сюда переписывал ... в самом коде все правильно 

Вы бы проверили свой код. Надоело сшивать Ваши кусочки - поэтому Вот, проверочный код. В OnTimer подставьте своё локальное время и сравните принты при инициализации и в таймере:

//+------------------------------------------------------------------+
//|                                                       TestEA.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   MqlDateTime date;
   TimeLocal(date);
   offtimeCreate(date); // Рисуем на графике заполненный прямоугольник (не торговая зона) с 21:00 до 23:59 в день указанный в переменной date
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   MqlDateTime date;
   TimeLocal(date);
   if(date.hour==22 && date.min==33 && date.sec==00)
      offtimeCreate(date); // Каждое утро, в 9:00, рисуем новую "не торговую зону" для дня указанного в переменной date
  }
//+------------------------------------------------------------------+
/*void offtimeCreate(MqlDateTime &struct_date)
  {
   string text="";
   text=IntegerToString(struct_date.hour)+":"+
        IntegerToString(struct_date.min)+":"+
        IntegerToString(struct_date.sec);
   Comment(text);
//ChartRedraw();
  }*/
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool offtimeCreate(MqlDateTime &stm)
  {
   color clr=Black;
   datetime tm1,tm2;
   tm1 = StringToTime((string)stm.year+"."+(string)stm.mon+"."+(string)stm.day+" 21:00");
   tm2 = StringToTime((string)stm.year+"."+(string)stm.mon+"."+(string)stm.day+" 23:59");

   Print(tm1+"      "+tm2);
//RectangleCreate(0,"offtime",0,tm1,0,tm2,200,clr); // chrart_id,object_name,sub_window,time1,price1,time2,price2,color

   return(true);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Вы бы проверили свой код. 

Владимир, спасибо за ваше терпение и помощь!
Действительно ошибся в коде ...
Впредь буду внимательнее.