MQL5でiClose/iOpenの時系列アクセスなどを操作した場合の不具合。 - ページ 5

 
Renat Fatkhullin:

Market Watchから各シンボルの最新 2000ティックを常に保持するインジケータのリファレンスコードを教えてください。

そうしないと、片方は推測で、もう片方は言葉という形でしか提言ができなくなります。

 
Renat Fatkhullin:

コードを見なければならない。

上のコードは、明らかに論理的、資源的な問題が山積みです。

このようなことをやっているのですが、どのように、そして必要なら何をいじればいいのか、アドバイスをお願いします。

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
int OnCalculate (const int       rates_total,
                 const int       prev_calculated,
                 const datetime &time        [],
                 const double   &open        [],
                 const double   &high        [],
                 const double   &low         [],
                 const double   &close       [],
                 const long     &tick_volume [],
                 const long     &volume      [],
                 const int      &spread      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

コードを見なければならない。

上のコードは、明らかに論理的、資源的な問題が山積みです。

このコードに論理的な問題があるのか、それとも私が何かを見逃しているのか?

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL5 iClose/iOpenの時系列アクセス等の不具合について

スタニスラフ・ドレイ 2018.11.14 16:28

バグレポートに対する姿勢がおかしい。何かを証明するためにお金をもらっているわけではありません。できる限り状況を整理してみました。

私だけが問題なのではなく、30回目のアップデート後に問題が発生したのですが、それでもあなたは私が馬鹿だとほざき、一部の遅れたインジケーターのせいにしています。

その前の1年間は遅かったのでは?

以下は、M30で起動から25分後にハングアップするコードの例です。

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

一度にすべてを手に入れられるわけではないことをきちんと理解した上で、指標を書く必要があります。

OnInitでは、CopyXXXを1回呼び出すことによって、必要な測定器の履歴の読み込みを促す必要がありますが、OnCalculateでは完全な初期化まで待つ必要があります。

初期化フェーズにエラーがあるようです。不正確なデータ待ちでブロックしています。

していこうと思います。

今はOnCalculateにリクエストしてそこで待っています(もちろん毎ティックではなく、最初の計算時のみです)。

 
fxsaber:

Market Watchから各シンボルの最新 2000ティックを常に保持するインジケータのリファレンスコードを教えてください。

同感です!ダニどころか、棒の方が良いですね。

Approved True Multicurrency Codeの例が必要です。

そうでなければ、私たちは暗闇の中にいることになる...。

 

エラーの場所を特定し、見つけ次第報告します。

 
transcendreamer:

そうですね!ダニではなく、棒の方が良いですね。

Approved True Multicurrency Codeの例が必要です。

そうでなければ、まだ暗闇の中にいるようなものだ...。

棒グラフと目盛りは、MT5で独立して生きている異なるエピスタシスです。
 
Vladimir Karputov:

また、他の人のタイムフレームで作業している場合、そのタイムフレームから1分に1回OHLCを取得することが常に推奨されています(任意のCopyXXXX関数)。これは昔からそうでした。

もう、ここで全てを吐き出したいくらいですが、残念ながら私はMQの製品に10年程費やしてきました。

今はビジネス一色です。VladimirさんのCopyXXXX関数の使用についてのアドバイスは、私の専門家ではない書き方のコードから見て、特に支障はなかったので、私が使用しました。

正直、自分の曲がった手だけが問題であってほしかったのですが、問題は手だけではありません。私はテクニカルサポートから、私が間違ってコーディングしていると言って奇妙な説明を期待して、以下のスクリーンショットを持っていると100500他の指標、だからあなたは何をしたい、問題が発生することがあります。私は100500の他の指標を持っていません、エキスパートもいません、私はターミナルで2つのツールだけを開いています、指標テストはEURUSD 1Mで実行されています、指標は同じツールのM15タイムフレームからデータを取得します、すなわち、私は他のシンボルのデータをロードしようとしていませんし、マーケットレビューにそれらのほんの数人がいます。

積載量という点では端末にとって理想的な状況であり、もちろん作業環境ではそうではないでしょうが、この場合でも問題があり、私の考えではこの問題を「BAG」と呼んでいます。

インジケータでは、iClose関数とiBars関数は、Commet()の状態を反映するためだけに呼び出されます。スクリーンショット作成時のマーケット概況では、iCloseとiBarsの関数呼び出しの状態がターミナルウィンドウにあり、さらにインジケータの計算部分はCopyXXXX関数が使用されています。

バッグ

ご覧の通り、16:31にインジケータを再読み込みして正常に動作したのですが(嬉しくもなってきた)、iCloseのデータ更新が00:15以降止まってしまい、それぞれCopyXXXX関数も更新データを返さない、つまりMTの奥の方でエラーが発生しているのです。

私見ですが、サーバーからデータを読み込む際に障害が発生し、その理由は質量(インターネットがない、サーバーが忙しかったなど)かもしれませんが、なぜ通信の原因を排除した後の作業の再開が起こらないのか、だから、ユーザーのソースコードをいくらでもテストできるのに、隣のサーバーがあれば、この問題を特定できない、存在するのに手の悪いコーダーのせいだけで発生しない、という結論なのだと思います。

 

また、昨日Stanislavからのコードをテストすることにしました。数時間後、時刻の更新が止まりました。タイムフレームを切り替えたわけではなく、チャートのコンテキストメニューから 更新しただけで時間が経過してしまったのです。

今日は、時間と現在のタイムフレームを見るために、コードを少し修正しました。

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

15分後、「not native」タイムフレームで更新が停止しましたが、現在のタイムフレームでは正常に更新されていました。グラフの更新後、再び時刻が始まりました。

端末はポータブルモードで動作しています。システムと端末本体は、SSDディスクに配置されています。


 

何があったのかわかりませんが、MQL5で最新のMQ Championship用のbotを書いたときは多通貨対応で、他の金融商品のデータ読み込みに問題は感じられませんでした。

リソースは大量に消費されたかもしれませんが、期待通りの結果が得られたわけで、今のようなルーレットゲームではありません。

この問題は、例えばMQL5用の商用製品の開発者として、私の性格をあまり良くはしませんし、マーケットから購入した製品にお金を払った人が、このような「BOGS」のせいで不具合にしか見えないとしたら、二重に不愉快でしょう。