MT5とスピードの関係 - ページ 23

 
Renat Fatkhullin:

分からない人のために説明すると、他人のコードで適用するとブレーキがかかるのはfxsaberライブラリのせいです。

それを明確に指摘するのではなく、プラットフォームブレーキやスリップ自殺の例についてゲームを始めたのです。そして、真因に迫り、問題をスムーズに解決するチャンスがあったのに、それを逃したのです。

ローカル最適化のために、メインアプリケーションの履歴キャッシュを汚染していたのです。

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

MT5とスピードの関係

fxsaber, 2020.09.02 00:02

多くの人が再現可能なきれいなMQL5のコードがありました。陰謀論ごっこではなく、泥仕合に時間を割くほどあなたを必要としている人がいることを、スレッドの時系列でまず勉強。

七面鳥として頑張っているんですね。建設的でないため、このスレッドでは特にどのライブラリの議論もされていません。

要は、from-inputパラメータが一致しない共有ライブラリをあえて使う人がいると、ブレーキがかかるということです。ドキュメンテーションのどこにもそのような記述はない。少なくとも、何かはペンチで取り出したんだろう。そして、それが終わると「不正行為だ」と非難されるようになったんですね。


MQLのこの機能は、DocumentationとFeaturesブランチに書かれるべきものです。このブランチにあるクリーンなMQL5スクリプトを、その作成日に対応するビルドで実行します。どうやら、あまりにも多くの修正が、念のためやみくもに行われたようです。

 
fxsaber:

インディーズで頑張っているんですね。ここのスレッドでは、建設的でないため、特にライブラリは言及されませんでした。

なぜなら、あなたは ライブラリのことを 極力 しゃべらないようにしてきたからです。これらのライブラリーがある中で私の方が速い」という反対意見が絶えない中で。だから、「ほら、こんなに遅いんだよ」と突き出して、セルフ撮影を巧みに隠しているんですね。


要は、from-inputパラメータが同じでない共有ライブラリをあえて使うと、ラグが発生するのです。ドキュメンテーションのどこにもそのような記述はない。少なくとも、このトピックに関する何かが、あなたからペンチで抽出されたのです。そして、それが終わると「不正行為だ」と非難されるようになったんですね。


MQLのこの機能は、DocumentationとFeaturesブランチに書かれるべきものです。このブランチにあるクリーンなMQL5スクリプトを、その作成日に対応するビルドで実行します。どうやら、あまりにも多くの修正が、念のためやみくもに行われたようです。

HistorySelectのドキュメントに 明記されています。

HistorySelect()関数は、適切な関数を介してリストの要素をさらに参照できるように、注文のリストと取引のリストをmql5プログラム内に作成します。取引リストのサイズはHistoryDealsTotal() 関数で、履歴の注文リストのサイズはHistoryOrdersTotal() 関数で取得することができます。注文リストの要素の列挙はHistoryOrderGetTicket() 関数、案件リストの要素についてはHistoryDealGetTicket() 関数が適切です。

HistoryOrderSelect() 関数を使用した後、チケットによるオーダーの検索 が成功した場合、mql5-programが使用できるヒストリーのオーダーリストはリセットされ、オーダーが再入力されます。これは、HistoryDealSelect() 関数を使用してリセットされ、チケット番号によってディールが正常に取得された場合に再入力されます。


アトミック/スナップショットアクセスが必要な膨大なボリューム(理由があって何千、何万もの案件を履歴に表示しました)を扱う場合、そのコストを理解する必要があります。

特に、これらのキャッシュの技術的な詳細については、このスレッドで詳しく説明しましたので。


各サンプルがランダムになるように、またキャッシュにできるだけ毒を 入れないように、何もしていないのでしょうか?あなたの立場のために......どんな自虐的なことをしてもいいんですか?

 
Renat Fatkhullin:

なぜなら、あなたは 図書館のことを黙って いるために、できる限りのことをしたからです。だから、「ほら、こんなに遅いんだよ」と誇示することで、自業自得のバグを巧妙に隠したんですね。

バグの99%はこの方法で発見されます。まず、大きなコードにおかしな挙動が見られる。そして、ローカライゼーションによって原因を突き止める。それよりも、ブレーキが気になりました。

トレーディング機能 なしで、です。問題は、ほとんどどこにでもある。

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...
その男性は、協力することにして、自分のマシンできれいなMQL5のコードを走らせた。上記はごく一部のサンプルです。上の機能名を読んでください。


