Как прописать расписание торговли робота?

 

Здравствуйте, форумчане! 

Помогите прописать в роботе расписание торговли. Хочу поэкспериментировать, погонять в тестере при задании НЕ торговли в:

1)пт,

2)пн,

3)утром в пн,

4) вечером в пт.

 

Пока додумался до этого: 

   //Buy

   if(DayOfWeek()==0 && DayOfWeek()==6 && DayOfWeek()==5))

Но после этого ни одной сделки не было заключено

 
ivs62:

Здравствуйте, форумчане! 

Помогите прописать в роботе расписание торговли. Хочу поэкспериментировать, погонять в тестере при задании НЕ торговли в:

1)пт,

2)пн,

3)утром в пн,

4) вечером в пт.

 

Пока додумался до этого: 

   //Buy

   if(day_of_week>0 && day_of_week<5)

Выходит ошибка, что это необъявленный идентификатор.

Переменные:

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
extern string оoooooooooooooo = "====== Фильтр времени ======";
extern bool   UseFilterTime   = False; // Торговля в пятницу после и в понедельник до указанных времен
extern bool   UseFilterDate   = False; // Торговля в конце и начале месяца
extern int    EndHourFriday   = 20;    // Время конца  торговли в пятницу       
extern int    StartHourMonday = 5;     // Время начала торговли в понедельник
extern int    EndMonth        = 1;     // Закончить торговлю за X дней до конца месяца включительно
extern int    StartMonth      = 1;     // Начать торги после X дней начала месяца

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+

Использование:

 

if (time()) {
  
  Код, что делаем когда торгуем.
 
  }


Функция:

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//| Функция фильтра по времени                                                                    |>
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
bool time() {
//---
  if ((DayOfWeek()==0 || DayOfWeek()==6) && (UseFilterTime || UseFilterDate)) return(0); // Не торговать в выходные
  if (((Hour()<StartHourMonday && DayOfWeek()==1) ||  (Hour()>=EndHourFriday && DayOfWeek()==5)) && UseFilterTime) return(0);
  if ((Day()<StartMonth+1 || ((Day()<7)&& Month()==1)) && UseFilterDate)  return(0);
  if ((Day()>31-EndMonth || ((Day()>28-EndMonth) && Month()==2) || (Day()>30-EndMonth &&  ((Month()==4) || (Month()==6) || (Month()==9) || (Month()==11)))) && UseFilterDate) return(0);
//---  
  return (1);
}
 
ivs62:

Здравствуйте, форумчане! 

Помогите прописать в роботе расписание торговли. Хочу поэкспериментировать, погонять в тестере при задании НЕ торговли в:

1)пт,

2)пн,

3)утром в пн,

4) вечером в пт.

 

Пока додумался до этого: 

   //Buy

   if(DayOfWeek()==0 && DayOfWeek()==6 && DayOfWeek()==5))

Но после этого ни одной сделки не было заключено

Переменные:

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ 
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
extern bool   ExpertTime = True;        // True-вкл. False-выкл.
extern string TradeDay   = "1,2,3,4,5"; // Дни работы советника 1= ПН, 5 = ПТ. 
extern int    HourStart  = 0;           // Старт в понедельник. 
extern int    HourStops  = 19;          // Стоп в пятницу.
extern int    Ea_Start   = 0;           // Ежедневный cтарт советника.
extern int    Ea_Stop    = 23;          // Ежедневный  cтоп советника.

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+

Использование:

 

if(Tradetime(ExpertTime, Ea_Start, Ea_Stop)==1) {
//----
//... Здесь код.
//----
} 

