Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.12 14:56 

А собственно поиск начался с того, что все ниже перечисленные проверки, в воскресенье  (и по золоту в понедельник с 00:00 по 01:00)  разрешили советнику торговать

string symbolF = _Symbol;

ENUM_SYMBOL_TRADE_MODE SyTrMode = ENUM_SYMBOL_TRADE_MODE(SymbolInfoInteger(symbolF, SYMBOL_TRADE_MODE) );

Comment(
   "\n     SymbolInfoInteger(SYMBOL_TRADE_MODE)= ", EnumToString(SyTrMode), "   ", symbolF,
   "\n     TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)= ", TerminalInfoInteger(TERMINAL_TRADE_ALLOWED),
   "\n     MQLInfoInteger(MQL_TRADE_ALLOWED)= ", MQLInfoInteger(MQL_TRADE_ALLOWED),
   "\n     TerminalInfoInteger(TERMINAL_CONNECTED)= ", TerminalInfoInteger(TERMINAL_CONNECTED),
   "\n     AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)= ", AccountInfoInteger(ACCOUNT_TRADE_ALLOWED),
   "\n     AccountInfoInteger(ACCOUNT_TRADE_EXPERT)= ", AccountInfoInteger(ACCOUNT_TRADE_EXPERT)
   );

 

Мне кажется, что для выяснения можно ли советнику сейчас торговать достаточно узнать время Торговой Сессии.

А зачем вообще нужно знать время Котировочной Сессии если советник не может открыть или закрыть ордер в это время?

Вот пример по XAUUSD (золото "Альпы") , котировочная сессия начинается с 00:00, а торговая с 01:00.

 

Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.12 15:00  

В следующие выходные (и по золоту с 00:00 по 01:00) посмотрю возвраты давний ф-ций mql4, может они прояснят ситуацию без обращения к сессиям..

 

   "\n     IsExpertEnabled()= ", IsExpertEnabled(),
   "\n     IsTradeAllowed()= ", IsTradeAllowed(),
   "\n     IsTradeAllowed(symbolF, TimeLocal() )= ", IsTradeAllowed(symbolF, TimeLocal() ),
   "\n     IsTradeAllowed(symbolF, TimeCurrent() )= ", IsTradeAllowed(symbolF, TimeCurrent() ),
   "\n     IsTradeContextBusy()= ", IsTradeContextBusy(),
   "\n     MarketInfo(symbolF, MODE_TRADEALLOWED)= ", MarketInfo(symbolF, MODE_TRADEALLOWED),
Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.12 15:05  

А пока сделал вот такую ф-цию выяснения по сессии - можно торговать или нет.

Функция возвращает ДАТУ (чего нет просто в SymbolInfoSessionTrade) и время начала и окончания сессии. 

 Обращается раз в минуту, для экономии ресурсов. В принципе должна подходить и к тестеру стратегий MONDAY он всегда MONDAY.

void OnTick()
  {
//---
   datetime From, To; 
   
   string symbolF = _Symbol;

   bool Trade_Session = dz_SymbolInfoSessionTrade(symbolF, From, To);
   
   Print("Trade_Session= ", Trade_Session, "   From= ", TimeToString(From, TIME_DATE|TIME_SECONDS), "   To= ", TimeToString(To, TIME_DATE|TIME_SECONDS) );
   
   if(From == 0 || To == 0)
   {
      Sleep(500);
      
      Trade_Session = dz_SymbolInfoSessionTrade(symbolF, From, To);
      
      Print("!!  Repeat Trade_Session= ", Trade_Session, "   From= ", TimeToString(From, TIME_DATE|TIME_SECONDS), "   To= ", TimeToString(To, TIME_DATE|TIME_SECONDS) );
   }
   
  }
//+------------------------------------------------------------------+


