EAを作ろう:構造を理解しておくことが大事だよってことにも触れました
さて前回は、初期設定の部分に触れました。
そして構造を理解しておくことが大事だよってことにも触れましたが
もう一つ以前も書いた気もしますが^^;
// EA、インジケーターをセットしてから1度だけ実行される範囲
int init() {
return (0);
}
// Tickが動く度に実行される範囲
int start(){
return (0);
}
// EA、インジケーターを削除したときに実行される範囲
int deinit() {
return (0);
}
※Build600から変更点あり
この3つのお作法も覚えておく必要があります。
これは、基本になりますので覚えておきましょう。
なのでinit(){} などは、初期設定で利用することも多いですね。
start(){} 関数内がTick毎に命令が実行されるので今日はこの辺りの話をしていきます。
前回使った構造を振り返ってみましょう。
今回のTickは、赤い枠ないのことを主に行います。
ポジション管理 → ポジション決済 → ポジションエントリー
この辺りのプログラミングを見ていきます。
サンプルの
BlondeTrader.mq4
こちらのソースコードを見てみましょう。
//+——————————————————————+
//| Start function |
//+——————————————————————+
void start()
{
//—- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//—- calculate open orders by current symbol
if(OrdersTotal()==0) CheckForOpen();
else CheckForClose();
//—-
}
たったこれだけです^^;
簡単に見ていきますと
//—- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
まずここのコードですが、
Barsこれは、チャート上のバーの数が返ってきます。
Barsの数が <(小さい) 100 小さかったら return する。
つまり、今回のTickの実行を終了するということです。
なんでこれが必要かというと、多くのEAは、インジケーターを使ってエントリー条件にしているケースがあります。チャートの中にBars数が100より少ない場合があります。MT4を立ち上げたばかりの状態では、価格Dataが無いケースでは、Dataがそもそも欠落しているのでインジケーターの数値がおかしなものが返ってくることがあります。
おかしな数値で誤動作してポジションエントリーなんて悲しいことも十分起こりうるのでこのようなコードを書いておくと安心ですね。
IsTradeAllowed()==false
これは、「エキスパートがトレードを許可されて、トレードのスレッドが占有されていない場合は、TRUE を返し、そうでない場合は、FALSE を返します。」とリファレンスを見ると書いてあります。
FALSEが返ってきてトレード出来ない場合は、Strat関数をしないということですね。
これで無駄なプログラムの巡回が少なくなるので効率的な構造になっているんですね。
次を見てみましょう
//—- calculate open orders by current symbol
if(OrdersTotal()==0) CheckForOpen();
else CheckForClose();
if文ですね。これは、EAを作るときには、避けられないといってもいい命令なので覚えてくださいね。
if( A ) B else C;
これは、if文が Aの条件が整えば Bを実行 もしそれ以外なら Cを実行という意味です。
CheckForOpen(); と CheckForClose(); コードがあります。これは、オリジナルの呼び出し関数です。
Start(){} 関数内で、ポジション管理などのコードを記述することも可能なのですが、呼び出し型にしておくと非常に便利なことがります^^;
次にまた別のEAを作ろうという時に、使い回し出来るからです。今回のサンプルEAは、その目的ではないようですが、これを活用できるようになると1つのEAを作るのに1時間も時間が掛からなくなったりもしますよ。(勝てるかどうかは、別ですが、、、、)
話を戻して、コードを日本語で書くと
if(OrdersTotal()==0) CheckForOpen(); else CheckForClose();
ポジションが無かったら(0だったら) ↑これを呼出し ↑それ以外は、こっち呼出し
こんな感じですね。
恐らく
CheckForOpen(); そのままですが、エントリー命令がこの先にあるような気がします。^^;
CheckForClose(); 決済命令があるような気がしますよね。
OrdersTotal() は、MT4内のオープンポジション(保有中のポジション)数を返してくれる命令文なので、これってシンプルですがポジション管理の部分を担っています。
呼出し関数の先は、後ほどみますが、それぞれがポジションエントリーと決済命令があるので先ほど上げたプログラムの構造が全て満たされているのが分かると思います。
次は、CheckForOpen(); とCheckForClose(); の呼出し先を詳しくみていきましょう。
written by fxtomo