オシレータ系のチャートにボリンジャーバンドを適用する方法
意外と知らない人がいるような気がするのだが
ボリンジャーバンドはオシレータ系のチャートにも適用することが可能。
知っていて損はない。
例えばストキャスティクスの値に対してボリンジャーバンドを適用したい場合
- オシレータ系のチャートにボリンジャーバンドを適用する方法 の続きを見る
- コメントを投稿するにはログインまたは登録をしてください
意外と知らない人がいるような気がするのだが
ボリンジャーバンドはオシレータ系のチャートにも適用することが可能。
知っていて損はない。
例えばストキャスティクスの値に対してボリンジャーバンドを適用したい場合
昔のカスタムインジケータで使用できるバッファ数は
8個(プロットも同じ)までしか使用出来なかったのだけど
いつの間にか512個まで可能になっていた。
調べると2014年のアップデート以降に使えるようになったらしい。
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( index, NULL )
このように第二引数にNULLを指定すれば可能なのだが、
実はこれ以外にも影響がある箇所がある。
通常はチャート上でプロットされたものをマウスの右クリックをすると
そのインジケータのプロパティを見たり、インジケータを削除したいすることが可能なのだが
これが出来なくなる。
インジケータ一覧から選択しないといけないので一手間かかるようになる。
私はマウスでインジケータのプロパティ操作や削除を行っているので地味に影響が大きい。
そうそういじることないだろと思われるかもしれないが
開発している時は意外と頻繁にプロパティいじったり削除したりするので。。。
カスタムインジケータでラベルなどのオブジェクトを作成した場合、オブジェクトの削除を行わないと
カスタムインジケータを除外した時にラベルだけ残ったりします。
なのでラベルなどのオブジェクトを作成した場合、後始末が必ず必要。
適切なのはOnDeinit関数だと思うのでここにオブジェクトを削除するのがベスト。
削除する方法としては以下の二つになる。
・オブジェクト名を指定して個別に削除するObjectDelete関数を使う
・オブジェクトをまとめて削除するObjectsDeleteAll関数を使う
ObjectsDeleteAll関数が接頭語指定による削除が出来たりとかなり便利なのだが
とりあえず以下のようにchart_idだけ指定するだけでも削除してくれるので、
ObjectsDeleteAll( 0 );
とりあえずいいかと思いきや
定型チャートなどにテンプレとして組み込んだ場合、
バックテストで作成された取引のオブジェクトまで消えてしまう。(当たり前なのだが知らないとハマる)
ちゃんと調べれば何を指定すべきなのかわかるんだけどね。。。
インジケータを作成する際にスタイルの指定を行う方法は二通りあり、それぞれ意味が違うので注意が必要。
①#property定義によるスタイルの指定
この方法は主にインジケーターを適用した時のデフォルト値として採用されます。
ユーザーがインジケーターの引数を変更した場合、MT4を再起動したときは引数が変更されたままの状態となります。
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
ストップレベルの単位はポイントなので計算するときは
double stopLevel = MarketInfo( Symbol(), MODE_STOPLEVEL ) * Point;
Pipsの単位は業者によって違うので計算するときは
double PIPS = _Point*10.0;
if ( _Digits == 2 || _Digits == 4 )
{
PIPS = _Point;
}
新しいMQL4でインジケータを作成する場合、OnCalculate()を使用して作成することになるが
こいつの引数であるopen, high, low, closeの配列方向に注意。
時系列配列の方向とopen, high, low, closeの配列方向が逆になっているために
これらを使用するときは方向をあらかじめ統一しておかないと上手くいかない。
インジケータは基本的にデバッグしにくい上に、
open, high, low, closeの内容が原因だとは思わないため、バグ調査に時間がかかる。
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側は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に変換するには以下の関数を作成する。