記事"MetaTrader 5 の注文、ポジション、取引"についてのディスカッション

 

新しい記事 MetaTrader 5 の注文、ポジション、取引 はパブリッシュされました:

メタトレーダー5の取引システムの仕組みへの理解がなければ、信頼性のある自動取引ロボットの作成はできません。クライアントターミナルが売買サーバーにアクセスし、ポジションや注文、取引に関する情報を取得します。MQL5を使用し適切に取得したデータを扱うには、MQL5とクライアント側の相互の連携に関するより良い理解が必要になります。

メタトレーダー5における注文とポジション

作者: MetaQuotes Software Corp.

 

この質問に対する最良の 答えが見つかりません。

例えば、履歴から最後の注文を1つだけキャッシュに読み込むにはどうすればよいでしょうか(タスクを複雑にするため、最後の注文を記号で指定します)。

例えば、アドバイザーの注文頻度は様々です。1日に30回注文を出すこともあれば、数日または数週間「沈黙」することもある。

注文をサーバーに送信した後、そのチケットをどこかに記憶しておき、チケットでこの注文を取り出すというバリエーションもある。グローバル変数と EAロジック内の両方に記憶させることが可能です。しかし、例えばExpert Advisorが別の端末から口座に接続し、最後の注文のチケットを持っていない場合に問題が発生します。

HistorySelectで 履歴を読み込む必要があるのですが、終了日は大体わかるのですが、最初の日付をどのように計算すればよいのでしょうか。

というのも、小さな範囲でも複数の注文を得ることができるからです - 問題ではありませんが、不要なデータをロードするという点では最適ではありません。あるいは、そのうちのひとつが範囲に入らないかもしれない。

キャッシュを埋めるために、さらに小さな日付範囲を取り、ループ(履歴に範囲をシフト)することができます - 余分なループ、履歴データベースへのクエリ - 作業のロジックの面で最適ではありません。

余計なループ、履歴データベースへのクエリなど、作業ロジックとしては最適ではありません。

さらに:もしこの記事の目的が、注文/取引/ポジションへのアクセスの最適なアルゴリズムを示すことだとしたら。例えば、チケットと注文をサーバーに送信した時間だけが必要で、それ以外のデータはこの範囲からこれらの注文にロードする(マジック、コメントなど)。

select * from HistiryOrder where a_date_send>@datestart and a_date_send<@dateend

DBMSアプリケーションを開発している人たちは、このようなクエリは本番用としては承認されないと思う。確かに、すべてのデータがさらに何らかのアクションに関与している状況もあるが、これはルールというよりむしろ例外である。


 
olyakish:

この質問に対する最良の 答えが見つかりません。

例えば、履歴から最後の注文を1つだけキャッシュに読み込むにはどうすればよいでしょうか(タスクを複雑にするため、最後の注文を記号で指定します)。

例えば、アドバイザーの注文頻度は様々です。1日に30回注文を出すこともあれば、数日または数週間「沈黙」することもある。

注文をサーバーに送信した後、そのチケットをどこかに記憶しておき、チケットでこの注文を取り出すというバリエーションもある。グローバル変数と EAロジック内の両方に記憶させることが可能です。しかし、例えばExpert Advisorが別の端末から口座に接続し、最後の注文のチケットを持っていない場合に問題が発生します。

HistorySelectで 履歴を読み込む必要があるのですが、終了日は大体わかるのですが、最初の日付をどのように計算すればよいのでしょうか。

というのも、小さな範囲でも複数の注文を得ることができるからです - 問題ではありませんが、不要なデータをロードするという点では最適ではありません。あるいは、そのうちのひとつが範囲に入らないかもしれない。

キャッシュを埋めるために、さらに小さな日付範囲を取り、ループ(履歴に範囲をシフト)することができます - 余分なループ、履歴データベースへのクエリ - 作業のロジックの面で最適ではありません。

余計なループ、履歴データベースへのクエリなど、作業ロジックとしては最適ではありません。