bool dz_SymbolInfoSessionTrade(string symbolF, datetime &fromF, datetime &toF)
{
   int session_indexF=0;
   
   datetime vr_fromF, vr_toF;
   
   static datetime IST_iTimeM1, mem_fromF, mem_toF;
   
   static bool mem_resF, firstOk;

   
   if(IST_iTimeM1 != iTime(symbolF, PERIOD_M1, 0) )
   {
      IST_iTimeM1 = iTime(symbolF, PERIOD_M1, 0);
   
      firstOk = false;
      
      ENUM_DAY_OF_WEEK day_of_weekF = ENUM_DAY_OF_WEEK(DayOfWeek() );
      
      //day_of_weekF = 5; // >>>>> >>>>>
      
      while(SymbolInfoSessionTrade(symbolF, day_of_weekF, session_indexF, vr_fromF, vr_toF) && !IsStopped() )
      {
         firstOk = true;
         
         datetime timeDifferenceF = vr_toF - vr_fromF;
         
         fromF = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) + " " + TimeToString(vr_fromF, TIME_SECONDS) );
         
         toF = fromF + timeDifferenceF;
         
         mem_fromF = fromF; 
         mem_toF = toF;
         
         Print(EnumToString(day_of_weekF),"   session= ", session_indexF, "   fromF= ", TimeToString(fromF, TIME_DATE|TIME_SECONDS), "   toF= ", TimeToString(toF, TIME_DATE|TIME_SECONDS) );

         if(TimeCurrent() >= fromF && TimeCurrent() < toF) 
         {
            mem_resF = true;
            break;
         }
         
         if(TimeCurrent() < fromF) 
         {
            mem_resF = false;
            break;
         }
         
         session_indexF++;
      } // while(!IsStopped() )
   } //if(IST_iTimeM1
   
   if(firstOk)
   {
      fromF = mem_fromF; 
      toF = mem_toF;
   }else
   {
      fromF = 0; 
      toF = 0;
      
      mem_resF = false;
   }
   
   return(mem_resF);
}
Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.13 11:31  

Эти ф-ции вне торговой сессии возвращают    false  или  0  для MarkeInfo

IsTradeAllowed(symbolF, TimeCurrent() )

MarketInfo(symbolF, MODE_TRADEALLOWED)

 

Интересно, а какой аналог этих ф-ций есть в MQL5?  Или там только по сессиям можно понять можно торговать или нет. 

Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.18 23:21  

Есть такой символ как BRENT-SEP16

 

Так в этом символе  ф-ция SymbolInfoSessionTrade

возвращает с первого взгляда перепутанные местами "from" и "to"  пример

 session_indexF= 0   fromF=  03:05:00   toF=  00:55:00

и этот момент я учел в новой версии своей ф-ции.

------------------------------------- 

 И еще один интересный момент, как понятно из времени торговой сессии с 00:00  понедельника и до 00:55 можно торговать, и действительно в это время ручками я открыл и удалил ордер без проблем.

