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 час |
}
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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