独自インクルードファイルのすすめ
EAを書く際は、独自関数をインクルードファイルとして読み込むと捗る。
日々EAを作成したりする人であればやっている事だろうと思うが、まだの方は是非検討を。
例えば、EAが取ったポジションの数を把握する下記の記述がある。
input int magicNumber=12345; //マジックナンバー //...中略... OnTick(){ //...中略... int positionsCount=0; for(int i=0;i<PositionsTotal();i++){ if(PositionGetTicket(i)){ if(PositionGetInteger(POSITION_MAGIC)==magicNumber) { positionsCount++; } } } //...中略... }
ポジション数を知りたい時に、これを何度も書いている場合は、すぐにやめて関数化した方が良い。
関数をEAのどっかに貼り付けておけば呼び出すだけで済む。
では、関数にしてみる。
input int magicNumber=12345; //マジックナンバー //...中略... OnTick(){ //...中略... int positionsCount=getPositionsCount(); //関数の使用 //...中略... } int getPositionsCount(){ int positionsCount=0; for(int i=0;i<PositionsTotal();i++){ if(PositionGetTicket(i)){ if(PositionGetInteger(POSITION_MAGIC)==magicNumber) { positionsCount++; } } } return positionCount; }
他にもEAを作ることがあり、また同じ処理が必要になりそうなら、インクルードファイルにした方が良いかもしれない。
インクルードファイルは、拡張子が「.mqh」になる。
中身は、そのまま関数を書いておけば良い。
上記の関数をインクルードファイルに書くなら下記のような中身になる。
このファイルは、EA自体とは分離するため、EA側で定義されるグローバル変数などは原則使えないものとして考えた方が良い。
よって、EA側から何か情報をもらう必要があるなら、引数として定義する。
int getPositionsCount(int magicNumber){ int positionsCount=0; for(int i=0;i<PositionsTotal();i++){ if(PositionGetTicket(i)){ if(PositionGetInteger(POSITION_MAGIC)==magicNumber) { positionsCount++; } } } return positionsCount; }
他にも面倒なエントリー処理や決済処理、人によってはインジケータの値取得なんかも簡略化するかもしれない。
それらを出来得る限り独立した形で定義して、インクルードファイルにまとめよう。
インクルードファイルは、Expertsフォルダと同階層にあるIncludeフォルダに保存する。
EA側では、#includeでファイルを読み込む。
関数の記述がなくなり、スッキリする。
#include <MyLib.mqh> input int magicNumber=12345; //マジックナンバー //...中略... OnTick(){ //...中略... int positionsCount=getPositionsCount(magicNumber); //インクルードした関数の使用 //...中略... }
デメリットとしては、インクルードファイルが膨大になると無駄に読み込んでるんじゃ…という気がする点と、独自関数に慣れすぎると本来の記述方法がわからなくなるかもしれない点などが考えられるが、作業効率はぐんと向上するだろう。
まあ、人に見せたり、販売用のEAを作成したりする場合だけ、清書すれば良い。