次は繰り返し処理を行なう方法です。10回書いてもいいですが、このようにfor()を使うと楽にできます。*}*の行が10回繰り返し実行されます。i=0をセットします。i<10なら、{}の処理を行いなさい。i<10なら{}の処理を行いなさい。(以下、23のくりかえし)」こんな感じです。)となり、*のPrint文が実行されます。)なので、*のPrint文が実行されます。i=2、3、4・・・と繰り返していって、iが9の時、*のPrint文を実行したあと最初に戻り、i++をすると、iは10になります。条件を満たさなくなるので、forの処理は終了です。i=0からi=9まで合計10回、処理が行なわれるわけです。この実行結果を見ると分かりやすいと思います。「forの後」となります。入れ子式にすることもできます。・・・I=9,J=9end応用として、このようにするとティック更新の度に、直近10足分の始値が出力されます。前の足の始値を得るものです。Open[0]は現在の足、Open[1]なら一つ前の足の始値になります。Open[i]);のiを下のように(9-i)に変えます。Open[i]);}}のように、繰り返しのたびにiを減らしていくように、for文を変更するといいでしょう。条件分岐プログラミングに欠かせない処理、条件分岐を練習してみましょう。「こういう状態なら○○の処理を、そうでないならxxの処理を実行せよ」というふうに、条件に応じて処理内容を変えるものです。mq4ではif()を使います。else{Print("NG");2}}if()は「もし()内の条件が真ならば、そのあとの{}内の処理を行い、偽ならば、else以下の処理を行え」というものです。1なら1の処理を行い、iが1以外なら2の処理を行ないます。iには1を代入していますので、1が実行されて「OK」が出力されます。i==1と「=」が二つ並んでいることに注意してください。=を一個だけにしているとエラーが出ます。==は比較演算子と呼ばれるもので、両辺の値を比較するための記号です。Cというふうに書きます。この場合、A=2、B=2、C=1ならば真、A=2、B=2、C=3ならば偽になります。(Shift+¥キーで出る「|」を2つ)です。真A=2,B=2,C=3は真、A=2,B=3,C=1も真、A=2,B=2,C=1も真です。A=2,B=1,C=3は偽になります。()でくくればさらに複雑な条件を調べることが出来ます。DAがBと等しくてCより大きい、または、AがDより小さいなら真A=2、B=2、C=1、D=3ならば真、A=2、B=2、C=3、D=1の場合も真、A=2、B=2、C=3、D=3は偽になります。真や偽のときの処理が一行で終わる場合には{}を省略することが出来ます。Print("NG");入れ子式に使うこともできます。i");偽の場合に何もしないのなら、elseは省略できます。前回のコードに少し手を加えてこのようにしてみました。結果はどうなるでしょうか。;Print(mojiretsu);return(0);}結果は「i=1」、「i=2」、、、となります。太字の部分で、変数mojiretsuには文字列「i=」にiの値をくっつけたものが代入されているからです。*ここではわざわざ変数を使っていますが、print()内に直接入れてしまっても構いません。Print("i="+i);数値同士の場合は、その計算結果が表示されます。i,j;i=1;j=2;Print(i+j);//結果「3」が表示されるつまり、「文字列+文字列」や「文字列+数値」は文字列になり、「数値+数値」は数値になります。i,j;i=1;j=2;Print("i+j="+i+j);結果は「i+j=12」になります。これはまず文字列"i+j="+数値iが行なわれて文字列"i+j=1"になり、続いて文字列"i+j=1"+数値jが行なわれるからです。プログラム内では算数の演算と同じ優先順位があります。)内が最優先、次が*(掛ける)や/(割る)、そのあとで+や-、という順番です。);とすると、i*jの部分が先に計算されますので、結果は「i*j=2」になります。練習2-1変数についてさらに練習してみましょう。その前に気をつけておくことがあります。予約語とかぶらないように気をつけてください。エディタで入力した時に色が変わって表示されるものは、システム上ですでに予約されている単語なので、新たな変数名としては使えません。一部の小文字を大文字に変えるなどして無理やり使い分けることもできますが、おすすめはしません。変数をつかった次のプログラムを見てください。終了}前回までのHello.mq4とほとんど同じですね。これはティックが更新されるたびに「0」と表示されます。変数iは宣言をしただけで、何も代入していません。何も値を入れていない変数の中身は0になります。(stringの場合は空っぽの状態(=NULL)になります)これに少し手を加えます。iに代入する」という意味です。「iの値を1増やす」と考えるほうが自然でしょうか。ここではiは0+1で1になります。いうふうに省略して書くことができます。i=i+1ならi++というようにです。i--というのもあって、これはi=i-1のことです。これもi=i+1の意味ですが、最後の数字を変えればi=i+2や3などの代わりにもできます。/=、などもできます。*=3はi=i*3の意味です。プログラムに戻ります。この場合の結果は毎回「1」が表示されます。start(){~}の中で宣言された変数は毎回、リセットされてしまうからです。リセットされて0になっているところへ1を足したものが出力されるので結果は常に1です。回数を重ねるごとに数を増やしていきたい場合はどうすればいいでしょうか?実はこんなふうに、変数の宣言をstart(){~}の外に出してしまえばいいのです。終了}これで変数iがリセットされることはなくなりますので、1,2,3,4と、毎回値が1ずつ増えていくようになります。このように変数の値を保存しておきたいものは、start()の外で宣言するようにしてください。トラックバック2005年11月16日コンパイル時エラーの対処方法mql4プログラムをコンパイルした時に出てくるエラーの見方です。エラーメッセージは左側にエラー内容、右側にエラーが発生した場所が記されています。1)発生場所の()内は行数と文字数を表します。この例だと2行目の1文字目に問題があることになります。現在のカーソル位置(行数、文字数)がエディタ画面の右下に出ているので、それを見ながらエラー箇所に移動し、修正します。主なエラーと対処方法をざっとあげてみます。defined変数が宣言されていません。}をどこかに書き忘れています。エラー発生場所はプログラムの最後になっていますが、実際にはどこか途中で足りない部分があるのでプログラム全体を見直す必要があります。)をどこかに書き忘れています。エラー発生場所はプログラムの最後になっていますが、実際にはどこか途中で足りない部分があるのでプログラム全体を見直す必要があります。セミコロンが抜けています。指定行前後の行末を確認。unexpected;セミコロンが変なところにあります。count関数のパラメータ数が足りません。use=の使い方が間違っています。練習1-4つづいて、変数の使い方を練習してみましょう。World";//1Print(printstring);//2と置き換えてみます。World」と表示されることになります。Print("printstring")ではないことに注意して下さい。World」ではなく「printstring」という文字列が表示されることになります。プログラム全体を見て見ましょう。上に書いたように置き換えるとこのようになります。World";Print(printstring);return(0);}しかし、このままだとエラーが出てきます。printstringというのは私が勝手に名づけた変数です。ルールのところでも書いていますが、そういう自分で作った変数は、使う前に必ず「こういう変数を使います」ということを宣言しておかなくてはいけません。printstring;と最初に書いて、printstringは文字列変数です!と宣言します。World";Print(printstring);return(0);}次は変数の使い方をもう少し掘り下げてみましょう。World]では、これをベースにプログラミングをしてみましょう。World");この一文を3行目に入れてください。)は()内の値を画面に表示するものです。ティックの更新ごとに実行されるので、為替のレートが変わるたびに「HelloWorld」と表示が出るはずです。実際にどのようになるか見てみましょう。Complileボタンを押すと、プログラムファイルが上書き保存され、エラーがないかチェックされます。warning(s)」と表示され、完成です。MetaTraderボタンを押し、MT4の画面に戻ると、ExpertAdvisorsの中に「Hello」が追加されています。これをチャートにドラッグして適用します。trading」にチェックを入れてOK。Advisors」ボタンを押すとマークが変わり、エキスパートが実行開始します。TerminalウィンドウのExperts画面を開いてみてください。為替レートが変わるたびにHelloWorldという文字列が表示されるはずです。練習1-2[自動作成されるコードの内容]初めてみると何だかわけの分からないコードがずらずらと並んでいるように見えますが、内容は非常に単純です。//で始まる行はコメントなのでプログラムには直接関係しません。このコメント行と、空行を除くと、プログラムは以下のように4つに分けられます。start(){return(0);}たったこれだけです。1ヘッダーでは、パラメーターの定義やグローバル変数の宣言などを行ないます。意味がわからなければとりあえず読み飛ばしてください。内に書かれた処理は、このエキスパートプログラムをチャートに適用した時、最初に一回だけ実行されます。}は、エキスパートの使用を停止(チャートから削除)した時に最後に一回だけ実行されます。4ここがプログラムのメインです。ここに書かかれた処理は、チャートのデータが更新されるたびに実行されます。プログラム実行の流れはこのようになります。ティック更新ごとに繰り返し実行(自動売買のメイン)3チャートから削除した時に一回だけ実行ただ2、3の処理はどういう使い道があるのか、あまり思い浮かびません。不要な場合は削除してしまって構いません。link"~"もネットで配布したりしないのであれば不要です。start(){return(0);}とだけ書けばOKなのです。練習1-1【プログラム作成の練習】[準備]とりあえず実際にやってみましょう。MT4のMetaEditorボタンから、MetaEditorを開きます。Newボタンで新規プログラムを作成。どのタイプのプログラムにするか選択肢が表示されます。ここでは自動売買をするための「ExpertAdvisorProgram」を選びます。作成するプログラムの名前、作成者名などの入力欄があらわれますので、プログラム名を「Hello」、作者名は自分の名前を入れてください。下にパラメーター作成用の欄がありますが、今はそのままで「完了」ボタンを押します。これで「Hello.mq4」というプログラムが自動的に作成されます。自動的に作成されるのは単なる雛型だけなので、このままでは当然何も起こりません。この雛型をもとに、プログラムを追加していきましょう。