Dllから関数を呼び出して結果を返す - ページ 6 1234567 新しいコメント Forex Trader 2005.09.05 23:37 #51 そのf1-forum マイク=テラニン=私 :)エミュレータもアルパリのフォーラムで既にお渡ししていますしね。MTSは、あなたが私のエミュレータ上でそれらの多くがクラッシュしたかを知っていた場合、私はあまり興味がありません...。:) Forex Trader 2005.09.06 01:18 #52 2マイク :))そう思ったんです。ご興味のある方は、こちらで私のシステムをご覧ください。 http://forum.alpari-idc.ru/viewtopic.php?t=45555 もちろん、ごちゃごちゃしていますが...。 なんなら、エミュレーターでお世話になったので、システムを説明しますよ。 Forex Trader 2005.09.06 03:50 #53 OK、共有したい場合は、murdoc (at) newmail.ruに連絡してください。テスターで動かしてみて、結果をお知らせします。 Forex Trader 2005.09.09 21:27 #54 Renat:<br / translate="no"> デフォルトでは、DLL からのインポートは完全に禁止されています。これがプロテクトです。 外部DLLを使用する場合は、「各DLL関数呼び出しを確認する」ボタンを有効にし、そこで何が呼び出されるかを確認すればよい。これは保護でもある。また、/historyと/filesディレクトリへのアクセスのみで、すべての埋め込みファイル操作の保護が可能です。 もし、ある人がExpert AdvisorをDLLで公開したら、ユーザーはそのDLLを信用するかしないか、どちらかになります。信頼できないならダウンロードしないし、信頼できるなら「DLL関数のインポートを 許可する」にチェックを入れないと、エキスパートが動作しないのだそうです。呼び出している関数の名前もExpert Advisorには役に立ちません。なぜなら、関数が何を行っているかを知るためには、DLLを分解する必要があり、誰もがこれを行えるわけではないからです。そしてこのDLLでは、いろいろと厄介なことができるのですが、MT端末ではそれを防ぐことができないのです。ですから、「保護」というのは非常に相対的なもので、この文脈では本当の保護とは言えません。これがマイクの言いたかったことだと思います。 MT 4 Expert AdvisorsでユーザーDLLから関数を呼び出せるようにしたのは、MT 3にあったAPIの置き換えと位置付けています。つまり、APIが削除された理由の1つである、MT 4端末をデータフィードに変換して注文する機会があるのです(フォーラムでの様々なトピックから判断して)。しかし、APIは残ったまま、非常に不快で、多くのユーザーがそれについて話し、それは冗談から状況を思い出させる: "....飽きられればいい」。そして、このトピックはそのことの確認でもあるのです。筆者の質問に対して、具体的で有益な回答は得られていない。これらの質問は私にも関連するもので、答えはさらに関連するものです :-)。 私もプログラマーとしての経験は浅いのですが、現在のExpert Advisor<->DLLのシステムでは、定義上、シンプルで美しい解答を得ることはできないのです。正確には、MQL4の範囲内では美しいソリューションかもしれませんが、MT4ターミナルとカスタムソフトの統合の範囲内では、控えめに言っても何の意味もないのです。もっと機能的なソリューションもありますから、それを探せばいいだけです:-)。例えば、mtapi.dllのような関数を持つDLLを作成しても、ディーリングセンターのサーバーとではなく、クライアント端末とやり取りすることになる。この場合、開発者の利益は守られ(MT4ターミナルがなければDLLは動作しません)、MQL4 Expert Advisorsよりも複雑なものを作成できる人は、独自のソフトウェア(独自のGUIを含む)を取引システムに統合する良い 機会を得ることができるのです。もし、そのようなバリエーションが検討され、議論されているのであれば、リンクを教えてください(私はそのようなバリエーションには出会っていません)。もしそうでないなら、この件に関する開発者の意見を知りたい。 P.S. 取引端末の説明にある「クライアントAPIの利用が可能」という一行がとても魅力的です。それがMetaTraderに惹かれた理由ですが、ターミナルのバージョン4でAPIがないことにとてもがっかりしました。開発者側とAPI利用者側の歩み寄りを期待します。現状(ekpertsからDLL関数を呼び出す)では不満がある。 Forex Trader 2005.09.19 19:37 #55 問題にぶつかったのは、もちろん私が遅すぎて、うまくいかなかったのかもしれませんが......。 VC++用にコンパイルされたDLLがあります。 機能があります。 void __stdcall process_arr(double *in, double *out, int size); Expert Advisorにそのような宣言があります。 #import "some.dll" void process_arr(double in[], double& out[], int size); 配列は次に宣言されます。 double arr1[100]; double arr2[100]; を作成し,最初の配列を初期化した後,その両方を関数 process_arr(arr1,arr2,100)。 すべてのものが渡されるが、関数はそれを返すことを拒否する。 関数から戻った後、テスト値を出力しています。 Print(arr2[1])する。 と表示され、ログに以下のエントリーが表示されます。 2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647 ということではなく、2^31......がどう関係するのか? は,配列の 他のどの要素に対しても同じように動作します. 関数を終了する前にデバッガで確認したところ、out 配列の値はあるべき値 (価格に近い値 - ~1.2) になっていました。 Calling functions from the ゴゲッターEA Overview of Copy functions Forex Trader 2005.09.19 20:10 #56 2147483647という数字は、ゼロに非常に近いらしい。 正確には2^31-1、つまりゼロのようなものであるはずです。 Forex Trader 2005.09.19 20:53 #57 void __stdcall process_arr(double *in, double *out, int size); <br / translate="no">。 以下はExpert Advisorでの宣言です。 #import "some.dll" void process_arr(double in[], double& out[], int size); MQLに詳しくないので)提案なのですが、2番目のパラメータに&は本当に必要なのでしょうか? void process_arr(double in[], double& out[], int size); Forex Trader 2005.09.19 21:51 #58 に、Roshさん、それはそうなんですが、double型の 話をしていて、そこでは数値表現が「微妙に」違っていて、2^31は0からかなり離れている...ということです。:( VicKの場合、アンパサンドがポイントになります。 2番目の配列は、戻り値の配列です。 Forex Trader 2005.09.19 22:32 #59 VicKの場合、アンパサンドがポイントになります。<br / translate="no"> 2番目の配列は、戻り値の配列です。 この場合、アンパサンドに本質はなく(自分で試しただけですが)、他のもののおかげで配列の中身を変更することができます :-)。ディレクトリ内のDLLサンプルはご覧になりましたか?そこではすべてがうまく機能しています。同じようにやってください。 Forex Trader 2005.09.19 22:46 #60 double[]型の 配列を扱う場合、アンパサンドは何の違いもないようです。 しかし、int[]ではすべて正常に動作しています。 ここからバグの臭いがしてきたような気がします...。:( 開発者のコメントを知りたい これがソースコード付きなら誰も困らないが...どうぞ、助けを求めているんです。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
マイク=テラニン=私 :)エミュレータもアルパリのフォーラムで既にお渡ししていますしね。MTSは、あなたが私のエミュレータ上でそれらの多くがクラッシュしたかを知っていた場合、私はあまり興味がありません...。:)
:))そう思ったんです。ご興味のある方は、こちらで私のシステムをご覧ください。
http://forum.alpari-idc.ru/viewtopic.php?t=45555
もちろん、ごちゃごちゃしていますが...。
なんなら、エミュレーターでお世話になったので、システムを説明しますよ。
外部DLLを使用する場合は、「各DLL関数呼び出しを確認する」ボタンを有効にし、そこで何が呼び出されるかを確認すればよい。これは保護でもある。また、/historyと/filesディレクトリへのアクセスのみで、すべての埋め込みファイル操作の保護が可能です。
もし、ある人がExpert AdvisorをDLLで公開したら、ユーザーはそのDLLを信用するかしないか、どちらかになります。信頼できないならダウンロードしないし、信頼できるなら「DLL関数のインポートを 許可する」にチェックを入れないと、エキスパートが動作しないのだそうです。呼び出している関数の名前もExpert Advisorには役に立ちません。なぜなら、関数が何を行っているかを知るためには、DLLを分解する必要があり、誰もがこれを行えるわけではないからです。そしてこのDLLでは、いろいろと厄介なことができるのですが、MT端末ではそれを防ぐことができないのです。ですから、「保護」というのは非常に相対的なもので、この文脈では本当の保護とは言えません。これがマイクの言いたかったことだと思います。
MT 4 Expert AdvisorsでユーザーDLLから関数を呼び出せるようにしたのは、MT 3にあったAPIの置き換えと位置付けています。つまり、APIが削除された理由の1つである、MT 4端末をデータフィードに変換して注文する機会があるのです(フォーラムでの様々なトピックから判断して)。しかし、APIは残ったまま、非常に不快で、多くのユーザーがそれについて話し、それは冗談から状況を思い出させる: "....飽きられればいい」。そして、このトピックはそのことの確認でもあるのです。筆者の質問に対して、具体的で有益な回答は得られていない。これらの質問は私にも関連するもので、答えはさらに関連するものです :-)。
私もプログラマーとしての経験は浅いのですが、現在のExpert Advisor<->DLLのシステムでは、定義上、シンプルで美しい解答を得ることはできないのです。正確には、MQL4の範囲内では美しいソリューションかもしれませんが、MT4ターミナルとカスタムソフトの統合の範囲内では、控えめに言っても何の意味もないのです。もっと機能的なソリューションもありますから、それを探せばいいだけです:-)。例えば、mtapi.dllのような関数を持つDLLを作成しても、ディーリングセンターのサーバーとではなく、クライアント端末とやり取りすることになる。この場合、開発者の利益は守られ(MT4ターミナルがなければDLLは動作しません)、MQL4 Expert Advisorsよりも複雑なものを作成できる人は、独自のソフトウェア(独自のGUIを含む)を取引システムに統合する良い 機会を得ることができるのです。もし、そのようなバリエーションが検討され、議論されているのであれば、リンクを教えてください(私はそのようなバリエーションには出会っていません)。もしそうでないなら、この件に関する開発者の意見を知りたい。
P.S. 取引端末の説明にある「クライアントAPIの利用が可能」という一行がとても魅力的です。それがMetaTraderに惹かれた理由ですが、ターミナルのバージョン4でAPIがないことにとてもがっかりしました。開発者側とAPI利用者側の歩み寄りを期待します。現状(ekpertsからDLL関数を呼び出す)では不満がある。
VC++用にコンパイルされたDLLがあります。
機能があります。
void __stdcall process_arr(double *in, double *out, int size);
Expert Advisorにそのような宣言があります。
#import "some.dll"
void process_arr(double in[], double& out[], int size);
配列は次に宣言されます。
double arr1[100];
double arr2[100];
を作成し,最初の配列を初期化した後,その両方を関数
process_arr(arr1,arr2,100)。
すべてのものが渡されるが、関数はそれを返すことを拒否する。
関数から戻った後、テスト値を出力しています。
Print(arr2[1])する。
と表示され、ログに以下のエントリーが表示されます。
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
ということではなく、2^31......がどう関係するのか?
は,配列の 他のどの要素に対しても同じように動作します.
関数を終了する前にデバッガで確認したところ、out 配列の値はあるべき値 (価格に近い値 - ~1.2) になっていました。
正確には2^31-1、つまりゼロのようなものであるはずです。
以下はExpert Advisorでの宣言です。
#import "some.dll"
void process_arr(double in[], double& out[], int size);
MQLに詳しくないので)提案なのですが、2番目のパラメータに&は本当に必要なのでしょうか?
void process_arr(double in[], double& out[], int size);
VicKの場合、アンパサンドがポイントになります。
2番目の配列は、戻り値の配列です。
この場合、アンパサンドに本質はなく(自分で試しただけですが)、他のもののおかげで配列の中身を変更することができます :-)。ディレクトリ内のDLLサンプルはご覧になりましたか?そこではすべてがうまく機能しています。同じようにやってください。
しかし、int[]ではすべて正常に動作しています。 ここからバグの臭いがしてきたような気がします...。:(
開発者のコメントを知りたい
これがソースコード付きなら誰も困らないが...どうぞ、助けを求めているんです。