Ваши вопросы по языку MQL4

malojorsk

Новичок форума
Подскажите как в советнике рассчитать одну машку от другой,
сделал так, но выдает ошибку

Код:
  ma0 = iMA(NULL,0,perMA0a,0,MODE_SMA,PRICE_CLOSE,1);
  ma1 = iMAOnArray(ma0,0,perMA1,0,MODE_SMA,1);
  ma2 = iMAOnArray(ma1,0,perMA2,0,MODE_SMA,1);
 

AlexeyVik

Программист mql4 mql5
Подскажите как в советнике рассчитать одну машку от другой,
сделал так, но выдает ошибку

Код:
  [B]ma0 [/B]= iMA(NULL,0,perMA0a,0,MODE_SMA,PRICE_CLOSE,1);
  [B]ma1 [/B]= iMAOnArray([B]ma0[/B],0,perMA1,0,MODE_SMA,1);
  ma2 = iMAOnArray([B]ma1[/B],0,perMA2,0,MODE_SMA,1);
Чаще читай документацию. iMAOnArray считается от массива, а не от переменной.
 

MrGreen86

Гуру форума
Тоже что-то мне не нравится. Как-то замудрёно сделали проверку. Специально для тебя написал.
Код:
int myStartHour = 13, myStopHour = 3;
/********************Script program start function*******************/
void OnStart()
{
 bool runTime = myRunTime(myStartHour, myStopHour);
}/*******************************************************************/

bool myRunTime(const int startHour, const int stopHour, const int startMinute = 0, const int stopMinute = 0)
{
 datetime t1 = StringToTime(StringConcatenate(startHour, ":", startMinute ));
 datetime t2 = StringToTime(StringConcatenate(stopHour, ":", stopMinute ));
 if(t2 < t1)
  t2 += PeriodSeconds(PERIOD_D1);
 return(TimeCurrent() >= t1 && TimeCurrent() < t2);
}/*******************************************************************/
ваш вариант не корректен. этот вариант перестает работать при переходе через сутки. т.е. например 30го числа такая конструкция вернет время 29го числа а не сегодняшнего.
можно применять такую конструкцию:
StringToTime( StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",startHour, ":", startMinute));
она не дает такого сбоя.
 

AlexeyVik

Программист mql4 mql5
ваш вариант не корректен. этот вариант перестает работать при переходе через сутки. т.е. например 30го числа такая конструкция вернет время 29го числа а не сегодняшнего.
можно применять такую конструкцию:
StringToTime( StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",startHour, ":", startMinute));
она не дает такого сбоя.
Однако, мал-мал ошибка давал.
Этот вариант работает исправно.
Код:
bool myRunTime(const int startHour, const int stopHour, const int startMinute = 0, const int stopMinute = 0)
{
 datetime t1 = StringToTime(StringConcatenate(startHour, ":", startMinute));
 datetime t2 = StringToTime(StringConcatenate(stopHour, ":", stopMinute));
 if(TimeCurrent() < t2)
  t1 -= PeriodSeconds(PERIOD_D1);
 if(t2 < t1)
  t2 += PeriodSeconds(PERIOD_D1);
 return(TimeCurrent() >= t1 && TimeCurrent() < t2);
};/*******************************************************************/
 

MrGreen86

Гуру форума
Однако, мал-мал ошибка давал.
Этот вариант работает исправно.
тоже нет
0 15:00:35.570 2018.02.21 00:00:00 test funk EURUSD,M15: myRunTime: 2018.02.21 01:00 2018.02.21 23:00
0 15:00:35.570 2018.02.21 00:00:00 test funk EURUSD,M15: 2018.02.21 00:00 - 1
0 15:00:35.986 2018.02.21 00:15:00 test funk EURUSD,M15: myRunTime: 2018.02.21 01:00 2018.02.21 23:00
0 15:00:35.986 2018.02.21 00:15:00 test funk EURUSD,M15: 2018.02.21 00:15 - 1

Посмотреть вложение test funk.mq4

вот такой вариант будет работать правильно:
Код:
bool myRunTime(const int startHour, const int stopHour, const int startMinute = 0, const int stopMinute = 0) {
 datetime t1 = StringToTime(StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",startHour, ":", startMinute));
 datetime t2 = StringToTime(StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",stopHour, ":", stopMinute));
 if(t1 > t2) {
   return(TimeCurrent()>=t1 || TimeCurrent() <t2);
   }else{
   return(TimeCurrent()>=t1 && TimeCurrent() <t2);
   }
 return(0);
};
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
тоже нет
0 15:00:35.570 2018.02.21 00:00:00 test funk EURUSD,M15: myRunTime: 2018.02.21 01:00 2018.02.21 23:00
0 15:00:35.570 2018.02.21 00:00:00 test funk EURUSD,M15: 2018.02.21 00:00 - 1
0 15:00:35.986 2018.02.21 00:15:00 test funk EURUSD,M15: myRunTime: 2018.02.21 01:00 2018.02.21 23:00
0 15:00:35.986 2018.02.21 00:15:00 test funk EURUSD,M15: 2018.02.21 00:15 - 1

Посмотреть вложение 298755

вот такой вариант будет работать правильно:
Код:
bool myRunTime(const int startHour, const int stopHour, const int startMinute = 0, const int stopMinute = 0) {
 datetime t1 = StringToTime(StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",startHour, ":", startMinute));
 datetime t2 = StringToTime(StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",stopHour, ":", stopMinute));
 if(t1 > t2) {
   return(TimeCurrent()>=t1 || TimeCurrent() <t2);
   }else{
   return(TimeCurrent()>=t1 && TimeCurrent() <t2);
   }
 return(0);
};
А проверил, или просто теоретически сделал вывод?
2018.04.23 16:20:30.584 2017.01.03 00:00:00 00 EURUSD,M15: 2017.01.03 00:00:00 Работаем
2018.04.23 16:20:30.564 2017.01.02 23:45:00 00 EURUSD,M15: 2017.01.02 23:45:00 Работаем
2018.04.23 16:20:30.564 2017.01.02 23:30:00 00 EURUSD,M15: 2017.01.02 23:30:00 Работаем
2018.04.23 16:20:30.554 2017.01.02 23:15:00 00 EURUSD,M15: 2017.01.02 23:15:00 Работаем
2018.04.23 16:20:30.534 2017.01.02 23:00:00 00 EURUSD,M15: 2017.01.02 23:00:00 Работаем
2018.04.23 16:20:30.534 2017.01.02 22:45:00 00 EURUSD,M15: 2017.01.02 22:45:00 Работаем
2018.04.23 16:20:30.524 2017.01.02 22:30:00 00 EURUSD,M15: 2017.01.02 22:30:00 Работаем
2018.04.23 16:20:30.514 2017.01.02 22:15:00 00 EURUSD,M15: 2017.01.02 22:15:00 Работаем
2018.04.23 16:20:30.514 2017.01.02 22:00:00 00 EURUSD,M15: 2017.01.02 22:00:00 Работаем
2018.04.23 16:20:30.514 2017.01.02 21:45:00 00 EURUSD,M15: 2017.01.02 21:45:00 Работаем
2018.04.23 16:20:30.514 2017.01.02 21:30:00 00 EURUSD,M15: 2017.01.02 21:30:00 Работаем
2018.04.23 16:20:30.514 2017.01.02 21:15:00 00 EURUSD,M15: 2017.01.02 21:15:00 Работаем
2018.04.23 16:20:30.494 2017.01.02 21:00:00 00 EURUSD,M15: 2017.01.02 21:00:00 Работаем
2018.04.23 16:20:30.484 2017.01.02 20:45:00 00 EURUSD,M15: 2017.01.02 20:45:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 20:30:00 00 EURUSD,M15: 2017.01.02 20:30:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 20:15:00 00 EURUSD,M15: 2017.01.02 20:15:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 20:00:00 00 EURUSD,M15: 2017.01.02 20:00:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 19:45:00 00 EURUSD,M15: 2017.01.02 19:45:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 19:30:00 00 EURUSD,M15: 2017.01.02 19:30:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 19:15:00 00 EURUSD,M15: 2017.01.02 19:15:00 Работаем
2018.04.23 16:20:30.464 2017.01.02 19:00:00 00 EURUSD,M15: 2017.01.02 19:00:00 Работаем
2018.04.23 16:20:30.454 2017.01.02 18:45:00 00 EURUSD,M15: 2017.01.02 18:45:00 Работаем
2018.04.23 16:20:30.454 2017.01.02 18:30:00 00 EURUSD,M15: 2017.01.02 18:30:00 Работаем
2018.04.23 16:20:30.454 2017.01.02 18:15:00 00 EURUSD,M15: 2017.01.02 18:15:00 Работаем
2018.04.23 16:20:30.454 2017.01.02 18:00:00 00 EURUSD,M15: 2017.01.02 18:00:00 Работаем
2018.04.23 16:20:30.454 2017.01.02 17:45:00 00 EURUSD,M15: 2017.01.02 17:45:00 Работаем
2018.04.23 16:20:30.434 2017.01.02 17:30:00 00 EURUSD,M15: 2017.01.02 17:30:00 Работаем
2018.04.23 16:20:30.424 2017.01.02 17:15:00 00 EURUSD,M15: 2017.01.02 17:15:00 Работаем
2018.04.23 16:20:30.404 2017.01.02 17:00:00 00 EURUSD,M15: 2017.01.02 17:00:00 Работаем
2018.04.23 16:20:30.394 2017.01.02 16:45:00 00 EURUSD,M15: 2017.01.02 16:45:00 Работаем
2018.04.23 16:20:30.384 2017.01.02 16:30:00 00 EURUSD,M15: 2017.01.02 16:30:00 Работаем
2018.04.23 16:20:30.374 2017.01.02 16:15:00 00 EURUSD,M15: 2017.01.02 16:15:00 Работаем
2018.04.23 16:20:30.374 2017.01.02 16:00:00 00 EURUSD,M15: 2017.01.02 16:00:00 Работаем
2018.04.23 16:20:30.374 2017.01.02 15:45:00 00 EURUSD,M15: 2017.01.02 15:45:00 Работаем
2018.04.23 16:20:30.354 2017.01.02 15:30:00 00 EURUSD,M15: 2017.01.02 15:30:00 Работаем
2018.04.23 16:20:30.344 2017.01.02 15:15:00 00 EURUSD,M15: 2017.01.02 15:15:00 Работаем
2018.04.23 16:20:30.334 2017.01.02 15:00:00 00 EURUSD,M15: 2017.01.02 15:00:00 Работаем
2018.04.23 16:20:30.324 2017.01.02 14:45:00 00 EURUSD,M15: 2017.01.02 14:45:00 Работаем
2018.04.23 16:20:30.324 2017.01.02 14:30:00 00 EURUSD,M15: 2017.01.02 14:30:00 Работаем
2018.04.23 16:20:30.324 2017.01.02 14:15:00 00 EURUSD,M15: 2017.01.02 14:15:00 Работаем
2018.04.23 16:20:30.304 2017.01.02 14:00:00 00 EURUSD,M15: 2017.01.02 14:00:00 Работаем
2018.04.23 16:20:30.304 2017.01.02 13:45:00 00 EURUSD,M15: 2017.01.02 13:45:00 Работаем
2018.04.23 16:20:30.304 2017.01.02 13:30:00 00 EURUSD,M15: 2017.01.02 13:30:00 Работаем
2018.04.23 16:20:30.304 2017.01.02 13:15:00 00 EURUSD,M15: 2017.01.02 13:15:00 Не работаем
2018.04.23 16:20:30.294 2017.01.02 13:00:00 00 EURUSD,M15: 2017.01.02 13:00:00 Не работаем
2018.04.23 16:20:30.294 2017.01.02 12:45:00 00 EURUSD,M15: 2017.01.02 12:45:00 Не работаем
2018.04.23 16:20:30.274 2017.01.02 12:30:00 00 EURUSD,M15: 2017.01.02 12:30:00 Не работаем
2018.04.23 16:20:30.264 2017.01.02 12:15:00 00 EURUSD,M15: 2017.01.02 12:15:00 Не работаем
2018.04.23 16:20:30.254 2017.01.02 12:00:00 00 EURUSD,M15: 2017.01.02 12:00:00 Не работаем
2018.04.23 16:20:30.244 2017.01.02 11:45:00 00 EURUSD,M15: 2017.01.02 11:45:00 Не работаем
2018.04.23 16:20:30.234 2017.01.02 11:30:00 00 EURUSD,M15: 2017.01.02 11:30:00 Не работаем
2018.04.23 16:20:30.214 2017.01.02 11:15:00 00 EURUSD,M15: 2017.01.02 11:15:00 Не работаем
2018.04.23 16:20:30.204 2017.01.02 11:00:00 00 EURUSD,M15: 2017.01.02 11:00:00 Не работаем
2018.04.23 16:20:30.204 2017.01.02 10:45:00 00 EURUSD,M15: 2017.01.02 10:45:00 Не работаем
2018.04.23 16:20:30.194 2017.01.02 10:30:00 00 EURUSD,M15: 2017.01.02 10:30:00 Не работаем
2018.04.23 16:20:30.184 2017.01.02 10:15:00 00 EURUSD,M15: 2017.01.02 10:15:00 Не работаем
2018.04.23 16:20:30.184 2017.01.02 10:00:00 00 EURUSD,M15: 2017.01.02 10:00:00 Не работаем
2018.04.23 16:20:30.184 2017.01.02 09:45:00 00 EURUSD,M15: 2017.01.02 09:45:00 Не работаем
2018.04.23 16:20:30.174 2017.01.02 09:30:00 00 EURUSD,M15: 2017.01.02 09:30:00 Не работаем
2018.04.23 16:20:30.174 2017.01.02 09:15:00 00 EURUSD,M15: 2017.01.02 09:15:00 Не работаем
2018.04.23 16:20:30.174 2017.01.02 09:00:00 00 EURUSD,M15: 2017.01.02 09:00:00 Не работаем
2018.04.23 16:20:30.174 2017.01.02 08:45:00 00 EURUSD,M15: 2017.01.02 08:45:00 Не работаем
2018.04.23 16:20:30.174 2017.01.02 08:30:00 00 EURUSD,M15: 2017.01.02 08:30:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 08:15:00 00 EURUSD,M15: 2017.01.02 08:15:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 08:00:00 00 EURUSD,M15: 2017.01.02 08:00:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 07:45:00 00 EURUSD,M15: 2017.01.02 07:45:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 07:30:00 00 EURUSD,M15: 2017.01.02 07:30:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 07:15:00 00 EURUSD,M15: 2017.01.02 07:15:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 07:00:00 00 EURUSD,M15: 2017.01.02 07:00:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 06:45:00 00 EURUSD,M15: 2017.01.02 06:45:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 06:30:00 00 EURUSD,M15: 2017.01.02 06:30:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 06:15:00 00 EURUSD,M15: 2017.01.02 06:15:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 06:00:00 00 EURUSD,M15: 2017.01.02 06:00:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 05:45:00 00 EURUSD,M15: 2017.01.02 05:45:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 05:30:00 00 EURUSD,M15: 2017.01.02 05:30:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 05:15:00 00 EURUSD,M15: 2017.01.02 05:15:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 05:00:00 00 EURUSD,M15: 2017.01.02 05:00:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 04:45:00 00 EURUSD,M15: 2017.01.02 04:45:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 04:30:00 00 EURUSD,M15: 2017.01.02 04:30:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 04:15:00 00 EURUSD,M15: 2017.01.02 04:15:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 04:00:00 00 EURUSD,M15: 2017.01.02 04:00:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 03:45:00 00 EURUSD,M15: 2017.01.02 03:45:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 03:30:00 00 EURUSD,M15: 2017.01.02 03:30:00 Не работаем
2018.04.23 16:20:30.164 2017.01.02 03:15:00 00 EURUSD,M15: 2017.01.02 03:15:00 Не работаем
2018.04.23 16:20:30.154 2017.01.02 03:00:00 00 EURUSD,M15: 2017.01.02 03:00:00 Работаем
2018.04.23 16:20:30.154 2017.01.02 02:45:00 00 EURUSD,M15: 2017.01.02 02:45:00 Работаем
2018.04.23 16:20:30.154 2017.01.02 02:30:00 00 EURUSD,M15: 2017.01.02 02:30:00 Работаем
2018.04.23 16:20:30.154 2017.01.02 02:15:00 00 EURUSD,M15: 2017.01.02 02:15:00 Работаем
2018.04.23 16:20:30.154 2017.01.02 02:00:00 00 EURUSD,M15: 2017.01.02 02:00:00 Работаем
2018.04.23 16:20:30.154 2017.01.02 01:45:00 00 EURUSD,M15: 2017.01.02 01:45:00 Работаем
2018.04.23 16:20:30.154 2017.01.02 01:30:00 00 EURUSD,M15: 2017.01.02 01:30:00 Работаем
2018.04.23 16:20:30.144 2017.01.02 01:15:00 00 EURUSD,M15: 2017.01.02 01:15:00 Работаем
2018.04.23 16:20:30.144 2017.01.02 01:00:00 00 EURUSD,M15: 2017.01.02 01:00:00 Работаем
2018.04.23 16:20:30.144 2017.01.02 00:45:00 00 EURUSD,M15: 2017.01.02 00:45:00 Работаем
2018.04.23 16:20:30.144 2017.01.02 00:30:00 00 EURUSD,M15: 2017.01.02 00:30:00 Работаем
2018.04.23 16:20:30.144 2017.01.02 00:15:00 00 EURUSD,M15: 2017.01.02 00:15:00 Работаем
2018.04.23 16:20:24.164 2017.01.02 00:00:00 00 EURUSD,M15: 2017.01.02 00:00:00 Работаем
 

Вложения

  • 00.mq4
    4,3 КБ · Просмотры: 16

MrGreen86

Гуру форума
А проверил, или просто теоретически сделал вывод?
с одного взгляда на ваш код понятно что он работать не будет.
но я даже проверил и привел выдержку из журнала, также прикрепил когд который и писал это в журнал. все это в прошлом сообщений.

допустим время старта 1 час, время окончания 23 часа.
t1 и t2 вы устанавливаете текущим днем по этому времени. Сейчас опустим тот момент который я вам обьяснил выше что такая конструкция дает сбой при переходе через сути, и применять ее НЕЛЬЗЯ. Допустим она отработалась верно.
далее у вас проверка
if(TimeCurrent() < t2)
t1 -= PeriodSeconds(PERIOD_D1);
т.е. если текущее время меньше чем t2 то от t1 отнимаем сутки.
таким образом мы получаем диапазон от 1 часа вчерашнего дня до 23часов сегодняшнего.
и что дальше? а дальше ошибка потому как с 0 часов до 0:59 эта функция должна ответить false, а отвечает true.
 
Последнее редактирование:

Flank

Новичок форума
Господа профессионалы помогите разобраться почему не выводится цена в коментарий на экран. В общем запись значения цены в переменную происходит только при условии, когда ордер только один, то есть робот её не переинициализирует, когда ордера будет уже два и более, потом я к цене добавляю некое число или отнимаю для получения отступа, это не важно и записываю в другую переменную через DoubleToString и эту переменную пытаюсь вывести через coment. В итоге на экране видно только число отступа, а не сумма цены и отступа. Но самое мне не понятное, что советник видит и цену и отступ и открывает правильно ордера. Это мне нужно для некой инфо панели. Подскажите, где моя ошибка. Формирование коментов происходит в самом конце, т. е. потеряться значения этих переменных нигде не могли...
 

AlexeyVik

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

допустим время старта 1 час, время окончания 23 часа.
t1 и t2 вы устанавливаете текущим днем по этому времени. Сейчас опустим тот момент который я вам обьяснил выше что такая конструкция дает сбой при переходе через сути, и применять ее НЕЛЬЗЯ. Допустим она отработалась верно.
далее у вас проверка
if(TimeCurrent() < t2)
t1 -= PeriodSeconds(PERIOD_D1);
т.е. если текущее время меньше чем t2 то от t1 отнимаем сутки.
таким образом мы получаем диапазон от 1 часа вчерашнего дня до 23часов сегодняшнего.
и что дальше? а дальше ошибка потому как с 0 часов до 0:59 эта функция должна ответить false, а отвечает true.
Наверное на пенсию пора. Заострил внимание на ситуацию работать ночью, а работу днём не проверил.
это окончательный вариант.
Код:
bool myRunTime(const int startHour, const int stopHour, const int startMinute = 0, const int stopMinute = 0)
{
 datetime t1 = StringToTime(StringConcatenate(startHour, ":", startMinute));
 datetime t2 = StringToTime(StringConcatenate(stopHour, ":", stopMinute));
 if(TimeCurrent() < t2[COLOR=Red] && TimeCurrent() < t1[/COLOR])
  t1 -= PeriodSeconds(PERIOD_D1);
 if(t2 < t1)
  t2 += PeriodSeconds(PERIOD_D1);
 return(TimeCurrent() >= t1 && TimeCurrent() < t2);
};/*******************************************************************/
 

Вложения

  • 00.mq4
    4,5 КБ · Просмотры: 18

vladradon

Программист
Наверное на пенсию пора. Заострил внимание на ситуацию работать ночью, а работу днём не проверил.
это окончательный вариант.
У меня такой вариант:
PHP:
extern int StartHour=3;
 extern int StopHour=2;
bool TimeWork()
  {
   int TimeNow=TimeHour(TimeCurrent());
   if(StartHour<StopHour) return(TimeNow>=StartHour && TimeNow<StopHour);
   if(StartHour>StopHour && ((TimeNow<=23 && TimeNow>=StartHour) ||
      (TimeNow>=0 && StopHour>0 && TimeNow<StopHour))) return(true);
   return(false);
  }
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
У меня такой вариант:
PHP:
extern int StartHour=3; extern int StopHour=2;bool TimeWork()  {   int TimeNow=TimeHour(TimeCurrent());   if(StartHour<StopHour) return(TimeNow>=StartHour && TimeNow<StopHour);   if(StartHour>StopHour && ((TimeNow<=23 && TimeNow>=StartHour) ||      (TimeNow>=0 && StopHour>0 && TimeNow<StopHour) ||      (TimeNow==0 && StopHour==0))) return(true);   return(false);  }
Я уже не использую такие функции mql4 которых нет в mql5, например TimeHour. Ну, как минимум стараюсь не использовать, разве что нет вариантов. Как например работа с индикаторами и OrderSend. Если привыкнуть, то можно обнаружить много полезного в mql5.
 

Pammexpert

Местный житель
Для определения времени торговли нужно использовать универсальный код, который разрешает ввод как минимум нескольких торговых диапазонов:

PHP:
extern string TradeTime  = "08:00-12:05;23:00-02:00";  
datetime dtStart[30], dtEnd[30];
   if ( IsInTradingTime(TradeTime)  )   {
      // your actions
   }
//+=================================================================+
//|   Time trade function                                           |
//+=================================================================+
bool IsInTradingTime(string TRADE_TIME)   {

    int      i, ipc;
    string   s, strCurrentDate;
    // datetime dtStart[30], dtEnd[30];
    bool     bRet;
  
    //======== 
    // First, we eliminate each invalid character from the time string.
    s = "";
  
    for (i=0; i<StringLen(TRADE_TIME); i++)
         if (((StringGetChar(TRADE_TIME,i)  >= '0') && (StringGetChar(TRADE_TIME,i) <= '9')) ||
              (StringSubstr(TRADE_TIME,i,1) == "-") ||
              (StringSubstr(TRADE_TIME,i,1) == ":") ||
              (StringSubstr(TRADE_TIME,i,1) == ";"))
 
           s = s + StringSubstr(TRADE_TIME,i,1);
   
    TRADE_TIME = s;
  
    // The trading time string contains always a pair of times, separated with "-". Multiple time pairs can be entered by
    // separating each pair with ";". Example: "00:00-02:59;22:00-23:59".  First, get the current local date.

    strCurrentDate = TimeToStr(TimeCurrent(), TIME_DATE);
   
    // Parse the string.
    i   = 0;
    ipc = 0;
    while (true)    {
          // Get start time.
          s="";
          while ((StringSubstr(TRADE_TIME,i,1) != "-") && (i<StringLen(TRADE_TIME)))     {
              s = s + StringSubstr(TRADE_TIME,i,1);
              i++;
          }
          // Create the full date/time and add it to the start time list.
          dtStart[ipc] = StrToTime(strCurrentDate + " " + s);
          i++;
  
          // Get end time.
          s = "";
          while ((StringSubstr(TRADE_TIME,i,1) != ";") && (i<StringLen(TRADE_TIME)))      {
              s = s + StringSubstr(TRADE_TIME,i,1);
              i++;
          }
          // Create the full date/time and add it to the end time list.
          dtEnd[ipc] = StrToTime(strCurrentDate + " " + s);       
          i++;
  
          // Next pair 
          ipc++;  
  
          if (i >= StringLen(TRADE_TIME))    break;
    }
 
    // Now, compare the current time against our list and return  // result.
  
    bRet = false;
    for (i=0; i<ipc; i++)    {
         //+-----------------------------------+
         int hc      = TimeHour(TimeCurrent());
         int he      = TimeHour(dtEnd[i]);
         if (dtStart[i] >= dtEnd[i]) {
            if (hc >= he) dtEnd[i]   += 24*60*60; 
            else          dtStart[i] -= 24*60*60; 
         } 
         //+-----------------------------------+      
         if ((TimeCurrent() >= dtStart[i]) && (TimeCurrent() <= dtEnd[i]))  bRet = true;
           
         //Alert("Start = ", TimeToStr(dtStart[i]));
         //Alert("End   = ", TimeToStr(dtEnd[i]));
         //Alert("TimeCurrent = ", TimeToStr(TimeCurrent()));
         //Alert("Result = ", bRet);
         
    }
    //+------------------------------------+  
    return (bRet);
}
 
Последнее редактирование:

vladradon

Программист
Я уже не использую такие функции mql4 которых нет в mql5, например TimeHour. Ну, как минимум стараюсь не использовать, разве что нет вариантов. Как например работа с индикаторами и OrderSend. Если привыкнуть, то можно обнаружить много полезного в mql5.
Так сойдет?:)
PHP:
input int StartHour=3;
 input int StopHour=2;
bool TimeWork()
  {
   MqlDateTime str1;
   TimeCurrent(str1);
   int TimeNow=str1.hour;
   if(StartHour<StopHour) return(TimeNow>=StartHour && TimeNow<StopHour);
   if(StartHour>StopHour && ((TimeNow<=23 && TimeNow>=StartHour) ||
      (TimeNow>=0 && StopHour>0 && TimeNow<StopHour))) return(true);
   return(false);
  }
 

AlexeyVik

Программист mql4 mql5
Для определения времени торговли нужно использовать универсальный код, который разрешает ввод как минимум нескольких торговых диапазонов:
Это всё хорошо, но что получится если для забивания гвоздя использовать такой универсальный инструмент которым можно ещё и траву косить и дрова колоть.
 

AlexeyVik

Программист mql4 mql5
Так сойдет?:)
PHP:
input int StartHour=3; input int StopHour=2;bool TimeWork()  {   MqlDateTime str1;   TimeCurrent(str1);   int TimeNow=str1.hour;   if(StartHour<StopHour) return(TimeNow>=StartHour && TimeNow<StopHour);   if(StartHour>StopHour && ((TimeNow<=23 && TimeNow>=StartHour) ||      (TimeNow>=0 && StopHour>0 && TimeNow<StopHour))) return(true);   return(false);  }
:D Да я и не собирался соревноваться. Но минуты всё-же не учтены.
А в принципе в твоих способностях я никогда не сомневался. *hi*
 

vladradon

Программист
Да я и не собирался соревноваться. Но минуты всё-же не учтены.
А в принципе в твоих способностях я никогда не сомневался.
А я их (минуты) наоборот специально убрал из кода.:D Там же вроде вопрос стоял о торговли по часам без учета минут.
 

Pammexpert

Местный житель
Это всё хорошо, но что получится если для забивания гвоздя использовать такой универсальный инструмент которым можно ещё и траву косить и дрова колоть.[/QUO

Может Вы и правы, но всё в этом мире относительно
 

vladradon

Программист
Да я и не собирался соревноваться. Но минуты всё-же не учтены.
Вот начальный код из моего сова:
PHP:
int Times()
  {
   int SH = StartHour;
   int SM = StartMinute;
   int EH= EndHour;
   int EM= EndMinute;
   int TimeNow=60*TimeHour(TimeCurrent())+TimeMinute(TimeCurrent());
   int TimeStart=60*SH+SM;
   int TimeEnd=60*EH+EM;
   if(TimeStart==TimeEnd || StartHour<0 || StartHour>23 || StartMinute<0 || StartMinute>59 || 
      EndHour<0 || EndHour>23 || EndMinute<0 || EndMinute>59) {TimeFreeze="No time"; return(1);}
   if(TimeStart<TimeEnd)
     {
      TimeFreeze=DoubleToStr(EndHour,0)+" : "+DoubleToStr(EndMinute,0);
      if(TimeNow >= TimeStart && TimeNow < TimeEnd) return (1);
      return (0);
     }
   if(TimeStart>TimeEnd)
     {
      TimeFreeze=DoubleToStr(StartHour,0)+" : "+DoubleToStr(StartMinute,0);
      if(TimeNow >= TimeStart || TimeNow < TimeEnd) return (1);
      return (0);
     }
   return (1);
  }
 

Flank

Новичок форума
Господа профессионалы помогите разобраться почему не выводится цена в коментарий на экран. В общем запись значения цены в переменную происходит только при условии, когда ордер только один, то есть робот её не переинициализирует, когда ордера будет уже два и более, потом я к цене добавляю некое число или отнимаю для получения отступа, это не важно и записываю в другую переменную через DoubleToString и эту переменную пытаюсь вывести через coment. В итоге на экране видно только число отступа, а не сумма цены и отступа. Но самое мне не понятное, что советник видит и цену и отступ и открывает правильно ордера. Это мне нужно для некой инфо панели. Подскажите, где моя ошибка. Формирование коментов происходит в самом конце, т. е. потеряться значения этих переменных нигде не могли...

Получаю данные так:

PHP:
 if(oBuy+oSell+sBuy+sSell == 1) 
    {
     double FirstOrderOpPR = GetPriceLastOpenOrder();
     double FirstOrderLots = GetLotsLastOpenOrder();
     int FirstOrderType = GetTypeLastOpenOrder(); 
...

Потом преобразую в строку:

PHP:
buyLevel=DoubleToString(FirstOrderOpPR+Delta*_Point,_Digits);
sellLevel=DoubleToString(FirstOrderOpPR-Delta*_Point,_Digits);

И в самом конце сова пытаюсь вывести коммент:

PHP:
Comment("Покупаем по: ",buyLevel,"\n", "Продаем по: ",sellLevel,"\n")

В итоге при Delta = скажем 200, вижу только 0,00200, ну или для 4 знака 0,0020
FirstOrderOpPR эта переменная больше нигде не получает другие значения, только когда ордер один.
 
Последнее редактирование:

vladradon

Программист
В итоге при Delta = скажем 200, вижу только 0,00200, ну или для 4 знака 0,0020
FirstOrderOpPR эта переменная больше нигде не получает другие значения, только когда ордер один.
Получается, что коммент выводится всегда и не зависит от полученной последней цены открытия и от количества ордеров. А вот если преобразования в строку и сам коммент перенести в конец первого куска кода после всех расчетов, а еще перед этим куском поставить удаление коммента Comment(""); if(oBuy+oSell+sBuy+sSell == 1)... - должно получиться.
Ну, или сделать проверку и заключить преобразование и коммент в кривые скобки:
PHP:
Comment("");
if(FirstOrderOpPR>0.0)
  {
   buyLevel=DoubleToString(FirstOrderOpPR+Delta*_Point,_Digits);
   sellLevel=DoubleToString(FirstOrderOpPR-Delta*_Point,_Digits);
   Comment("Покупаем по: ",buyLevel,"\n", "Продаем по: ",sellLevel,"\n");
  }
А если там продолжение коммента идет, то так:
PHP:
string OpOr="";
if(FirstOrderOpPR>0.0)
  {
   buyLevel=DoubleToString(FirstOrderOpPR+Delta*_Point,_Digits);
   sellLevel=DoubleToString(FirstOrderOpPR-Delta*_Point,_Digits);
   OpOr="Покупаем по: "+buyLevel+"\n"+ "Продаем по: "+sellLevel+"\n";
  }
Comment(OpOr,'Остальной коммент');// Располагаем в конце кода
 
Последнее редактирование:
Верх