如何了解市场是否关闭?(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)。

此外,为了不错过开市,你可以以一定的周期性重复交易操作。

例如,我在一个专家顾问中做了这个,它与很多符号一起工作。

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() = 市场已关闭。还有什么条件可以检查休息日或封闭市场?

虱子不来

服务器时间不改变

如果 (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)。

此外,为了不错过开市,你可以以一定的周期性重复交易操作。

例如,我在一个专家顾问中做了这个,它与很多符号一起工作。

一个检查是否可以在一个符号上进行交易的函数。

用于记录不能交易的符号的功能。

正如你很容易猜到的,数组g_marketClosedSymbols是一个结构数组。

谢谢你的提示,但当市场开放时,尝试检测与订单合作的可能性仍然是不正确的,但它会发挥作用。
[删除]  
f2011:
也谢谢你,有趣的解决方案。
[删除]  

现在问一下MK的开发者,为什么要做一个永远不会工作的事件?https://docs.mql4.com/ru/dateandtime/dayofweek

如果(DayOfWeek()==0 ||DayOfWeek()==6)返回(0)。

如果我用ticks工作,就没有ticks,事件就不会发生;如果我用timer工作,服务器就会给我最后一个nick的到达时间,即最后的星期五分钟,事件也就不会发生。事实证明,我有一个定时器上的EA,服务器像以前一样在ticks上工作,但服务器是在线的,因为当我发送请求时,它给我错误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都有不同。