Wizard In The Market
システムトレードの魔術師

*

MQLからC++ DLLへの参照渡しorポインタ渡し・・・。

公開日: : 最終更新日:2015/01/13 その他

おはようございます。キリンです。
マニアックなネタなので、ほとんどの人は興味がないと思いますが、
メモ代わりに記載しておきます・・・。
多分C++に詳しい人にとっては当たり前なのかもしれません><;
string型(char型)以外で、MQLからDLLへポインタ渡しすることは不可能なようです。
参照渡しは全ての型で不可能でした。
常にクリティカルエラーが表示されてしまい、MT4が落ちます。
さらに、MQLでstring型をDLLに渡すときは、
必ず前もって文字領域を確保しておかなければなりません。
たとえば、
string text = "123456789";
とすれば、char[10]に対応しますが、
string text = "1234"+"56789";
このようにすると、"1234"分、char[5]分しか確保されませんでした。
また、定義時に割り当てておかないと、全く確保されないようです。
さらに、同じ定数を割り当てると同一メモリに保存されてしまいます。
string text1 = "123456789";
string text2 = "123456789";
とすると、text1をDLLへ渡して、特定のメモリの値を変えてやると、
たとえば、DLL側でchar* text1としたとして、
*(text1+3) = ‘e’;
とすると、text2の表示も
"012e456789"
と3番目の表示が変わってしまいます。
まったく同じ定数を割り当てた変数は、同一メモリが使われているようです。
なので、メモリ確保するときは1文字でも違う定数を割り当てなければなりません。
具体的には、
string text1 = "123456789"
string text2 = "123456780"
のようにする必要がありました。
今はboolの結果が欲しいだけでも、string⇒char型にして無理やりDLLに渡しています。
この情報は誰かの役に立つのかな・・・
以上、参考情報でした。
お読みくださり、ありがとうございます。

にほんブログ村 為替ブログへ 
Fx-Kirin

About Fx-Kirin

2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。

Adsense

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 64 follow us in feedly

関連記事

no image

チャーチストへの夢 part2

おはようございます。キリンです。 ブログのタイトルでもある「チャーチスト」ですが、 チャートだけで分析を行っていく人のこ

記事を読む

no image

Add Alert and SendMailの改造

おはようございます。キリンです。 最近22時に寝ているので朝が早いです。 では、本題。先日公開した、 任意のインジ

記事を読む

no image

11/2運用履歴

<colgroup> </colgroup>バイナリオプション日付曜日取

記事を読む

no image

メタトレーダー4

今回は、自動取引プログラム(通称EA)を作成可能な無料ソフト 「メタトレーダー4」 の紹介です。 メタトレーダーとは、

記事を読む

no image

移動平均線を用いたExpertAdvisorの作成

こんばんは。 一通りの勉強が終わったため、 簡単なExpertAdvisorの作成に取り掛かってみました。 やはり一筋縄

記事を読む

no image

【β版】裁量トレード検証ツール TradeTester公開

こんにちは。キリンです。 今日はかなり便利なソフトウェアの公開をします。 裁量のバックテストには打ってつけです。 (正直

記事を読む

no image

Sakura VPS Ubuntu 12.04 に Ruby on rails と PHP、 メールサーバ構築までまとめてみる。 その6

結構長くなっちゃう。あとはRuby on Railsのインストールぐらいだね。頑張っていこー。 Rubyのインストール

記事を読む

no image

プログラミング講座用 ネタ募集

おはようございます!キリンです。 といっても寝てないんですが、そのあたりは気にしない(w さて、プログラミング講座なんで

記事を読む

no image

Activemq-cpp導入メモ

かれこれ3日目。どうしてもrubyとc++の非同期プロセス間通信をしたくて色々試行錯誤した過程でぶち当たった問題の一

記事を読む

no image

11/18 11/19 運用結果

<colgroup> </colgroup>バイナリオプション日付曜日取

記事を読む

Comment

  1. SECRET: 0
    PASS:
    おぉ。
    この話はどっかのブログで見た事あるな。
    そんなところまではまだ手が出ないっすが、これからの為に押さえておきます!!

  2. tommy より:

    SECRET: 0
    PASS:
    ・変数宣言時の演算子の優先順位
    ・キャストとポインター操作
    プログラマは、不可解な謎の答えは自分自身で見つけ出すものですからここに答えは書きません。
    自分で問題解決した後のαテストが一番楽しいですね。

  3. SeaStar より:

    SECRET: 0
    PASS:
    配列にすれば行けます。
    【MQL4】
    #import "TestBool.dll"
    void TestBool(bool b[], int);
    #import
    bool b[] = { true };
    TestBool(b, ArraySize(b));
    if(b[0])
    {
    Print("true");
    }
    else
    {
    Print("false");
    }
    【DLL】
    MT4_EXPFUNC void __stdcall TestBool(bool b[], int size)
    {
    if(b == NULL)
    {
    return;
    }
    if(size < 1)
    {
    return;
    }
    b[0] = false;
    }
    何だか良く分からないですが、こんなことするぐらいであれば、戻り値で受け取った方が良い気がするのですが…。
    MQL4ではこういう仕様の様ですね。
    intやdouble等でも同様です。

  4. SECRET: 0
    PASS:
    >SeaStarさん
    アドバイスありがとうございます。
    配列でできるのは分かるのですが、
    やりたかったのは「参照渡し」なんですよ^^;
    それができなかったので苦肉の策でポインタ渡しにしようと思ったわけです。
    bool型は値の受け渡しも、関数の戻り値に指定した場合もDLLへ正常に受け渡しできないことも判明しました・・・。
    結構色々問題がありそうですね。

  5. SeaStar より:

    SECRET: 0
    PASS:
    >本気のFX部長! Kirin@FTLさん
    >やりたかったのは「参照渡し」なんですよ^^;
    恐らくそうだと思うんですが、MQL4でいう配列のみ参照渡し出来ない仕様なんだと思います。
    問題ではなく仕様なんだと思います…。
    違ったら申し訳ないです。
    ポインタ渡しってつまり値渡しですよね^^;
    値渡しはそもそも代入不可なんではないでしょうか。

  6. SECRET: 0
    PASS:
    >SeaStarさん
    ポインタ渡しは値渡しではないです。
    メモリのアドレスを渡すという形なので、参照先で値を変更させればメモリの中身が変わり、関数を抜けても値が変わった状態で出力されます・・・。
    MQLのstring型からDLL側のchar型のみ、ポインタ渡しが可能みたいです。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Adsense

DictCursor に AttrDict を指定する

Python requests に DefaultTimeout を設定する

Pythonコード 参考リンク [bm url="https://stackoverflow

Python Mock で オリジナルのインスタンメソッドのを呼びたい時

autospec と sideeffect を組み合わせるのが解決策だった。

Python 2, Python 3 で string を bytes に変換する。

共通の処理系にしておきたかったので、メモ書き。 [bm url="https://python

ctypes で c_char array を c_char_p に変換する

なかなか情報がなかったのでメモ書き。

→もっと見る

PAGE TOP ↑