Помогите новичку - Функции дня и времени

 

Привет,

Я здесь новичок, поэтому мне нужна помощь.

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

Я хочу, чтобы он работал следующим образом:

extern int StartDay="sunday"

extern int StartTime="23:00"

extern int StopDay="monday"

extern int StopTime="15:00"

Если день="воскресенье" и рынок открыт (только одна сделка может быть открыта между 23:00 воскресенья и 15:00 понедельника, никаких новых сделок, если наша сделка закрыта из-за TP или SL)

{

Начать торговлю (некоторый код, который у меня уже есть)

}

Как я могу сделать это на MQL?

 

проверить Time[0]

с помощью этих функций в справке по функциям Дата и время

 
// SEE IF THIS WORK FOR YOU..... (I'VE NOT TESTED IT....)



int start()
{
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )
      go_trading();

}
 
abstract_mind:
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )

Я не уверен, что это правильно. Значение "sunday_cond" истинно каждый день недели между 11 вечера и полуночью. Поэтому, поскольку код выполняет либо sunday_cond , либо monday_cond, он потенциально будет торговать после 11 вечера каждый день. Кроме того, "monday_cond" выполняется по воскресеньям до 15:00. Это маловероятно, но в некоторых часовых поясах это также может попасть в торговые часы. Что еще более важно, Hour() <= 15 верно до 15:59, а не до 15:00.


Но принцип, очевидно, верен с точки зрения того, что должен делать EagleEye: проверять время, а также день недели с помощью DayOfWeek() или TimeDayOfWeek().

 
jjc:

Я не уверен, что это правильно. Параметр "sunday_cond" верен каждый день недели между 11 вечера и полуночью. Поэтому, поскольку код выполняет либо sunday_cond , либо monday_cond, он потенциально будет торговать после 11 вечера каждый день. Кроме того, "monday_cond" выполняется по воскресеньям до 15:00. Это маловероятно, но в некоторых часовых поясах это также может попасть в торговые часы. Что еще более важно, Hour() <= 15 верно до 15:59, а не до 15:00.


Но принцип, очевидно, верен с точки зрения того, что должен делать EagleEye: проверять время, а также день недели с помощью DayOfWeek() или TimeDayOfWeek().



Вы правы. Это должно сработать:

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
go_trading();
 

Спасибо, ребята,


Я попробую это и дам вам знать, если это сработает.

 

only one trade can be open between sunday 23:00 and monday 15:00

Приведенный выше код должен торговать с 23:00 воскресенья до 15:59 понедельника (Hour()<=15), а не до 15:00 (Hour()<15).

Также вам понадобится код для открытия только одной сделки в течение разрешенного периода.

 
Какого типа должны быть sunday_cond и monday_cond? int?
 

Я не уверен, что понимаю, что вы имеете в виду в этой части WHRoeder: Понедельник 15:59 (Hour()<=15), а не 15:00 (Hour()<15)?

Да, вы правы, мне тоже нужен этот код. Надеюсь, кто-нибудь сможет мне его предоставить.

 
EagleEye:

Да, вы правы, мне тоже нужен этот код. Надеюсь, кто-нибудь сможет мне его предоставить.

Это немного необычная проблема, потому что вы не хотите заключать новую сделку, если вы уже открыли одну во время текущего торгового окна, даже если сделка уже закрыта. Большинство обсуждений на этом форуме касаются только проверки того, что в данный момент не открыта сделка (а это тема, которая часто поднимается).


По сути, у вас есть три варианта проверки закрытых сделок:


  1. При открытии новой сделки сохранять текущее время в переменной. При рассмотрении возможности размещения новой сделки проверьте, что сохраненное время последней сделки не попадает в текущее торговое окно.
  2. Как описано выше, но храните время последней сделки в глобальных переменных MT4.
  3. Просканировать список сделок MT4, ища закрытые сделки, которые были открыты во время текущего торгового окна.


Эти опции расположены примерно в порядке сложности (а также в обратном порядке производительности, т.е. 3 - самая медленная, хотя разница в скорости между ними вряд ли вызовет проблемы в реальной жизни).


Однако варианты также расположены в порядке возрастания устойчивости:


  1. Если время последней сделки хранится в переменной (в памяти), то значение теряется при перезапуске MT4 или при повторной загрузке советника по любой другой причине. Другими словами, если советник будет перезагружен, то он потенциально будет торговать более одного раза в течение одного и того же торгового окна.
  2. Если время хранится в глобальной переменной MT4, то его запись должна пережить перезагрузку советника. Однако если в спешке перенести торговлю на новый компьютер, то запись о времени последней сделки будет потеряна (если нет резервной копии файла gvariables.dat в MT4).
  3. Сканирование списка сделок MT4 - единственный вариант, который является достаточно устойчивым с точки зрения восстановления после аварии: вы можете войти в брокерский счет с копии MT4 на другом компьютере, запустить советника, и он гарантированно не будет совершать некорректных дополнительных сделок.


 

// Approach_1

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
if(OrdersTotal()==0)
go_trading();



// Подход_2

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
{
if(number_of_longs()==0) // Count the longs from both "trade context" and history for the period in qestion. There is code for counting open longs/shorts in the forum
go_trading_longs();
if(number_of_shorts()==0)
go_trading_shorts();

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