시장이 언제 문을 닫는지 어떻게 알 수 있습니까? (mql4)

 

어드바이저를 OnTimer() 작동 모드로 전환했습니다. 이제 시장이 닫힐 때 그는 이것을 이해하지 못하고 거래를 시도합니다. 일반적으로 그는 서버에 접속하고 자연스럽게 오류를 수신하고 로그 로그를 막습니다. GetLastError() = 시장이 마감되었습니다. 쉬는 날이나 장가를 닫을 때 확인할 수 있는 다른 조건은 무엇입니까?

   if (DayOfWeek()== 0 || DayOfWeek()== 6 ) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0 ;
      }
   else
      {
         TradeEnabled = 1 ;
      } 
MarketInfo (symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
특정 시간에 일시 중지를 추가하거나 거래 주문 을 금지
 
mql4 아래에 필요합니다. 예, 전문가는 사실 오늘이 토요일이지만 오늘이 금요일이라고 봅니다.
 

정확하다면 다른 기호에 대해 각 브로커에 대한 코드(각각 고유한 규정이 있음)를 만드는 것이 불편하기 때문에 위의 방법 중 어느 것도 사용하지 않습니다.

다음과 같이 명확하게 정의됩니다.

1. 모든 거래 작업이 수행됩니다.

2. 작업에 대한 응답으로 오류 코드 132(ERR_MARKET_CLOSED)가 표시됩니다.

또한 시장의 개장을 놓치지 않기 위해 특정 빈도로 거래를 반복할 수 있습니다.

예를 들어, 많은 기호와 함께 작동하는 한 Expert Advisor에서 다음과 같이 했습니다.

 bool DoTrade(ENUM_TRADE_TYPE tradeType, TradeParam &tradeParam)
{
   // Проверка возможности проведения торговой операции по символу
   if (!IsSymbolTradeAllowed(tradeParam.symbol))
       return false ;
   
   bool res = true ;
   int ticket = 0 ;
   switch (tradeType)
   {
       case TRADE_TYPE_DELETE:    res = OrderDelete(tradeParam.orderTicket);                                                                   break ;
       case TRADE_TYPE_CLOSE:     res = OrderClose(tradeParam.orderTicket, tradeParam.orderVolume, tradeParam.orderCP, i_slippage);           break ;
       case TRADE_TYPE_CLOSEBY:   res = OrderCloseBy(tradeParam.orderTicket, tradeParam.orderTicketCounter);                                   break ;
       case TRADE_TYPE_MODIFY:    res = OrderModify(tradeParam.orderTicket, tradeParam.orderOP, tradeParam.orderSL, tradeParam.orderTP, 0 );   break ;
       case TRADE_TYPE_OPEN:      {
                                    tradeParam.orderTicket = OrderSend (tradeParam.symbol, tradeParam.orderType, 
                                                                       tradeParam.orderVolume, tradeParam.orderOP, 
                                                                       i_slippage, tradeParam.orderSL, tradeParam.orderTP, 
                                                                       "" , tradeParam.orderMN);  
                                    res = (tradeParam.orderTicket > 0 );
                                     break ;
                                 }
   }
   
   int error = GetLastError ();
   if (!res)
   {
      ... // обработка других ошибок
       if (error == ERR_MARKET_CLOSED || error == ERR_OFF_QUOTES)
         AddSymbolToMarketClosedList(tradeParam.symbol);
   }
      
   return res;
}

기호로 거래 가능성 확인 기능:

 bool IsSymbolTradeAllowed( string symbol)
{
   if ( SymbolInfoInteger (symbol, SYMBOL_TRADE_MODE ) != SYMBOL_TRADE_MODE_FULL )
   {
       Alert (WindowExpertName(), ": невозможно совершить торговую операцию по символу " , symbol, ", т. к. по нему торговля запрещена!" );
      AddSymbolToMarketClosedList(symbol, true );
       return false ;
   }

   for ( int i = g_marketSymbolsCnt - 1 ; i >= 0 ; i--)
       if (g_marketClosedSymbols[i].symbol == symbol)
         return ( TimeCurrent () - g_marketClosedSymbols[i].lastRequest) > 60 ;
      
   return true ;
}

거래할 수 없는 기호를 작성하는 기능:

 void AddSymbolToMarketClosedList( string symbol, bool isStopTrade = false )
{
   datetime time = TimeCurrent ();
   if (isStopTrade)
      time = StringToTime ( "3000.01.01" );

   for ( int i = g_marketSymbolsCnt - 1 ; i >= 0 ; i--)
       if (g_marketClosedSymbols[i].symbol == symbol)
      {
         g_marketClosedSymbols[i].lastRequest = time;
         return ;
      }
      
   if (g_marketSymbolsCnt >= MAX_SYMBOLS_AMOUNT)
       return ;
      
   g_marketClosedSymbols[g_marketSymbolsCnt].symbol = symbol;
   g_marketClosedSymbols[g_marketSymbolsCnt].lastRequest = time;
   g_marketSymbolsCnt++;
}

짐작할 수 있듯이 g_marketClosedSymbols 배열은 구조의 배열입니다.

 
Kino :

어드바이저를 OnTimer() 작동 모드로 전환했습니다. 이제 시장이 닫힐 때 그는 이것을 이해하지 못하고 거래를 시도합니다. 일반적으로 그는 서버에 접속하고 자연스럽게 오류를 수신하고 로그 로그를 막습니다. GetLastError() = 시장이 마감되었습니다. 쉬는 날이나 시장이 닫힌 날을 확인하기 위한 다른 조건은 무엇입니까?

틱은 오지 않는다

서버 시간은 변경되지 않습니다

if (DayOfWeek()== 0 || DayOfWeek()== 6 ) 컴퓨터 시간 +/- 서버 시간

그러한 오류가 발생하면 아마도 주말

스크립통  

2. 작업에 대한 응답으로 오류 코드 132(ERR_MARKET_CLOSED)가 표시됩니다.

 
input int       Timer_Sleep_After = 3600; // Если тиков нет уже час, знач рынок закрыт

datetime gt_Last_Tick_Time = 0;


void OnTimer() {
        if(TimeLocal() - gt_Last_Tick_Time > Timer_Sleep_After) return;
}


void OnTick() {
        gt_Last_Tick_Time = TimeLocal();
}
 
Scriptong :

정확하다면 다른 기호에 대해 각 브로커에 대한 코드(각각 고유한 규정이 있음)를 만드는 것이 불편하기 때문에 위의 방법 중 어느 것도 사용하지 않습니다.

다음과 같이 명확하게 정의됩니다.

1. 모든 거래 작업이 수행됩니다.

2. 작업에 대한 응답으로 오류 코드 132(ERR_MARKET_CLOSED)가 표시됩니다.

또한 시장의 개장을 놓치지 않기 위해 특정 빈도로 거래를 반복할 수 있습니다.

예를 들어, 많은 기호와 함께 작동하는 한 Expert Advisor에서 다음과 같이 했습니다.

기호로 거래 가능성 확인 기능:

거래할 수 없는 기호를 작성하는 기능:

짐작할 수 있듯이 g_marketClosedSymbols 배열은 구조의 배열입니다.

올바른 길에 대한 조언을 주셔서 감사합니다. 하지만 시장이 열렸을 때 주문 작업의 가능성을 결정하려는 시도는 어쨌든 정확하지 않지만 작동할 것입니다.
 
f2011 :
흥미로운 아이디어도 감사합니다.
 

이제 MK 개발자에게 질문합니다. 작동하지 않는 이벤트를 만드는 이유는 무엇입니까? https://docs.mql4.com/en/dateandtime/dayofweek

if ( DayOfWeek ()==0 || DayOfWeek ()==6) return (0);

틱으로 작업하면 틱이없고 이벤트가 발생하지 않습니다. 타이머로 작업하면 서버가 마지막 닉네임이 나온 시간, 즉 금요일의 마지막 분을 제공하고 이벤트는 절대 발생하지 않습니다. 일어나거나. 나는 타이머에 대한 조언자가 있고 틱에 대한 서버는 이전과 같이 작동하지만 요청을 보낼 때 오류 132를 제공하기 때문에 서버는 온라인 상태입니다. 서버의 시간이 그에 따라 변경되도록 수정하십시오. 타이머에도 연결하거나 거래 주문을 보내지 않고 시장이 마감되었는지 확인할 수 있습니다. 이것은 심각한 버그입니다. 문제를 이해하고 해결하기를 바랍니다.

DayOfWeek - Документация на MQL4
  • docs.mql4.com
DayOfWeek - Документация на MQL4
 

int Weekday = TimeDayOfWeek ( TimeLocal ());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek ( TimeCurrent ());                                                       //Серверное время  |

while ( IsExpertEnabled ())                                                                 //До тех пор пока запушенно  |

     {
     if (Weekday!= 0 ||Weekday!= 6 ){Exp= true ; if (Weekday== 1 ){Info( 4 ,Weekday, 0 );}}       //Если не Сбб. Воск. то разрешено  |
     if (Weekdays== 0 ||Weekdays== 6 )                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp= false ;Info( 5 ,Weekdays, 0 );
       if (Weekdays== 6 ){ Sleep ( 86400000 );}                                                //Если суббота пауза 24 часа  |
       if (Weekdays== 0 ){ Sleep ( 3600000 );}                                               //Если воскресение пауза 1 час  |
       }

대충 이런 식으로 일시 중지와 주기를 거쳐 결정했지만 터미널 버전을 업데이트하기 전의 오래된 코드입니다. 이제 더 쉬운 방법이 있습니다. 약간의 문헌을 읽으면 됩니다.
 
다시 MK로! 서버가 시장이 닫혀 있다는 것을 알고 오류 132를 생성하는 경우, 즉 주문 작업에 의존하지 않고 시장이 열려 있는지 여부를 확인하도록 요청하는 경우 토요일과 일요일의 정의가 그렇지 않기 때문에 중요합니다. 완전히 맞습니다. 휴일과 거래 세션의 조기 마감이 있으며 DC마다 다릅니다.