MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1213

 

Salud!Help :)

インジケーター(mt5)からティック履歴を コピーして、さらに加工する。参考書からアルゴリズムをコピーして、ちょっと変えただけです。

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

しかし、ティック履歴が同期していないとの警告が出ました。

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

そして、ハンドブックにはこう書かれている。

err_history_timeout

4403

履歴要求でタイムアウトを超過した

船長の直感で、刻みを同期させる...。というのが、私の言いたいことです。どうすればいいのか?それとも、成功チェックを外すだけで、同期を取らない場合でも、さほど支障なく動作するのでしょうか?

 
Yevhenii Levchenko:

Salud!Help :)

インジケーター(mt5)からティック履歴を コピーして、さらに加工する。

インジケータは履歴データに非同期でアクセスし、Expert Advisorsとスクリプトは同期でアクセスします。少なくとも、MQLプログラムの開発者は、データを扱う際の動作をこのように呼んでいます。

人間の言葉で言うなら、インジケーターでヒストリーデータにアクセスする際、エラーで計算サイクルを終了し、しばらくしてからヒストリーに再アプローチする必要があるわけです

また、インジケータ内のヒストリをループで何度も呼び出すことは意味がありません。この方法は、エキスパートアドバイザーとスクリプトでのみ機能します。

 
Igor Makanu:

インジケータでは履歴データへの非同期アクセス、Expert Advisorsとスクリプトでは同期アクセス、少なくとも開発者はデータを扱う際のMQLプログラムの動作をそう呼んでいます。

人間の言葉で言うなら、インジケーターでヒストリーデータにアクセスする際、エラーで計算サイクルを終了し、しばらくしてからヒストリーに再アプローチする必要があるわけです

また、インジケーターの中で何度もヒストリーを呼び出すことは意味がありません。この方法は、エキスパートアドバイザーとスクリプトでのみ機能します。

ありがとうございました。

シンクロナス(synchronous)はマルチスレッドと関係があるのでしょうか?"Ticks are not synchronized yet" - it turns out more like warning?

 
ANDREY:

くだらない...論理が苦手、数学が苦手......と言いながら、論理と数学がテーマのフォーラムで長くモデレーターを務めてきたわけですからね。

私がどこで論理が苦手だと言ったのでしょうか。

 
ANDREY:

専門家集団が持っている知識は、フォード自身の知識ではなく、決してそれになることはなかったと思うのです。しかも--彼はその知識を不要としたのだから。そして、その専門家たちがフォードに知識を伝えようとしても、フォードがそれを吸収して実用に供することはできないだろう。新しい知識を吸収するためには、それに付随する一般的な知識以上のものが必要である。上記の例では、専門家はFordに知識を提供したのではなく、弁護士に知識を提供したのである。

そして、あなたの脳の中には、私には、数学と論理学の体系化された知識が十分にあり、このセットによって、新しい情報や不足している情報の検索クエリーを素早く正しく行い、それを素早く正しく解釈することができると思われます。私はあなたの脳には、毎日多くの時間は、このフォーラムに費やされ、彼の脳を介して具体的に数学やロジックに関連付けられている多くの情報を通過して以来、そのような情報は、することはできません確信しています。まるで外国語をイマージョン(没入)して学ぶようなものです。それは自動的に、自発的に、そしてもしかしたら学習者の意思に反してさえも学習されるものです。

もし100人の学者が積分方程式の計算ルールを説明し始めたら、先生が積分方程式の説明を始める前に学校で勉強しなければならなかった数学と代数の教科書を全部頭に入れるまで、私はそのやり方を学べないでしょう。

変数が何なのか、何のためにあるのかを理解していないと、変数が何なのかを知ることすら難しく、ましてや、それほど複雑でもない他の概念を理解することはできないのです。

フォードは、自分の興味のある分野で正しいことを教わるとは言っていない。周囲には各分野のスペシャリストがたくさんいて、その時々に必要な答えが得られるという。なぜ、200人の専門家が知っていることを、経営者が知る必要があるのでしょうか。各専門家が自分の分野で正しい答えを出すでしょう。原理的にすべてを知ることは不可能です。しかし、専門家の力を借りて必要な問題の答えを素早く得ること、これがフォードの言っていた参考書と正しい情報の使い方の話です。そしてそれは、このリソースがCodeBaseとフォーラムという形で提供する、ある狭い範囲でのことなのです。

 
Yevhenii Levchenko:

ありがとうございました。

synchronisedはマルチスレッドと関係があるのですか?"Ticks are not synchronized yet "は、むしろ警告であることが判明?

ノー

開発者は、同期とは履歴関数を 呼び出したときに履歴データの処理が保証されることを意味するが、問い合わせがあったときに必ずしもデータが返されることを保証するものではない、と示唆している

...ここからは非人間的な言葉です ))))