HistorySelectのドキュメントに 明示的に記載されています。

HistorySelect()関数は、注文のリストと取引のリストをmql5プログラム内に作成し、適切な関数を介してリスト内の項目をさらに参照できるようにします。取引リストのサイズはHistoryDealsTotal() 関数で、履歴の注文リストのサイズはHistoryOrdersTotal() 関数で取得することができます。注文リストの要素の列挙はHistoryOrderGetTicket() 関数、案件リストの要素についてはHistoryDealGetTicket() 関数が適切です。

HistoryOrderSelect() 関数を使用した後、チケットによるオーダーの検索 が成功した場合、mql5-programが使用できるヒストリーのオーダーリストはリセットされ、オーダーが再入力されます。これは、HistoryDealSelect() 関数を使用してリセットされ、チケット番号によってディールが正常に取得された場合に再入力されます。

この文章の行間に何かを見出したのは誰だろう?個人的には、HistoryDealSelectとHistoryOrderSelectは、このように書かなければならないと(このブランチの前に)理解していました。

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

そうでなければ、ラグが発生することは間違いありません。

アトミック/スナップショットアクセスが必要な巨大ボリュームを扱う場合、そのコストを理解する必要があります。

このスレッドで、これらのキャッシュの技術的な詳細について詳しく説明しましたので、なおさらです。

このスレッドで必要な情報を拾ってきました。

 
Renat Fatkhullin:

各サンプルがランダムになるように、またキャッシュにできるだけ毒を 入れないように、何もしなかったのでしょうか?あなたの立場のために......どんな自虐的なことをしてもいいんですか?

このスレッドで時系列にすべてを見ることができます。この問題は、もともとランダムのない状態で表示されていました。

このスレッドは、いかに相手の言葉を捻じ曲げられるかがよくわかる。すべてのソースとその結果はここに保存されます。

 

なぜ端末は、再び全履歴が要求されたときにキャッシュを増やし、足りない範囲を検索してキャッシュすることができないのでしょうか?それで問題が解決するように思います。結局、バー/チケットを要求すると、データパケットの欠落が返されるので、そのための仕組みがあるのです。

 
Aleksey Vyazmikin:

なぜ端末は、再び全履歴が要求されたときにキャッシュを増やし、足りない範囲を検索してキャッシュすることができないのでしょうか?

これは、すでに行われていることです。

しかし、HistorySelect( 0,INT_MAX) がHistorySelect( other_time, ... ) を呼ぶ間に、キャッシュは other_time から再構築 され、次のHistorySelect( 0,... ) 要求で新しいキャッシュの構築が行われます (より遅くなります)

 
Andrey Khatimlianskii:

これは、すでに行われていることです。

しかし、HistorySelect( 0,INT_MAX) の呼び出しの間にHistorySelect( other_time, ... ) を呼び出すと、キャッシュは other_time から再構築さ れ、次のHistorySelect( 0,... ) 要求で新しいキャッシュの構築が行われます (より遅くなります).

それができていればいいのですが、問題は、キャッシュが蓄積されていれば、あとは受信したデータでの作業の利便性だけです。

取引操作を深く理解していなかったのですが、クエリーの範囲が変わると、フルブルートフォースでないと履歴内のデータを素早く検索できないのでしょうか?

 
Aleksey Vyazmikin:

私はトレーディングにそれほど詳しくはないのですが、クエリの範囲が変わると、完全列挙でないとストーリー内のデータを素早く検索する方法がないのでしょうか?

この知識を使わないでどうするんだ?

現実的な問題がない=疑問がない

 
Renat Fatkhullin:

OrderExist と PositionExist は、シンボル、取引タイプ、medzhik によるエントリーを検索するために、すべての注文またはポジションをループすることを回避する特別な最適化関数です。

その結果、チケットの配列になります。


これらの機能を利用することで、プログラムが大幅に節約できる可能性があります。特に、オープンポジションやオーダーを一括して呼び出す場合、常にオーバーシュートループを繰り返しています。

今後、膨大な トレードデータにアクセスするための、より効果的な機能を実装していく予定です。

また、言語も飛躍的に強化・簡略化され、より強力な機能を持つようになります。

"OrderExistとPositionExist" - ドキュメントに見当たらないのですが、どこで読むことができますか?
 
HimOrik:
OrderExistとPositionExist" - ドキュメントにはありません、どこで読めますか?

次のリリースバージョン(現在はベータ版)以降になる可能性が高い