А в это время ф-ции     IsTradeAllowed(symbolF, TimeCurrent() )   и    MarketInfo(symbolF, MODE_TRADEALLOWED

возвращают FALSE !!!  Так, что сессии имеют приоритет.

Пример

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! SymbolInfoInteger(SYMBOL_TRADE_MODE)= SYMBOL_TRADE_MODE_FULL   BRENT-SEP16

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! MQLInfoInteger(MQL_TRADE_ALLOWED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! TerminalInfoInteger(TERMINAL_CONNECTED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! AccountInfoInteger(ACCOUNT_TRADE_EXPERT)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! dz_SymbolInfoSessionTrade= true

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! MarketInfo(symbolF, MODE_TRADEALLOWED)= 0.0

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! IsTradeAllowed(symbolF, TimeCurrent() )= false

0 00:17:09.985 0_session05 BRENT-SEP16,H4: session_indexF= 0   fromF= 2016.07.19 03:05:00   toF= 2016.07.19 00:55:00

 

 Как видно моя ф-ция   dz_SymbolInfoSessionTrade  вернула TRUE.

Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.18 23:23  
bool dz_SymbolInfoSessionTrade(string symbolF, bool oneF)
{
   int session_indexF=0;
   
   datetime vr_toF=0, vr_fromF=0, fromF=0, toF=0, TimeCurrentDay=0;
   
   bool resF=false, logOn = true;
   
   ENUM_DAY_OF_WEEK day_of_weekF = ENUM_DAY_OF_WEEK(DayOfWeek() );
   
   static int IST_hour = -1;
   
   
   while(SymbolInfoSessionTrade(symbolF, day_of_weekF, session_indexF, vr_fromF, vr_toF) && !IsStopped() )
   {
      TimeCurrentDay = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) );
   
      fromF = TimeCurrentDay + vr_fromF;
      
      toF = TimeCurrentDay + vr_toF;


      //--------
      if(IST_hour != Hour() || oneF)
      {
         Print("session_indexF= ", session_indexF, "   fromF= ", fromF, "   toF= ", toF);         
      }
      
      
      if(fromF < toF)
      {
         if(TimeCurrent() >= fromF && TimeCurrent() < toF) 
         {
            resF = true;
            //Print("fromF < toF");
            break;
         }         
      }else
      {
         if(TimeCurrent() < toF || TimeCurrent() >= fromF)
         {
            resF = true;
            //Print(" ! toF < fromF");
            break;         
         }
      }

      session_indexF++;
   } // while(!IsStopped() )


   //--------
   if( (IST_hour != Hour() || oneF) && (fromF == 0 || toF == 0) )
   {
      Print("!!! session_indexF= ", session_indexF, "   fromF= ", fromF, "   toF= ", toF);         
   }

   
   IST_hour = Hour();
   
   return(resF);
}
Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.18 23:26  

Как я подозреваю, остался один неучтенный момент - это пятница, время с 00:00 до 00:55,  в это время   dz_SymbolInfoSessionTrade  вернет FALSE,

надо еще подумать.... 

Andrey Khatimlianskii
55795
Andrey Khatimlianskii 2016.07.18 23:36  

Очень полезная тема! Вам тут не одиноко? )

 

Dmytro Zelenskyy:

Есть такой символ как BRENT-SEP16

 

Так в этом символе  ф-ция SymbolInfoSessionTrade

возвращает с первого взгляда перепутанные местами "from" и "to"  пример

 session_indexF= 0   fromF=  03:05:00   toF=  00:55:00

Почему решили, что перепутаны?

Торговля разрешена с 03:05:00 до 23:59:59 и с 00:00:00 до 00:55:00

Andrey Khatimlianskii
55795
Andrey Khatimlianskii 2016.07.18 23:41  
Dmytro Zelenskyy:

Интересно, а какой аналог этих ф-ций есть в MQL5?  Или там только по сессиям можно понять можно торговать или нет. 

Сюда заглядывали?

https://www.mql5.com/ru/docs/runtime/tradepermission 

Документация по MQL5: Программы MQL5 / Разрешение на торговлю
Документация по MQL5: Программы MQL5 / Разрешение на торговлю
  • www.mql5.com
Программы MQL5 / Разрешение на торговлю - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Dmytro Zelenskyy
4085
Dmytro Zelenskyy 2016.07.19 12:50  
Andrey Khatimlianskii:

Очень полезная тема! Вам тут не одиноко? )

 

Почему решили, что перепутаны?

Торговля разрешена с 03:05:00 до 23:59:59 и с 00:00:00 до 00:55:00

Уже не один.. и поэтому не одиноко )))

 

Да, все именно так, я выше написал только с "первого взгляда",  и эту ситуацию надо обрабатывать по другому, что я и сделал.

Но осталась нерешенной Пятница. В пятницу, с  00:00:00 до 00:55:00  ф-ция  запретит торговать хотя реально будет можно, потому что вернется всего одна сессия с временем

с 03:05 до 23:05.

Здесь надо еще учитывать Четверг который заползает на пятницу..... 

Andrey Khatimlianskii
55795
Andrey Khatimlianskii 2016.07.19 13:05  

А, кстати, интересный вопрос. Как можно задавать сессии для конкретного дня, залезая на другой день? Если бы они были одинаковыми на все 7 дней — то да. А иначе появляется неоднозначность.

Мне, например, по приведенному скриншоту не понятно, можно ли торговать в пятницу с 00:00 до 00:55, т.к. для нее указан совершенно конкретный интервал 03:05-23:05.

Хотелось бы комментариев разработчиков. 

 

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

/ /123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий