システム・セキュリティのため、DLLの各呼び出しは特別なストリッパーを通過し、実行速度が遅くなります。DLL関数の呼び出しは平凡なコールXXXXではなく、アドレスマスキング、スタック制御、DLL内部のクラッシュを伴う複雑なラッピングです。MQL5では、DLL内部の関数がスタックを混乱させたりクラッシュしたりしても、ターミナル自体をクラッシュさせることなくスクリプトの実行を停止できるようになっています。
DLL関数を使用する際の一般的なアドバイス:小さな結果を渡すために1秒間に何万回もの呼び出しを行うのではなく、内部で大量の作業を行う稀な呼び出しを行うようにしてください。
私は疑問に思う。なぜもっと踏み込まないのだろう?
レナトが指摘したように、DLLから安価な関数を呼び出すのはコストがかかる。
では、この目的のために用意された配列に直接データをコピーしてはどうだろう?
私は疑問に思う。なぜもっと踏み込まないのか?
この質問は誰に向かってしているのでしょうか--作者ですか、それとも開発者ですか?
開発者に向けてなら、具体的に何を提案するのか?
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); }
Get/SetのようなDLL関数を頻繁に呼び出す人には、非常に深刻な警告がある。
システム・セキュリティのため、DLLの各呼び出しは特別なストリッパーを通過し、実行速度が遅くなります。DLL関数の呼び出しは平凡なコールXXXXではなく、アドレスマスキング、スタック制御、DLL内部のクラッシュを伴う複雑なラッピングです。MQL5では、DLL内部の関数がスタックを混乱させたりクラッシュしたりしても、ターミナル自体をクラッシュさせることなくスクリプトの実行を停止できるようになっています。
DLL関数を使用する際の一般的なアドバイス:小さな結果の転送で1秒間に何万回もの呼び出しを行うのではなく、内部で大量の作業を行う稀な呼び出しを行うようにしてください。
ところで、複数のDLL呼び出しについてもう一つ。テスト中に、呼び出しごとに数バイトのメモリリークが発生することに気づきました。
StringExplode関数にエラーはありませんか?現在の形式では、文字列の最後のコンポーネントの後に区切り文字がない場合(つまり文字列の最後)、そのコンポーネントをコピーしません。IMHOでは、文字列の最後にデリミタがない場合でも、文字列の最後がコピーされるべきだと考えています。例:"EURUSD,EURJPY "という文字列を", "というデリミタで区切ると、この関数はEURUSDだけを選択します。
以下は修正版の関数です。便宜上、要素数を返しました:
ありがとうございます。記述子の最後の要素が乱数であるため、何の意味も持たないことがわかります。
---------
ありがとうございます!改善案は可能な限り実行します。アイデア自体は良いので、失速しないようにして欲しいです。
なんて複雑なんだ!...
年前、イルヌールの助けを借りて、私はMQL4でメモリを扱うためのライブラリを書いた。メモリの確保、ポインタの移動、書き込み、読み出し、メモリ領域の名前を他のプログラムに転送することができる。
すべてはマッピングに基づいている。提案されているものよりもずっとシンプルです。
なんて複雑なんだ!...
年前、イルヌールの助けを借りて、私はMQL4でメモリを扱うためのライブラリを書いた。メモリの確保、ポインタの移動、書き込み、読み出し、メモリ領域の名前を他のプログラムに転送することができる。
すべてはマッピングに基づいている。提案されているものよりずっとシンプルだ。
Get/SetのようなDLL関数を頻繁に呼び出す人には、非常に深刻な警告がある。
システム・セキュリティのため、DLLの各呼び出しは特別なストリッパーを通過し、実行速度が遅くなります。DLL関数の呼び出しは平凡なコールXXXXではなく、アドレスマスキング、スタック制御、DLL内部のクラッシュを伴う複雑なラッピングです。MQL5では、DLL内部の関数がスタックを混乱させたりクラッシュしたりしても、ターミナル自体をクラッシュさせることなくスクリプトの実行を停止できるようになっています。
DLL関数を使用する際の一般的なアドバイス:小さな結果を渡すために1秒間に何万回も呼び出すのではなく、内部で大量の作業を伴うまれな呼び出しを行うようにしてください。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 インディケータ間のデータ交換:簡単です はパブリッシュされました:
チャートに添付されるインディケータデータにアクセルする、次のようなプロパティを有する環境を作成したいと思います。:データコピーをしない。利用可能なメソッドを使用する必要がある場合、そのコードについて最小の修正だけ行う。必要な場合MQLコードの使用が好ましいと思います。(もちろんDLLを使う必要がありますが、C++コードのストリングをいくらか使うだけです。)本稿ではMetaTraderターミナルにプログラム環境を開発する簡単な手法について述べます。それにより、他のMQLプログラム からインディケータ バッファにアクセスする手段を得ることができます。
作者: Alexey Subbotin