こんばんは、たかはしです。
インジケーターやEAを修正する時に詰まりやすいポイントを押さえていこうと思います。
シフト値の罠
インジケーターをMQLからコールする場合、いろいろなルールがありますよね。
例えばiMAのルールはこんな感じです。
double iMA(
string symbol, // symbol
int timeframe, // timeframe
int ma_period, // MA averaging period
int ma_shift, // MA shift
int ma_method, // averaging method
int applied_price, // applied price
int shift // shift
);引用元: iMA
iCustomのルールはこんな感じです。
double iCustom(
string symbol, // symbol
int timeframe, // timeframe
string name, // path/name of the custom indicator compiled program
… // custom indicator input parameters (if necessary)
int mode, // line index
int shift // shift
);引用元: iCustom
どんなインジケーターをコールするときでもshift値を指定する必要があります。

ライン系のインジケーターならどこにshiftさせても大体値が入っているので、問題はありませんが、矢印や記号系のシグナルの場合に罠がありますので、ご注意下さい。

言葉で書いても分かりにくいので画像で説明します。

上の画像ではサブウィンドウ1のSELに値が入っていますが、下の画像の同箇所には値が入っていません。
この現象は、単純に矢印が表示されている箇所とされていない箇所の違いなだけなんです。
矢印がある場所は値が入っているけど、矢印が無い場所は値が入っていない。
ですので、記号系のシグナルを拾うときは、シフト値の場所を考えて設定する必要があります。
また、リペイントする感じのやつであったり、最新足の場所に出ないやつ、出る場所が決まっていない場合などのインジケーターは扱いづらいので注意して下さい。
ライン系のインジケーターはそれほど難しくないので、大丈夫です。
EMPTY値の罠
先ほどの続きになりますが、矢印が出ていない箇所は値が出ていません。
この状態をMQLで対処するには「EMPTY_VALUE」で対処する必要があります。
0でもなく、EMPTYでもなく、EMPTY_VALUEです。
例えば、矢印が表示されている場合にのみ実行させる場合などは「if(val!=EMPTY_VALUE)」のように実装するなどして下さい。
これ以外の実装をしてしまうと意図しない動きをしてしまうので、バグを生む原因となります。
丁寧なインジケーターの場合は、EMPTY_VALUEになる場合、0を代入していたりするので、実装する前にはどんなデータが出力されているのかをデータウィンドウで見て確認して下さいね。
条件分岐の罠
条件分岐がプログラムの基本です。
この場合はこうして、あの場合はこうする。
でも、こういうときは特別にこういうことをして、こんなことまでしちゃう!というルールで処理を分岐させます。
if文は論理式で判断されるので、真偽でしか判断しません。
また、MQLは比較的構文チェックが甘いので多少のコーディングミスはコンパイルされてしまいます。
例えば、double型とブール型とのデータ比較が出来てしまったりします。
下手にコンパイルが通るだけに、デバッグに時間が掛かったりしますw
この条件式を間違った構文で書いてしまうと、思いがけない動きをする上に、一生通らないパスが出来てしまったりします。
ここ、初心者がかなりはまるポイントですので、if文を書くときは、論理的に考えて実装して下さい。