Функция:

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//| Tradetime(). Работа по времени.                                                                         |>
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ 
int Tradetime(bool exptime, int OpenHour, int  CloseHour) {
// ---
  int day[]; 
  int i=0, np;
  int Trading=0;
  string st, tmp=TradeDay;
  ArrayResize(day, 0);
  while (StringLen(tmp)>0) {
    np=StringFind(tmp, ",");
    if (np<0) {
      st=tmp;
      tmp="";
    } 
    else {
      st=StringSubstr(tmp, 0, np);
      tmp=StringSubstr(tmp, np+1);
    }
    i++;
    ArrayResize(day, i);
    day[i-1]=StrToInteger(st);
  }
  int TradingTime=0;
  for (int f=0; f<7; f++) {
    if (DayOfWeek()==day[f])Trading=1;
  }
  if (OpenHour>CloseHour) {
    if (Hour()<=CloseHour || Hour()>=OpenHour)TradingTime=1;
  }
  if (OpenHour<CloseHour) {
    if (Hour()>=OpenHour && Hour()<=CloseHour)TradingTime=1;
  }
  if (OpenHour==CloseHour) {
    if (Hour()==OpenHour)TradingTime=1;
  }
  if (DayOfWeek()==1 && Hour() <= HourStart)TradingTime=0;
  if (DayOfWeek()==5 && Hour() >= HourStops)TradingTime=0; 
  if (Trading!=1)   TradingTime=0;
  if (exptime!=true)TradingTime=1;
// ---
  return (TradingTime); 
}
 
Пожалуйста, вставляйте код в сообщения правильно: Правильно вставляем код на форуме
 
ivs62:

Здравствуйте, форумчане! 

Помогите прописать в роботе расписание торговли. Хочу поэкспериментировать, погонять в тестере при задании НЕ торговли в:

1)пт,

2)пн,

3)утром в пн,

4) вечером в пт.

 

Пока додумался до этого: 

   //Buy

   if(DayOfWeek()==0 && DayOfWeek()==6 && DayOfWeek()==5))

Но после этого ни одной сделки не было заключено

Неправильно пишете логические условия. День не может быть одновременно понедельником и пятницей. Замените && на ||

 

if(DayOfWeek()==0 || DayOfWeek()==6 || DayOfWeek()==5)
 
Если ООП не вызывает приступа паники: Переключатель торговых режимов CTradeState.
 
if(Tradetime(ExpertTime, Ea_Start, Ea_Stop)==1) {
//----
//... Здесь код.
//----
} 
Я правильно понимаю, что данный код лучше вставлять в блоке открытия ордеров ?
 
/// написано по памяти - лень открывать редактор :-)

int tradingHour[7][24]; /// 7 дней по 24 часа - в OnInit поставить 1 когда торговля разрешена

int TradeAllowedByTime(datetime now=0)
{
  int hour,day;
  if (now == 0) now=TimeCurrent();
  day=TimeDayOfWeek(now);
  hour=TimeHour(now);
  return tradingHour[day][hour];
}
 

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

// время задается, как строка
extern string    StartTimeOpen   = "02:00";
extern string    StopTimeOpen    = "23:00";
    

    // функция проверяет вхождение серверного времени в заданный диапазон
    // если есть вхождение есть, возвращает true, иначе false 
    bool CheskForWorkTime(string startT, string stopT)
    {
        if (TimeCurrent() > StringToTime(startT) && TimeCurrent() < StrToTime(stopT))
            return(true);
        return (false);
    }

    bool CheskForWorkTime(datetime startT, datetime stopT)
    {
        if (TimeCurrent() > startT && TimeCurrent() < stopT)
            return(true);
        return (false);
    }
 

Друзья кто подскажет каким образом вставить в этот код (МТ5) время работы робота со вторника по четверг включительно, во все часы кроме с 15 до 16 и 19 до 20? Буду очень благодарен. 

//--- Set filter parameters
filter0.GoodHourOfDay(Signal_ITF_GoodHourOfDay);
filter0.BadHoursOfDay(Signal_ITF_BadHoursOfDay);
filter0.GoodDayOfWeek(Signal_ITF_GoodDayOfWeek);
filter0.BadDaysOfWeek(Signal_ITF_BadDaysOfWeek);
filter0.Weight(Signal_ITF_Weight);

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
Причина обращения: