MQL4

オシレータ系のチャートにボリンジャーバンドを適用する方法

tocchi2024/10/01(火) - 18:19 に投稿

意外と知らない人がいるような気がするのだが
ボリンジャーバンドはオシレータ系のチャートにも適用することが可能。
知っていて損はない。

例えばストキャスティクスの値に対してボリンジャーバンドを適用したい場合

タグ

MQL4のカスタムインジケータで使用できるバッファ数について

tocchi2024/09/19(木) - 04:52 に投稿

昔のカスタムインジケータで使用できるバッファ数は
8個(プロットも同じ)までしか使用出来なかったのだけど
いつの間にか512個まで可能になっていた。

調べると2014年のアップデート以降に使えるようになったらしい。

タグ

OrderSend時のストップレベルの注意点

tocchi2023/09/12(火) - 09:20 に投稿

OrderSend関数を使ってオーダーする際にストップレベルを考慮しなければならないのは有名な話だが
注意すべき点が何個もあって、いつも忘れてしまうので備忘録
オーダータイプによって変わるのが面倒くさい

変数名は以下参照(変数名で分かると思うけど、わからない人は関数のヘルプ見て)
OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit )
STOPLEVEL・・・MarketInfo( Symbol(), MODE_STOPLEVEL ) * Point;

【ストップロスに対するストップレベル】
OP_BUY → Bid - stoploss >= STOPLEVEL
OP_BUYLIMIT/OP_BUYSTOP → price - stoploss >= STOPLEVEL
OP_SELL → stoploss - Ask >= STOPLEVEL
OP_SELLLIMIT/OP_SELLSTOP → stoploss - price >= STOPLEVEL

タグ

SetIndexLabelの注意点

tocchi2023/08/17(木) - 22:15 に投稿

カスタムインジケータでプロットはしたいがデータウィンドウには表示はしたくない場合、
SetIndexLabel( index, NULL )
このように第二引数にNULLを指定すれば可能なのだが、
実はこれ以外にも影響がある箇所がある。

通常はチャート上でプロットされたものをマウスの右クリックをすると
そのインジケータのプロパティを見たり、インジケータを削除したいすることが可能なのだが
これが出来なくなる。
インジケータ一覧から選択しないといけないので一手間かかるようになる。

私はマウスでインジケータのプロパティ操作や削除を行っているので地味に影響が大きい。

そうそういじることないだろと思われるかもしれないが
開発している時は意外と頻繁にプロパティいじったり削除したりするので。。。

タグ

ObjectsDeleteAllの注意点

tocchi2023/08/17(木) - 21:34 に投稿

カスタムインジケータでラベルなどのオブジェクトを作成した場合、オブジェクトの削除を行わないと
カスタムインジケータを除外した時にラベルだけ残ったりします。

なのでラベルなどのオブジェクトを作成した場合、後始末が必ず必要。
適切なのはOnDeinit関数だと思うのでここにオブジェクトを削除するのがベスト。

削除する方法としては以下の二つになる。
・オブジェクト名を指定して個別に削除するObjectDelete関数を使う
・オブジェクトをまとめて削除するObjectsDeleteAll関数を使う

ObjectsDeleteAll関数が接頭語指定による削除が出来たりとかなり便利なのだが
とりあえず以下のようにchart_idだけ指定するだけでも削除してくれるので、
ObjectsDeleteAll( 0 );
とりあえずいいかと思いきや
定型チャートなどにテンプレとして組み込んだ場合、
バックテストで作成された取引のオブジェクトまで消えてしまう。(当たり前なのだが知らないとハマる)

ちゃんと調べれば何を指定すべきなのかわかるんだけどね。。。

タグ

インジケータ作成における2つのスタイルの指定方法

tocchi2023/08/10(木) - 03:16 に投稿

インジケータを作成する際にスタイルの指定を行う方法は二通りあり、それぞれ意味が違うので注意が必要。

①#property定義によるスタイルの指定
 この方法は主にインジケーターを適用した時のデフォルト値として採用されます。
 ユーザーがインジケーターの引数を変更した場合、MT4を再起動したときは引数が変更されたままの状態となります。

 #property indicator_type1   DRAW_ARROW
 #property indicator_color1  clrBlue
 #property indicator_style1  STYLE_SOLID
 #property indicator_width1  1
 

タグ

ストップレベルとPipsを計算するときの注意点

tocchi2023/08/07(月) - 16:53 に投稿

ストップレベルの単位はポイントなので計算するときは

    double stopLevel = MarketInfo( Symbol(), MODE_STOPLEVEL ) * Point;

Pipsの単位は業者によって違うので計算するときは

    double    PIPS = _Point*10.0;
    if ( _Digits == 2 || _Digits == 4 )
    {
        PIPS = _Point;
     }

参考
【MQL言語入門】通貨の最小価格単位を表す変数『Point』についてわかりやすく説明してみた | FX-EA System Project Creator (fx-ea-system-project.com)

 

タグ

OnCalculateの注意点

tocchi2023/05/21(日) - 18:08 に投稿

新しいMQL4でインジケータを作成する場合、OnCalculate()を使用して作成することになるが
こいつの引数であるopen, high, low, closeの配列方向に注意。

時系列配列の方向とopen, high, low, closeの配列方向が逆になっているために
これらを使用するときは方向をあらかじめ統一しておかないと上手くいかない。

インジケータは基本的にデバッグしにくい上に、
open, high, low, closeの内容が原因だとは思わないため、バグ調査に時間がかかる。

タグ

MQLでDLLへ配列を渡したいとき

tocchi2019/06/13(木) - 19:30 に投稿

MQL側は以下のように渡す。

// DLLをインポートする.
#import "libConvCharSet.dll"
   // DLLで作成した関数を定義する.
   void getAtai(double&[],int);
   void setAtai(double&[],int);
#import

DLL側は以下のように受け取る。

extern "C"
MT4_EXPFUNC void __stdcall setAtai(double* a, int size)
{
    for (int i = 0; i < size; i++)
    {
        atai[i] = a[i];
    }
}

タグ

MQLでDLLへ文字列を渡したいとき

tocchi2019/06/13(木) - 19:13 に投稿

MQL側はstringで渡す。

// DLLをインポートする.
#import "libConvCharSet.dll"
   // DLLで作成した関数を定義する.
   int LoadNetwork(string);
#import

DLL側はLPTSTRで受け取り、マルチバイト文字列をstringに変換する。

extern "C"
MT4_EXPFUNC int __stdcall LoadNetwork(LPTSTR  file_name)
{
    string     str = WideCharsToString(file_name);
    net.load(str);
    int    nNetSize = net.layer_size();
    return nNetSize;
}

マルチバイト文字列をstringに変換するには以下の関数を作成する。

タグ