정확하다면 다른 기호에 대해 각 브로커에 대한 코드(각각 고유한 규정이 있음)를 만드는 것이 불편하기 때문에 위의 방법 중 어느 것도 사용하지 않습니다.
다음과 같이 명확하게 정의됩니다.
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 배열은 구조의 배열입니다.
어드바이저를 OnTimer() 작동 모드로 전환했습니다. 이제 시장이 닫힐 때 그는 이것을 이해하지 못하고 거래를 시도합니다. 일반적으로 그는 서버에 접속하고 자연스럽게 오류를 수신하고 로그 로그를 막습니다. GetLastError() = 시장이 마감되었습니다. 쉬는 날이나 시장이 닫힌 날을 확인하기 위한 다른 조건은 무엇입니까?
틱은 오지 않는다
서버 시간은 변경되지 않습니다
if (DayOfWeek()== 0 || DayOfWeek()== 6 ) 컴퓨터 시간 +/- 서버 시간
그러한 오류가 발생하면 아마도 주말
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(); }
정확하다면 다른 기호에 대해 각 브로커에 대한 코드(각각 고유한 규정이 있음)를 만드는 것이 불편하기 때문에 위의 방법 중 어느 것도 사용하지 않습니다.
다음과 같이 명확하게 정의됩니다.
1. 모든 거래 작업이 수행됩니다.
2. 작업에 대한 응답으로 오류 코드 132(ERR_MARKET_CLOSED)가 표시됩니다.
또한 시장의 개장을 놓치지 않기 위해 특정 빈도로 거래를 반복할 수 있습니다.
예를 들어, 많은 기호와 함께 작동하는 한 Expert Advisor에서 다음과 같이 했습니다.
기호로 거래 가능성 확인 기능:
거래할 수 없는 기호를 작성하는 기능:
짐작할 수 있듯이 g_marketClosedSymbols 배열은 구조의 배열입니다.
이제 MK 개발자에게 질문합니다. 작동하지 않는 이벤트를 만드는 이유는 무엇입니까? https://docs.mql4.com/en/dateandtime/dayofweek
if ( DayOfWeek ()==0 || DayOfWeek ()==6) return (0);
틱으로 작업하면 틱이없고 이벤트가 발생하지 않습니다. 타이머로 작업하면 서버가 마지막 닉네임이 나온 시간, 즉 금요일의 마지막 분을 제공하고 이벤트는 절대 발생하지 않습니다. 일어나거나. 나는 타이머에 대한 조언자가 있고 틱에 대한 서버는 이전과 같이 작동하지만 요청을 보낼 때 오류 132를 제공하기 때문에 서버는 온라인 상태입니다. 서버의 시간이 그에 따라 변경되도록 수정하십시오. 타이머에도 연결하거나 거래 주문을 보내지 않고 시장이 마감되었는지 확인할 수 있습니다. 이것은 심각한 버그입니다. 문제를 이해하고 해결하기를 바랍니다.
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 час |
}
어드바이저를 OnTimer() 작동 모드로 전환했습니다. 이제 시장이 닫힐 때 그는 이것을 이해하지 못하고 거래를 시도합니다. 일반적으로 그는 서버에 접속하고 자연스럽게 오류를 수신하고 로그 로그를 막습니다. GetLastError() = 시장이 마감되었습니다. 쉬는 날이나 장가를 닫을 때 확인할 수 있는 다른 조건은 무엇입니까?
MarketInfo (symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True