たかはしです(・д・)ノ

今日はMQLコードが読みたいけど読めない人に向けて書きます。

コードが読めるようになると自分のロジックをコードに落とし込めたりするので、トレードの幅と夢が広がります。

まぁ、コードが読めて損をする事はないでしょうw

とりあえず今回は、すべて書き出すとかなり長くなってくどい感じになるので、ざっくり説明でいきますよ!

MT4で動いているインジケーターやEAはMQL言語というプログラム言語で書かれていて、プログラムというのは段取りみたいなものです。

やりたい事や実現したい事の段取りをそのプログラム言語に置き換えただけのものです。

下記はBearsというインジケーターのコードです。

ちょっと頑張って読んでみてください。

<br />
//+------------------------------------------------------------------+<br />
//|                                                        Bears.mq4 |<br />
//|                      Copyright © 2005, MetaQuotes Software Corp. |<br />
//|                                       http://www.metaquotes.net/ |<br />
//+------------------------------------------------------------------+<br />
#property copyright &quot;Copyright © 2005, MetaQuotes Software Corp.&quot;<br />
#property link      &quot;http://www.metaquotes.net/&quot;</p>
<p>#property indicator_separate_window<br />
#property indicator_buffers 1<br />
#property indicator_color1 Silver<br />
//---- input parameters<br />
extern int BearsPeriod=13;<br />
//---- buffers<br />
double BearsBuffer[];<br />
double TempBuffer[];<br />
//+------------------------------------------------------------------+<br />
//| Custom indicator initialization function                         |<br />
//+------------------------------------------------------------------+<br />
int init()<br />
{<br />
   string short_name;<br />
//---- 1 additional buffer used for counting.<br />
   IndicatorBuffers(2);<br />
   IndicatorDigits(Digits);<br />
//---- indicator line<br />
   SetIndexStyle(0,DRAW_HISTOGRAM);<br />
   SetIndexBuffer(0,BearsBuffer);<br />
   SetIndexBuffer(1,TempBuffer);<br />
//---- name for DataWindow and indicator subwindow label<br />
   short_name=&quot;Bears(&quot;+BearsPeriod+&quot;)&quot;;<br />
   IndicatorShortName(short_name);<br />
   SetIndexLabel(0,short_name);<br />
//----<br />
   return(0);<br />
}<br />
//+------------------------------------------------------------------+<br />
//| Bears Power                                                      |<br />
//+------------------------------------------------------------------+<br />
int start()<br />
{<br />
   int i,counted_bars=IndicatorCounted();<br />
//----<br />
   if(Bars&lt;=BearsPeriod) return(0);<br />
//----<br />
   int limit=Bars-counted_bars;<br />
   if(counted_bars&gt;0) limit++;<br />
   for(i=0; i&lt;limit; i++)<br />
      TempBuffer[i]=iMA(NULL,0,BearsPeriod,0,MODE_EMA,PRICE_CLOSE,i);<br />
//----<br />
   i=Bars-counted_bars-1;<br />
   while(i&gt;=0)<br />
   {<br />
      BearsBuffer[i]=Low[i]-TempBuffer[i];<br />
      i--;<br />
   }<br />
//----<br />
   return(0);<br />
}<br />
//+------------------------------------------------------------------+<br />

お疲れ様でした。

では上から一緒に読んでいきましょう。

1行目の「//」はコメントです。
以降の「//」もコメントなので、とりあえず意識しなくても大丈夫です。

コメントはプログラムがコンパイルされるときに除去される開発時のメモ書きのようなものです。

コンパイルというのは、コードを実行モジュール(MT4で言うとex4ファイルの事)変換する処理の事です。

チャート上で動いているのはコードではなく、コンパイル後の実行モジュールなんですね。

やはりプログラムというのは英語ベースと言うか、英単語の羅列のような文字列で構成されているので、後で見たときに何をしているか分からなく事が多いのです。

そのために、コメントをつけてコードをわかりやすくしているだけの事なのです。

6行目からの「#property」はこのコードでの属性です。
例えば9行目の「indicator_separate_window」はサブウィンドウに表示させるよ!という意味で、このプログラム中での属性を表しています。

13行目の「extern int BearsPeriod=13;」は外部変数で、パラメータの設定画面に出てくるあれです。

15行目の「double BearsBuffer[];」はインスタンス変数とか、クラス変数とか言ったりしますが、要するにこのプログラム中から扱える作業変数のことです。
インスタンス変数は各関数から使う事ができますが、関数の中に定義している変数はその関数の中でしか使えません。

20行目の「int init()」は関数です。
init関数と言ってプログラムが起動するときに1回しか動かない関数です。
この関数の内部ではいろいろと初期化をしています。

プログラムが起動したときのざっくりとした流れはこうなります。

1.インスタンス変数が読まれる。
2.init関数が呼ばれる。
3.start関数が呼ばれる。
4.deinit関数が呼ばれる(終了専用の関数で、特殊な事をしていなければ基本的に無くても大丈夫)

40行目の「int start()」はメイン処理ですね。
ここがプログラムの核となる部分で、ここにロジックを書き込むわけです。
つまり、ここにロジックが書かれているので、この関数がとても重要になってきます。

42~47行目までは大体どのプログラムでもあるおまじないのようなものです。

処理回数の上限値を計算するような事が書かれています。

48行目からがとても大事です。
いわゆるループ処理です。

コードの書き方が少々不親切ではありますが、僕が説明でカバーしていきますw

<br />
//パターン1<br />
for(i=0; i&lt;limit; i++)<br />
      TempBuffer[i]=iMA(NULL,0,BearsPeriod,0,MODE_EMA,PRICE_CLOSE,i);</p>
<p>//パターン2<br />
for(i=0; i&lt;limit; i++)<br />
{<br />
      TempBuffer[i]=iMA(NULL,0,BearsPeriod,0,MODE_EMA,PRICE_CLOSE,i);<br />
}<br />

書き方がちょっと違うけど両方とも同じ意味なんです。

forループを「{}」で囲っているか囲っていないかだけなんですけど、「{}」があった方がわかりやすいので個人的にはいつもこういう風に書いています。
制御文の後ろ1行は「{}」を省略しても良いルールがあるので、両方同じ意味になるんですが、断然パターン2の方がループの範囲がわかりやすいので親切ではないかなと思います。

で、肝心要の処理内容はこうなっています。

とりあえずループ回数はlimit回数文だけ回ります。

で「i]という変数が0から開始されて「i++」でループが一周されるたびに1加算されます。

iが0から始まっているので、最新のMA値をiMA関数(移動平均線)から取得して、TempBufferに代入しています。

なので、ここでしている事はTempBufferに移動平均線の値をセットしているだけです。

※iMA()の中に書かれている数字はパラメータで、MAの設定値です。

52~56行目はBearsの処理内容です。
同じ足の安値から移動平均線の値を引いているだけです。

つまり大きいヒゲが出た時にBearsが大きく動くわけですね!

って言葉で書いてもわかりにくいので、表形式で仮データをはめ込んでトレースしてみます。

処理回数 i Low TempBuffer BearsBuffer
1 0 100 90 10
2 1 90 85 5
3 2 70 80 -10

って感じになります。

書いてみるとやっぱりコードの説明を言葉でするのって難しいw

かなりごちゃごちゃになっているので、またこの記事を修正してみやすいようにしていきます。

とりあえず今日はこの辺にしておきます<(_ _)>