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
  • 63 follow us in feedly

関連記事

no image

MT4でtemplatesを利用して定型チャートを保存する

こんばんは。キリンです。 Yahoo!知恵袋の質問にあったので取り上げさせていただきました。 いまさら感はありますがせっ

記事を読む

no image

取引履歴を元にトレードの結果をチャート表示するインジケータのご紹介

おはようございます。キリンです。 MT4以外でトレードした結果を、MT4のバックテストみたいにヴィジュアルで把握できるよ

記事を読む

no image

人脈はまず貢献から

さて、今までメタトレーダーのプログラム作成がメインのブログになっておりましたが、 ちょっと方向性を変更して行こうと思いま

記事を読む

no image

メタトレーダー4

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

記事を読む

no image

Win7でWindowsタスクバーで結合せずにラベルを非表示にする方法

http://lanif.blog6.fc2.com/blog-entry-329.htmlみなさん、考えることは同

記事を読む

no image

最小二乗法を用いたトレンドラインのアレンジ版の作成

自分でいうのもなんですが、かなり使えると思います。 私の知っているトレンドラインを自動で引くものの中では 一番精度がいい

記事を読む

no image

MT4のインジケータにMAを重ねる

こんばんは。キリンです。 今日はちょっとしたMT4のテクニックのご紹介です。 MT4の標準のインジケータであれば、 実は

記事を読む

no image

チャーチストへの夢 part2

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

記事を読む

no image

activemqをwindowsでバックグラウンドに常駐させる

1. Windows1.1 Go to ACTIVEMQ_HOME/bin/win321.2 Run the scr

記事を読む

no image

Java Access Bridgeライブラリ

http://docs.oracle.com/javase/7/docs/technotes/guides/acces

記事を読む

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

Windowsユーザ御用達の uci.edu から直接python wheelをインストールしてくれるライブラリ pipwin

あんまり情報が出てこないのでメモ書き。 https://twitter.com/fx_kiri

Python2 から Python3 へのC Extension の移行

最初に追加 モジュールの初期化と状態情報を書き換える initmyextension 関

Interactive Brokers 証券の Python API を利用する

Interactive Brokers 証券とは 日本には珍しく自動売買プラットフォームが提供され

Python Pandas からお手軽に highcharts が使える kanichart 作りました。

Kanichart fx-kirin/kanichart: Easy(簡易) plotting

Python 2, Python 3 で更新したファイルを調べてreloadするパッケージを作った。

pdbでのデバッグにはreload機能がない IPythonには優秀なautorelaod機能

→もっと見る

PAGE TOP ↑