さらに:もしこの記事の目的が、注文/取引/ポジションへのアクセスの最適なアルゴリズムを示すことだとしたら。例えば、チケットと注文をサーバーに送信した時間だけが必要で、それ以外のデータはこの範囲からこれらの注文にロードする(マジック、コメントなど)。

select * from HistiryOrder where a_date_send>@datestart and a_date_send<@dateend

DBMSアプリケーションを開発している人たちは、このようなクエリは本番用としては承認されないと思う。確かに、すべてのデータがさらに何らかのアクションに関与している状況もあるが、これはルールというよりむしろ例外である。


非常に大きな履歴であっても、ロードと処理にはそれほど時間はかからない。もうひとつは、このような読み込みが毎ティックごとに行われるのであれば、それはすでに問題であるということだ。

非常に大きな履歴でさえ、数秒で処理されてしまう。したがって、最初の結論は、フルロードの回数を減らすことである。

OnInit()でヒストリーのフル・ロードを開始する。必要な日付を覚えておく。その後、OnTicket()で "太陽とジプシーのように "物語を紡ぐことができる。

削除済み  
Urain:

非常に大きな履歴であっても、ロードと処理にそれほど時間はかからない。もうひとつは、このような読み込みが毎ティック行われるのであれば、それはすでに問題であるということだ。

非常に大きな履歴であっても、数秒で処理されてしまう。したがって、最初の結論は、フルロードの回数を減らすことである。

OnInit()でヒストリーのフル・ロードを開始する。必要な日付を覚えておく。その後、OnTicket()で "太陽とジプシーのように "物語を紡ぐことができる。

より具体的には、初期化ブロックと週末にのみ、履歴をフルロードすべきである(週末にはパラメータも最適化 すべきである)。

 

私を混乱させたことのひとつは、キャッシュへの履歴の読み込みを控えめに(思慮深く)する必要性についての警告がたくさん書かれているにもかかわらず、このタスクをどのように実行するかの実例がないことだ。これには正直動揺した:

//--- 最初の境界を3日前に設定する
   datetime start=end-3*PeriodSeconds(PERIOD_D1);

このコード(アプローチ)は本当に通常のExpert Advisorで使われるのだろうか?特定の単純なタスク(たとえば、数日分の注文を見つけるなど)について話しているのでなければ、そして(この例では、週末は考慮されていないため、コードは数日間の取引 処理には適していない)、このアプローチはいかなる批判にも耐えられない。

しかし、経済的なローディングを実装するためのツールはすべてあります。そして、私の知る限り、そのような実装の例が記事にあるはずだ。

例えば、このテンプレートを使う:

  1. OnInit() - 全履歴をキャッシュにロードし、Expert Advisorにとって重要な最後の注文を検索し(例えば、meijikまたは単に楽器によって)、その時間を変数に保存します。
  2. OnTrade() - キャッシュに読み込まれた履歴を更新し(記憶された時間から開始)、最後の注文の時間を更新します(新しい重要な注文が表示された場合)。
  3. OnTick() - 現在ロードされているキャッシュを使用するか、必要に応じて、記憶された時間からキャッシュをロードする。

このアプローチはすでに安定性と普遍性を主張している。その上、リソースの利用という 点では、「過去3日間を選択する」よりもさらに経済的であることが判明するかもしれない。


ともあれ、この記事には改めて感謝する。このような「開発者からの仕様」は必要であり、そうでなければ正常なコードは存在しない。

 

この記事では1日分の取引履歴を読み込む例を示しています(あるコードでは3日分の履歴を読み込む例を示しています)。そう、これは限界であり、この例は万能ではない。しかし、読者が記事を読みながらこの特殊性を理解すれば、どのような間隔でどの時点から 取引履歴を キャッシュに読み込む 必要があるのか、自分で判断できるようになる。

読者は最も簡単な例とアルゴリズムを手に入れ、必要なイベント処理 機能に独自に適用することができる。自分自身の取引履歴のベースを独自に作成し、その初期化や同期化などを行うことができる。

