プログラミングは、今まで経験したことがない人にとっては
敷居が高いと思われがちです。
もちろん、向き不向きもあるでしょう、
文系気質の人よりも理系気質の人の方が
すんなり理解できる部分も多いと思われます。
全く経験したことがない人は、
まずは言語は何でもよいので
プログラミングの初歩的な参考書を買って
その構造的な流れを理解しておくと、
本商材の理解度も深まるでしょう。
参考までに、
今回は商材のソースコードの一部を掲載し
各文が何を意味しているのか、
初心者でも分かるように、なるべく専門用語を使わずに
解説してみたいと思います。
以下の解説が理解できれば、
本商材のソースコード全般も理解できるはずです。
ソースコードの一部を解説
以下は本商材で学習の題材となっている
「SwingSystem_for_Dveloper」のソースコードの一部です。
この文は、どんなEAでも必ずと言っていいほど書かれている
定型文とも呼べる構文です。
この文を上から順番に解説していきます。
224行目⇒ for ( int i = OrdersTotal() – 1; i >= 0; i-- )
for()文は、指定した回数だけ処理を繰り返したいときに用いられます。
上記の構文では何をやっているのかというと、
現時点での注文数を取得して、その注文一つずつに対して
次に続く{ }内で囲まれた処理を繰り返し実行(ループ処理)しています。
for()文の書式は決まっていて、
for(条件式; 増減式)
{
処理内容
}
となっています。
要するに、変数に
その変数のもとで処理内容を実行します。
一通り処理が終わると、変数に増減式を実行します。
そのうえで、まだ条件式が満たされていたら
再度、その変数のもとで処理内容を実行します。
これを繰り返します。
以下、サンプルです。
for(int i = 1; i <= 5; i++) { Print("hello"); }
この場合、iという変数に1が入っています。
その状態で、Print(“hello”)が実行されます。
つまり、helloという文字が表示されます。
この処理を終えた後で、i++という増減式が実行されます。
i++というのは、iという変数に1を足す、という意味なので、
この増減式が実行されたのちは、iは2になっています。
そして、iが2という状態は、
条件式の i<=5 を満たしているので再びPrint("hello")が実行されます。
こうして条件式が満たされている間は、
何度も処理内容が実行されます(ループ処理)
上記サンプルでは、iが5以下の時はずっとループ処理が繰り返されることになるので、
iが1の時から5の時まで、合計5回処理内容が実行されるので、
helloという文字が5回表示されて終了、ということになります。
ここまでを踏まえたうえで
for ( int i = OrdersTotal() – 1; i >= 0; i-- )
この書式を眺めると、
OrdersTotal()は現在の注文数を取得する関数で、
注文数を変数iに入れています。
例えば、
現在ポジションを2つ持っていたらiに2が入りますし、
現在ポジションを3つ持っていたらiに3が入りますし、
現在ポジションを持っていなかったらiに0が入ります。
そして、増減式が i-- になっていますが、
i--というのは、iという変数に1を引く、という意味です。
そして、条件式が i>=0 になっていますが、
これは、iが0以上の時であれば処理内容を繰り返す、という意味です。
まとめると、
最初に注文数を取得して、処理を繰り返すごとに注文数を1ずつ減らし、
注文数が0になったらループを抜けて処理終了、
という意味になります。
226行目⇒ if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) break;
if()文は、()内の条件が満たされた時に、続く構文を実行します。
上記の構文では何をやっているのかというと、
注文が選択できなければ(false)、for()文を抜ける(break)ようにしています。
ここでは、if()文自体よりも()の中身の方が難しいので、
先にそちらを解説します。
OrderSelect( i, SELECT_BY_POS, MODE_TRADES )
これは、注文を選択する関数でお決まり文です。
iには注文数が入っていることは先に説明しましたが、
このお決まり文で、何番目の注文なのかを特定して、
その注文を選択している、ピックアップしているわけです。
例えば、iに3が入っていたら、注文数は3になり、
現在3つのポジションを持っていることになりますが、
その3つのポジションのどれについての処理を施すのか、
その一つ一つをここで特定しています。
そして、選択できたら(ポジションを特定できたら)trueが返り値になりますし、
選択できなかったら(ポジションが無かったら)falseが返り値になります。
つまり、
OrderSelect( i, SELECT_BY_POS, MODE_TRADES )がtrueなら
特定のポジションを選択できたので次に進めるが、
falseだったらbreakに進み、for()文全体から抜けることになります。
要するに、このif()文全体で何をやっているのかというと、
ポジションを選択できたら次の進むが、
ポジションが無かったら処理自体が終了
ということをしたいわけです。
227行目⇒ if ( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic1 )
ポジションを選択できたらこちらのif()文に移ります。
同じくif()文ですが、
ここでは選択したポジションの通貨ペアとマジックナンバーが
同じかどうかを判定しています。
OrderSymbol()には選択したポジションの通貨ペアが入りますし、
Symbol()にはEAを設定した通貨ペアが入ります。
そして、
OrderMagicNumber()には選択したポジションのマジックナンバーが入りますし、
Magic1は外部パラメーターで指定したマジックナンバーです。
要するに、通貨ペアとマジックナンバーで
選択したポジションが本EAのものかどうかを確認しているわけです。
一つのMT4には様々な通貨ペアの様々なマジックナンバーのEAが稼働しています。
その中から、処理を施したいポジションを特定するために、
このような構文が必要になるんですね。
229行目⇒ if ( OrderType() == OP_BUY )
またしてもif()文ですが今度は簡単です。
ここでは選択したポジションが、
買いポジションなのかどうかを確認しています。
OrderType()は予約語で、選択したポジションの種類が入り、
OP_BUYは買い注文を示す定数です。
つまり、選択したポジションが買い注文なら、
次の{ }内の処理に移行します。
231行目⇒ Buy_position1++;
ここでようやく具体的な処理になります。
今までのfor()文やif()文は、条件の絞り込み、
ポジションの絞り込みのみで、
まだ何も処理を施していないことを確認してください。
で、実際に何をしているのかというと、
Buy_position1という変数に1を足しています。
これがやりたかったんですね。
これは先に説明した i++ と同じです。
243行目⇒ if ( OrderType() == OP_SELL )
こちらはもう説明するまでもないですが、
選択したポジションが、売りポジションなのかどうかを確認しています。
236行目⇒ Sell_position1++;
売りポジションであれば、
Sell_position1という変数に1を足しています。
以上、これで一連の流れの説明を終わります。
最終的には、
Buy_position1には買いのポジション数が
Sell_position1には売りのポジション数が入ることになります。
例えば、本EAが現在、
ロング2ポジ、ショート1ポジ持っていたとすると、
この一連の流れを通した後には、
Buy_position1には2が入り、Sell_position1には1が入ります。
そして、240行目以降の次の構文に続いていきます。
いかがだったでしょうか。
思った以上に説明が長くなってしまいましたが、
上記が理解できるなら、本商材のソースコードは理解できると思いますよ。
あなただけのオリジナルのEAを作ってみませんか?
→EAプログラミングセミナーの詳細レビューへ