現行のMT4のプログラム言語(MQL4)は新MQL4と称されるほど、旧MQL4とは趣を異にしている。MT4のチャートを見ただけでは、新旧の区別は全く感じないが、新しくインディケータ作成のためにエディタを開くと、フォーマット自体が旧版とは似ても似つかぬものに入れ替わっていることに気付く。幸い旧エディタとも互換性は保たれているので、多くの人は旧エディタのフォーマットを今も使い続けているのが現実である。一言で言えば、現在のMT4のメタエディタはMT5のエディタが採用されていると云えば、事態がはっきりする。
では、MT4の新エディタでインディケータを作成した場合、そのインディケータはそのままMT5で作動するかというと、ことはそう簡単ではない。2~3注意しなければならないところがあるが、その一つにローソク足を特定するために振られる足番号がある。
MT4ではチャート上の最も新しいバー(ローソク足)を0(ゼロ)として、過去に向かって1、2、3・・・と順に番号を振っていく。仮に足の数が100本だとすると、現在の足番号は0、そして最も旧い足番号は99となる。一般に、バー全体の数をlimit本とすると、現在の足は0、最も旧い足番号はlimit-1と表現される。
インディケータによっては1本前のバーにおける数値が確定してから次のバーの数値が計算されるもの(例えばEMA)が存在するので、各バーの計算は過去から現在に向かって計算されることが多い。これをプログラム上で表現すると:
for(int i=limit-1; i>=0; i--)
{ 計算式; } ということである。
ところが、MT5ではこれと正反対が原則になっている。即ちMT5では最も旧い足を0として数える。バー全体の数をlimitとするとMT5では現在の足がlimit-1ということになる。先の例の計算式は:
for(int i=0; i<limit; i++)
{ 計算式; } ということになる。
前者のバーの数え方(MT4)は「時系列配列」と呼ばれるのに対して、後者(MT5)は「通常の配列」と呼ばれている。メタトレーダーは柔軟な言語なので、上記の原則にも拘わらず、MT4で「通常の配列」を、また、MT5で「時系列配列」を選択することが可能となっている。それではどちらの配列でプログラムするのがよいのかと訊かれれば、それは個人の好みで選択すればよいと答えるしかない。MT4で「通常の配列」を採用したい場合は、プログラム中でArraySetAsSeries()関数でfalseを選択、反対にMT5で「時系列配列」を採用する場合には、同関数でtrueを選択することになる。原則通りであれば、何も書く必要はない。
MT4で標準搭載されている諸関数を観察すると、それらの採用する配列は「通常の配列」が主流であり、原則を曲げてわざわざArraySetAsSeries()をfalseとしてプログラムされていることに気付く。ここでもメタトレのMT5化が着々と準備されているのが分かる。例えば、Custom Moving Averages. mq4の該当部分は次のようになっている。
//--- check for bars count
if(rates_total<InpMAPeriod-1 || InpMAPeriod<2)
return(0);
//--- counting from 0 to rates_total
ArraySetAsSeries(ExtLineBuffer,false);
ArraySetAsSeries(close,false);
筆者としては、IndicatorもEAもできるだけMT4/5で共通化させたいと考えており、そのためMT4でも標準搭載インディケータが採用する「通常の配列」に拠ることにしている。