¿Cómo saber si el mercado está cerrado? (mql4)
Si es correcto, ninguna de las anteriores, ya que es inconveniente hacer un código para cada corredor (cada uno tiene su propia normativa) para diferentes personajes.
Se define de forma inequívoca como sigue:
1. Se realiza cualquieroperación comercial.
2. En respuesta a la operación, obtenemos el código de error 132 (ERR_MARKET_CLOSED).
Además, para no perderse la apertura del mercado, puede repetir las operaciones con cierta periodicidad.
Por ejemplo, hice esto en un Asesor Experto que trabaja con muchos símbolos:
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; }
Una función para comprobar si es posible operar con un símbolo:
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; }
Una función para registrar un símbolo que no puede ser negociado:
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++; }
Como puede adivinar fácilmente, el array g_marketClosedSymbols es un array de estructuras.
Cambié el Asesor Experto al modo OnTimer() y ahora cuando el mercado está cerrado no entiende esto e intenta operar, en general contacta con el servidor y por supuesto recibe errores y atasca los registros. GetLastError() = El mercado está cerrado. ¿Qué otras condiciones para comprobar si hay un día libre o un mercado cerrado se pueden aplicar?
las garrapatas no vienen
la hora del servidor no cambia
si (DayOfWeek()==0 || DayOfWeek()==6) por la hora de computación +/- hora del servidor
Si hay un error, debe ser el fin de semana
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(); }
Si es correcto, ninguna de las anteriores, ya que es inconveniente hacer un código para cada corredor (cada uno tiene su propia normativa) para diferentes personajes.
Se define de forma inequívoca como sigue:
1. Se realiza cualquieroperación comercial.
2. En respuesta a la operación, obtenemos el código de error 132 (ERR_MARKET_CLOSED).
Además, para no perderse la apertura del mercado, puede repetir las operaciones con cierta periodicidad.
Por ejemplo, hice esto en un Asesor Experto que trabaja con muchos símbolos:
Una función para comprobar si es posible operar con un símbolo:
Una función para registrar un símbolo que no puede ser negociado:
Como puede adivinar fácilmente, el array g_marketClosedSymbols es un array de estructuras.
Ahora una pregunta a los desarrolladores de MK, ¿por qué hacer un evento que nunca funcionará? https://docs.mql4.com/ru/dateandtime/dayofweek
if(DayOfWeek()==0 ||DayOfWeek()==6)return(0);
Si estoy trabajando con ticks, no hay ticks y el evento no se producirá; si estoy trabajando con timer, el servidor me da la hora de llegada del último nick al mismo, es decir, los últimos viernes minutos y el evento tampoco se producirá. Resulta que tengo un EA en timer y el servidor funciona en ticks como antes, pero el servidor está en línea porque cuando envío una petición me da error 132. Por favor, arregladlo o el servidor cambiará la hora en el temporizador también o puedo comprobar si el mercado está cerrado sin enviar una orden de comercio. Este es un fallo feroz, espero que se entienda y se solucione el problema.
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 час |
}
Cambié el Asesor Experto al modo OnTimer() y ahora cuando el mercado está cerrado no entiende esto e intenta operar, en general contacta con el servidor y por supuesto recibe errores y atasca los registros. GetLastError() = El mercado está cerrado. ¿Qué otras condiciones pueden utilizarse para comprobar si el mercado está cerrado o en fin de semana?
MarketInfo(symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True