エラー、バグ、質問 - ページ 1851

 
kaus_bonus:

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

全体としては、私の投稿で示したような結果になっています。

普通のやつでテストしてきました。

チートではなく、どちらのシステムでも同じ条件です。


それなのに、MT4とMT5の結果は200倍近く違う(原因は -サーバーデータとの完全な同期を制御しなければならない?).

MT4で約0.6ms まだ何とかなりそうです。どうやら、そこのデータはすでに準備されているようで、この数字は実際のコストを表していないようです。

MT4は思想がかなり違っていて、実はターミナルはMQL4のコードからシステムレベルで各スクリプト/エキスパートの膨大なデータをコピーしているのです。そのため、MQL4での測定は、通常、データ受信のためのリソースの実消費量を示すものではありません。もちろん、経費は存在しますが、それは別の次元の話であり、システムが責任を負うべきものです。

あなたのタスクが無限のデータフロー(深い履歴、何万もの商品)にスケールアップした場合、MT4のメカニズム(各ロボットのマーケットデータのコピーを 作成する)が適用できないことは明らかです。そのため、Open/High/Low/Closeのダイレクトアクセスを廃止し、CopyXXX関数に切り替えるなど、MQL5を劇的に変更・改良する必要がありました。MT5データのサイズを考慮すると、Expert Advisorが600万バーのEURUSD M1 コピーを構築するのは高すぎます。

MT5/MQL5は、事前にコピーすることなく、オンデマンドでデータをダウンロードする戦略を採用しているため、MQL5コードから実際のコストを測定する機会がより多くあります。

MT5で複雑なオブジェクトのデータベースをメモリに取り込み、同期を確認し、キャッシュを準備するのに113ミリ秒は許容範囲です。

 
kaus_bonus:

例えば、MTにはマーケットスクリーナーがないので、マーケットウォッチにシンボルを追加する小さなスクリプトを書きましたが、価格はCopyCloseを介してのみ利用でき、シンボルがマーケットウォッチに追加されるまでSymbolInfoDoubleやMqlTickを介して利用できないので、ターミナルを起動してから 無限に長くこのスクリプトが実行されます。これはあくまで例としてです。

履歴を取得するために、商品をマーケット一覧に追加する必要はありません。シンボルデータを参照すると、バックグラウンドデータの同期が開始されます。

現在では、最新のデータが要求されても、チャートデータベース全体がその深さまで持ち上げられ、過剰なレベルのキャッシュを使用しているという問題があります。その結果、数百のチャートをチェックするスクリーナーでは、大きなメモリオーバーが発生します。

タスクはすでにこの戦略を変更し、リクエストの最も遠い日付から500バーより深くデータをピックアップしないように設定されています。これにより、マーケットスクリーナーを苦もなく書くことができるようになります。

 
fxsaber:

正しい方法とは?


あなたは尋ねた、あなたは答えた:)まあ、そうなんですけどね。
 
Алексей Тарабанов:

あなたは尋ねた、あなたは答えた:)そうですね、その通りです。
省略されたテンプレートのオペレーターコールを見たことがない。
 
fxsaber:
短縮されたテンプレートのオペレーターコールはまだ見たことがありません。

構造物を扱うのは久しぶりです。構造体配列の要素全体を開始させる必要がある場合は、文字列操作となります。そして、変換された文字 列の整数要素は正しく開始され、コンパイラが報告したとおりです。構造体の配列を開始、比較、またはその他の方法で処理したい場合は、MQLでそれらがどのように表現/保存されるかを尋ねてください。複雑なことは何もなく、作業スピードが格段にアップします。
 
Алексей Тарабанов:
どの構文項目が省略されているのか知りたい
Struct.operator[]<int>(0);
 
fxsaber:
どの構文項目が省略されているのか知りたい
構造体[0]の場合
 
Комбинатор:
Struct[0]です。

誰に対してどのように
 
Комбинатор:
Struct[0]です。
ページを閲覧しないように、コードをコピーしておきます。

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

バグ、バグ、質問

fxsaber さん 2017.04.12 14:27

struct STRUCT
{
  template <typename T>
  void operator []( int ) {}
};

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}

この2つの通話は別物です。

Struct.operator[]<int>(0);
Struct.operator[]<MqlTick>(0);

それぞれに対応する略記号があるはずです。どれだ?

 
fxsaber:
どの構文項目が省略されているのか知りたい

欲しいものを提供できるエントリーはありません。ファンダメンタルズ意味的に。