取引履歴を使った最適な作業のための具体的なレシピや関数を、すべてのケースについて説明しようとすると、少なくとももうひとつ記事が必要になる。より正確には、例そのものではなく、特定のタスクを解決するためのアプローチである。この記事は、取引関数がどのように機能し、どのようなニュアンスに注意を払うべきかを理解することで、自分の研究時間を無駄にしないことを目的としている。

この記事を読めば、すべてがシンプルになると確信している。

 

OfLineモードでの端末操作の説明がどこかにあれば教えていただけませんか?チャートデータが更新されないため、ターミナルをロードできませんでした。職場でテストしたかったのですが(インターネットはありません)、チャートは更新待ちで、テスターにはシンボルが一つもありません。記事によると、ターミナルを起動した後、サーバーとのデータ同期が 実行されます。しかし、接続がない場合はどうなるのでしょうか(実際には接続がないはずです)。もしかしたら、OfLineで動作することを端末に明示し、この不幸な車輪を回さないようにするのが理にかなっているかもしれません。おそらく、テスターの仕事に対する失敗は少なくなるでしょう。公平を期すために言っておくと、私は長い間この問題には遭遇していませんが、人々はフォーラムでこの問題について不平を言っています。もしかしたら、この状況を解決するためのトリック(まあ、削除するファイルがあるのだが)があるのかもしれない(私は試したが、自宅のサーバーとの接続を確立するまで何も役に立たなかった)。

Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
  • www.mql5.com
Получение рыночной информации / SymbolIsSynchronized - Документация по MQL5
 

端末カタログを新機器に移行した場合、設定データベース(シンボル、口座設定、取引履歴 等)の一部はハードワイヤード・キーにより暗号化されているため、特別に削除されます。チャートの履歴は影響を受けません。

このため、移行後は最低一度、任意の取引口座に接続し、端末に市場環境を調整させる必要があります。その後、パスワードを消去し、インターネットから切断し、オフラインでテスターを使用することができます。

 
Renat:

端末カタログを新機器に移行した場合、設定データベース(シンボル、口座設定、取引履歴等)の一部はハードワイヤード・キーにより暗号化されているため、特別に削除されます。チャートの履歴は影響を受けません。

このため、移行後は最低一度、任意の取引口座に接続し、端末に市場環境を調整させる必要があります。その後、パスワードを消去し、インターネットから切断し、オフラインでテスターを使用することができます。


私は何も移動も変更もしていません。ラップトップを持って出社し、Expert Advisorをテストしたかっただけです。アカウントは1つで、当然ログインしようとしたのですが、ログにはサーバーとの接続が ないと書かれています。多分、ランダムに失敗しただけだと思いますが、何もできませんでした。

 
Erm955:

移動も変更もしていない。ラップトップを持って出社し、EAをテストしたかっただけです。私は1つのアカウントを持っていて、当然ログインしようとしましたが、ログにはサーバーとの接続がないと書かれていました。多分ランダムな失敗だと思いますが、何もできませんでした。

すべてのマーケットウォッチ、チャート、テスターゾーンを含むターミナルウィンドウ全体のスクリーンショットを提供してください。

自宅の口座に接続し、データを完全に取り出し、少なくとも1回のテストを実行してみてください。その後、インターネットから切断し、ターミナルを再起動して、もう一度試してください。

 
Renat:

すべてのマーケットウォッチ、チャート、テスターゾーンを含む、ターミナルウィンドウ全体のスクリーンショットを提供してください。

自宅の口座に接続し、データを完全にダウンロードし、少なくとも1回のテストを実行してみてください。その後、インターネットから切断し、ターミナルを再起動して、もう一度試してください。

これで、以前と同じようにすべてが機能するので、何もする必要はない。どうやら偶発的な失敗だったようだ。以前は端末が認証を求めたが、今は認証なしで起動する。コンピュータを再起動したりしなかったりしながら10回ほどチェックしました。すべて順調です。