非同期はクエリとデータ、またはエラー。 エラー発生後、同期が始まるが、同期(またはTF構築)の終了時刻が不明で、MT5の性能が高いため、同期したデータではなく、毎回エラーが発生する

ZS: MT5ではすべてが複雑で......。サーバーと端末、そして最後にMQLプログラムがあります。 履歴を要求する場合、サーバーと端末、そして端末とMQLプログラムを同期させなければならず、タイムフレームやティックデータが準備できない人がいるかもしれません。

 
Igor Makanu:

ノー

開発者は、同期が履歴関数を呼び 出す際の履歴データの処理を何らかの形で保証するものだとほのめかしていますが、問い合わせたときにデータが返ってくることを必ずしも保証するものではありません...。

...ここからは非人間的な言葉です ))))


非同期はクエリとデータ、またはエラー。 エラー発生後、同期が始まるが、同期(またはTF構築)の終了時刻が不明で、MT5の性能が高いため、同期したデータではなく、毎回エラーが発生する

ZS: MT5ではすべてが複雑で......。サーバー、ターミナル、そしてMQLプログラムです。 履歴をリクエストする際には、サーバーとターミナル、そしてターミナルとMQLプログラムを同期させる必要があります。

もっと簡単に言うと、こんな感じです。

インジケータで同期を待つには、エラーを受け取った後、OnCalculate()をreturn 0で終了すればよいのです。

この場合、最初に履歴データにアクセスすることでデータの同期が始まり、あとはその完了を確認するだけとなる。なぜなら、0は前の呼び出しですでに計算されたデータ量(prev_calculated)を示し、現在の呼び出しで履歴データの読み込みに成功すると、OnCalculate()は履歴全体の深さについて計算するからです(0を返すことにより、前の呼び出しで何も計算されていないことを示したからです)。

 
a.lxrn:

皆さんこんにちは、この問題を解決するために助けてください、問題はロジックにあります、私は今日、脳を壊してしまい、混乱に陥ってしまいました。

初歩的なコードサンプルを書きましたが、ローソク足の終値がワゴンを上回ったら、1つ注文を入れるというシグナルがあります。

信号はずっと残っているし、そのままでいてくれる。 きっと、私の言っていることがわかると思うんです。

実は、状況が変わって終値が 波の値段より低くなるまで、買い注文を1つ開けて終わりというシグナルはどのように作ればいいのでしょうか。

フラグは使えるのですが、閉じたときに注文が保存されず、開いたり15分遅れたりします。オープニングオーダーとクロージングオーダーの条件が同時に成立すると、さらにクールな印象になります。ティックごとに注文))))フラグは、注文をオープンするシグナルが真で、注文がオープンされているフラグが偽なら、注文をオープンします。また、注文がオープンであるというフラグが真である場合、注文はオープンされません)。ディレイの方が簡単で効率的です。注文が終了した後、ディレイを設定します。

 
Igor Makanu:

非同期はクエリとデータかエラーで、エラー後に同期が始まるが、同期終了(またはTF構築)時刻が不明で、MT5の性能が高いため、同期データではなく再コールするたびにエラーになる

ZS: MT5ではすべてが複雑で......。サーバーと端末、そして最後にMQLプログラムがありますが、履歴をリクエストする際に、サーバーと端末、そして端末とMQLプログラムを同期させる必要があり、誰かがタイムフレームやティックデータを用意していない可能性があります。


おおよそのことはわかった.ありがとうございます :)

アルチョム・トリシキン

だいたいこんな感じで答えやすかったです。

インジケータで同期を待つためには、エラーを受け取った後、OnCalculate()をreturn 0で終了させる必要があります。

この場合、最初に履歴データにアクセスすることでデータの同期が始まり、あとはその完了を確認するのみとなる。なぜなら、0は前の呼び出しですでに計算されたデータ量(prev_calculated)を示し、現在の呼び出しで履歴データの読み込みに成功すると、OnCalculate()は履歴の深さ全体について計算するからです(0を返すことによって、前の呼び出しで何も計算されていないことを示したからです)。

よりシンプルにすることは、より明確にすることではないのです :)

純正の計器に切り替えたところ、一度だけ同期が取れていないと表示されました。その後の問い合わせでは、そのようなことは一切ありませんでした。

テスターでボリュームが表示されない理由を教えてください。
 
Yevhenii Levchenko:

大雑把に言うと...ありがとうございます :)

よりシンプルにすることは、より明確にすることではないのです :)

純正の計器に切り替えたところ、一度だけ同期が取れていないと表示されました。その後の問い合わせでは、そのようなことは一切ありませんでした。

テスターでボリュームが表示されない理由を教えてください。

履歴データを実際の「ホット」な状態に保つには、CopyXXX、iXXX関数(CopyTime()、iTime()など)を使って2分に1回データにアクセスする必要があります。

テスターで出ないボリュームがわからない。ボリュームには実数と刻み数があります。コードがなければ本質的な回答はできません。