如果正确的话,以上都不是,因为不方便为每个经纪人(每个经纪人都有自己的规定)制定不同角色的代码。
它被毫不含糊地定义如下。
1.进行任何交易操作。
2.在回复该操作时,我们得到错误代码132(ERR_MARKET_CLOSED)。
此外,为了不错过开市,你可以以一定的周期性重复交易操作。
例如,我在一个专家顾问中做了这个,它与很多符号一起工作。
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是一个结构数组。
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)。
此外,为了不错过开市,你可以以一定的周期性重复交易操作。
例如,我在一个专家顾问中做了这个,它与很多符号一起工作。
一个检查是否可以在一个符号上进行交易的函数。
用于记录不能交易的符号的功能。
正如你很容易猜到的,数组g_marketClosedSymbols是一个结构数组。
现在问一下MK的开发者,为什么要做一个永远不会工作的事件?https://docs.mql4.com/ru/dateandtime/dayofweek
如果(DayOfWeek()==0 ||DayOfWeek()==6)返回(0)。
如果我用ticks工作,就没有ticks,事件就不会发生;如果我用timer工作,服务器就会给我最后一个nick的到达时间,即最后的星期五分钟,事件也就不会发生。事实证明,我有一个定时器上的EA,服务器像以前一样在ticks上工作,但服务器是在线的,因为当我发送请求时,它给我错误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