記事"インディケータ間のデータ交換:簡単です"についてのディスカッション

 

新しい記事 インディケータ間のデータ交換:簡単です はパブリッシュされました:

チャートに添付されるインディケータデータにアクセルする、次のようなプロパティを有する環境を作成したいと思います。:データコピーをしない。利用可能なメソッドを使用する必要がある場合、そのコードについて最小の修正だけ行う。必要な場合MQLコードの使用が好ましいと思います。(もちろんDLLを使う必要がありますが、C++コードのストリングをいくらか使うだけです。)本稿ではMetaTraderターミナルにプログラム環境を開発する簡単な手法について述べます。それにより、他のMQLプログラム からインディケータ バッファにアクセスする手段を得ることができます。

図2 クライアント端末のグローバル変数リストに作成されたデスクリプタ

作者: Alexey Subbotin

 
Get/SetのようなDLL関数を頻繁に呼び出す人には、非常に深刻な警告がある。


システム・セキュリティのため、DLLの各呼び出しは特別なストリッパーを通過し、実行速度が遅くなります。DLL関数の呼び出しは平凡なコールXXXXではなく、アドレスマスキング、スタック制御、DLL内部のクラッシュを伴う複雑なラッピングです。MQL5では、DLL内部の関数がスタックを混乱させたりクラッシュしたりしても、ターミナル自体をクラッシュさせることなくスクリプトの実行を停止できるようになっています。

DLL関数を使用する際の一般的なアドバイス:小さな結果を渡すために1秒間に何万回もの呼び出しを行うのではなく、内部で大量の作業を行う稀な呼び出しを行うようにしてください。

 

私は疑問に思う。なぜもっと踏み込まないのだろう?

レナトが指摘したように、DLLから安価な関数を呼び出すのはコストがかかる。

では、この目的のために用意された配列に直接データをコピーしてはどうだろう?

 
TheXpert:

私は疑問に思う。なぜもっと踏み込まないのか?

この質問は誰に向かってしているのでしょうか--作者ですか、それとも開発者ですか?

開発者に向けてなら、具体的に何を提案するのか?

 

StringExplode関数にエラーはありますか?現在の形式では、文字列の最後に区切り文字がない場合(つまり文字列の最後)、文字列の最後のコンポーネントをコピーしません。IMHOでは、文字列の最後にデリミタがない場合でも、文字列の最後がコピーされるべきだと考えています。例:"EURUSD,EURJPY "という文字列を", "というデリミタで区切ると、この関数はEURUSDだけを選択します。

以下は修正版の関数です。便宜上、要素数を返しました:

int StringExplode(string s, string separator, string &result[])
{
  int i, pos;
  ArrayResize(result, 0);
   
  for(i = 0; ; i++)
  {
    ArrayResize(result, ArraySize(result) + 1);
    pos = StringFind(s, separator);
    if(pos >= 0)
    {
      result[i] = StringSubstr(s, 0, pos);
      s = StringSubstr(s, pos + StringLen(separator));
    }
    else
    {
      result[i] = s;
      i++;
      break;
    }
  }
  
  return(i);
}
 
Renat:
Get/SetのようなDLL関数を頻繁に呼び出す人には、非常に深刻な警告がある。


システム・セキュリティのため、DLLの各呼び出しは特別なストリッパーを通過し、実行速度が遅くなります。DLL関数の呼び出しは平凡なコールXXXXではなく、アドレスマスキング、スタック制御、DLL内部のクラッシュを伴う複雑なラッピングです。MQL5では、DLL内部の関数がスタックを混乱させたりクラッシュしたりしても、ターミナル自体をクラッシュさせることなくスクリプトの実行を停止できるようになっています。

DLL関数を使用する際の一般的なアドバイス:小さな結果の転送で1秒間に何万回もの呼び出しを行うのではなく、内部で大量の作業を行う稀な呼び出しを行うようにしてください。

ところで、複数のDLL呼び出しについてもう一つ。テスト中に、呼び出しごとに数バイトのメモリリークが発生することに気づきました。

marketeer:

StringExplode関数にエラーはありませんか?現在の形式では、文字列の最後のコンポーネントの後に区切り文字がない場合(つまり文字列の最後)、そのコンポーネントをコピーしません。IMHOでは、文字列の最後にデリミタがない場合でも、文字列の最後がコピーされるべきだと考えています。例:"EURUSD,EURJPY "という文字列を", "というデリミタで区切ると、この関数はEURUSDだけを選択します。

以下は修正版の関数です。便宜上、要素数を返しました:


ありがとうございます。記述子の最後の要素が乱数であるため、何の意味も持たないことがわかります。

---------

ありがとうございます!改善案は可能な限り実行します。アイデア自体は良いので、失速しないようにして欲しいです。

 
Renat:

この質問は誰に対するものですか?

もし開発者に向けてなら、具体的に何を提案しますか?

作者です。配列のサイズを 一緒に渡せば、配列の1回限りのコピーをメモリからメモリへ直接行うことができます。今やらなければならないことがたくさんあるんだ。要点が伝わればいいのだが。

先に言っておくと...-- ロックを使い、転送を正しく実装すれば、この方法は安全なはずだ。

 

なんて複雑なんだ!...

年前、イルヌールの助けを借りて、私はMQL4でメモリを扱うためのライブラリを書いた。メモリの確保、ポインタの移動、書き込み、読み出し、メモリ領域の名前を他のプログラムに転送することができる。

すべてはマッピングに基づいている。提案されているものよりもずっとシンプルです。

 
Zhunko:

なんて複雑なんだ!...

年前、イルヌールの助けを借りて、私はMQL4でメモリを扱うためのライブラリを書いた。メモリの確保、ポインタの移動、書き込み、読み出し、メモリ領域の名前を他のプログラムに転送することができる。

すべてはマッピングに基づいている。提案されているものよりずっとシンプルだ。

ポイントは、提案されているアプローチでは、メモリーの確保やポインターの移動が必要ないということだ。読み書きが直接バッファに整理される。これはマッピングよりもずっとシンプルだ。
 
Renat:
Get/SetのようなDLL関数を頻繁に呼び出す人には、非常に深刻な警告がある。


システム・セキュリティのため、DLLの各呼び出しは特別なストリッパーを通過し、実行速度が遅くなります。DLL関数の呼び出しは平凡なコールXXXXではなく、アドレスマスキング、スタック制御、DLL内部のクラッシュを伴う複雑なラッピングです。MQL5では、DLL内部の関数がスタックを混乱させたりクラッシュしたりしても、ターミナル自体をクラッシュさせることなくスクリプトの実行を停止できるようになっています。

DLL関数を使用する際の一般的なアドバイス:小さな結果を渡すために1秒間に何万回も呼び出すのではなく、内部で大量の作業を伴うまれな呼び出しを行うようにしてください。

修正: ビルド240以降、DLL呼び出しの遅延がなくなりました。現在では、ネイティブのように実質的に遅延なしで実行されます。
 

著者に感謝します。小さなライブラリーではありません。

そして「遺伝学の法則に反しない交配」によって、良い結果を得ることができます。

私は、例えば、最終的にオンラインモードで、オフラインチャートからデータを "プル"))。MT4プラットフォーム。


タールのスプーン一杯)))

グローバル変数の リストに

グローバル変数のリストで、削除されない何らかの理由で "古い "でした。

この理由はまだわからない。