恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

チャートにインディケーターをセットする関数

MQL4でチャートにインディケーターを配置する関数を作るにはどうしたら良いか調べたところ、以下のページを見つけました。

【ネタ元 Source URL】
https://www.mql5.com/en/forum/73391
https://www.forexfactory.com/thread/981735-issues-with-postmessagew-in-mql4

 

今後使う可能性があるので、上記サイトからコピーしてきたコードを貼り付けておきます。(ほんの少し変更していますが、基本的に同じコードです。)

 

コードの冒頭に以下を記述します。これは「RegisterWindowMessageW関数」と「PostMessageA関数」を使えるようにするためです。

#import "user32.dll"
int RegisterWindowMessageW(string MessageName);
bool PostMessageW(int hWnd, int msg, int wParam, uchar &lParam[]);
#import

 

ファイルのどこかで以下の関数を定義します。

void StartCustomIndicator(int hWnd, string indicatorName)
{
    uchar charArray[];
    StringToCharArray(indicatorName, charArray, 0, StringLen(indicatorName));

    int MessageNumber = RegisterWindowMessageW("MetaTrader4_Internal_Message");
    bool uho = PostMessageW(hWnd, MessageNumber, 15, charArray);
    Sleep(10);
}

 

関数の使用例は以下のとおりです。

int hWnd = WindowHandle(Symbol(), 0);
StartCustomIndicator(hWnd, "PaintMarketTime.ex4");
// 第2引数の" "内は19文字以内にする

 コメントで「第2引数の" "内は19文字以内にする」と記述しておきましたが、20文字以上にすると上手くいきませんでした(ex4ファイルをopenできないというエラーが発生しました)。

 

備考

インディケーターで上述の関数を使用したところ、ex4ファイルをopenできませんでした。スクリプトとEAでは動作しました。