市場が閉まっているかどうかを調べるには?(mql4)

 

Expert Advisor を 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)が返ってくる。

さらに、相場の始まりに乗り遅れないように、ある程度の周期で売買を繰り返すことも可能です。

例えば、多くのシンボルを扱うある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は構造体の配列です。

 
Kino:

Expert Advisor を OnTimer() モードに切り替えたところ、マーケットが閉じているのに理解できずに取引しようとし、一般的にはサーバーに連絡して、もちろんエラーを受け取り、ログを詰まらせることになりました。GetLastError() = 市場が閉鎖されました。その他に、休場日や休場市場を確認する条件として、どのようなことが実施できるのでしょうか。

ダニが来ない

サーバーの時刻は変わりません

if (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)が返ってくる。

さらに、相場の始まりに乗り遅れないように、ある程度の周期で売買を繰り返すことも可能です。

例えば、多くのシンボルを扱うあるExpert Advisorでこんなものを作ってみました。

シンボルで取引可能かどうかを確認する機能です。

取引できないシンボルを記録するための機能。

簡単に推測できるように、配列g_marketClosedSymbolsは構造体の配列です。

ヒントをありがとうございましたが、市場が開いているとき、それはまだ注文で動作するように可能性を検出しようとすることは正しくありませんが、それが動作するようになります。
 
f2011:
こちらもありがとうございます。面白い解決策ですね。
 

では、MKの開発者に質問ですが、なぜ絶対に動作しないイベントを作るのでしょうか?https://docs.mql4.com/ru/dateandtime/dayofweek

if(DayOfWeek()==0 ||DayOfWeek()==6)return(0);

もし私が ticks を使っている場合、ticks は存在せず、イベントは発生しません。もし私が timer を使っている場合、サーバーは最後のニックの到着時間、すなわち最後の金曜日の分を私に与え、イベントも発生しません。私はタイマーにEAを持っていて、サーバーは以前のようにティックで動作していることが判明しましたが、リクエストを送信するとエラー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は別のものを持っています。
理由: