どうも潤奈です( ・Д・)
このEA講座は完全初心者には少し難しいかもしれません。
確かに対象イメージは自作EAを作ろうとして書籍を読んで見たけど途中で挫折した。裁量でやって来たけど、自分の手法をEA化して検証するスキルが欲しい。など、ちょっと経験している方を対象にしていますのでご了承下さい( ・Д・)
では参考コードEAについて解説して行きたいと思います!
え?それどこにあるの?という方は次の記事から読み進めて下さい。
潤奈流EA講座①(参考コードと構成説明)
それ以降の記事はこちら。
潤奈流EA講座②(プロパティとパラメーター)
OnInit関数
1 2 3 4 5 6 7 |
int OnInit(){ //EA導入時に一度だけ動くプログラム Pips=AdjustPoint(_Symbol); SLP=AdjustSlippage(_Symbol,Slippage); return(INIT_SUCCEEDED); } |
Pips変数とSLP変数は前記事の「プログラム全体に関わる変数」で宣言して予め用意している為、ここではdobule型やint型は宣言しません。
ではこの( )に入れている変数ですが、
Slippage:パラメーター設定時に宣言して数値を格納している変数です。
つまり、AdjustPoint関数は銘柄名(例 USDJPY)を使って計算をして下さい。AdjustSlippage関数は銘柄名(例 USDJPY)と宣言したSlippage変数を使って計算をして下さい。という事になります。
OnTick関数
1 |
void OnTick(){ //ティック受信する度に動くプログラム |
まずvoid OnTick(){ を書いてその中にメインロジックを入力して行きます。
このOnTick関数はティック受信、つまり値が変動する度に動くプログラムという事を覚えておいて下さい。
なのでかなり処理が多いプログラムや、無駄な処理が多いプログラム(例えばローソク足確定時だけに必要なプログラムだったり、1回計算したら必要ないプログラムなど)は出来るだけ減らしましょう。
まぁ~今回の参考コードも無駄な処理がありますが、この程度であれば動作に問題ありません( ・Д・)
次に、
1 2 |
//トレーリングストップ TrailingStop(); |
これはTrailingStop()という関数を作成しています。オリジナル関数のトレーリングストップの処理に飛ぶことが出来ます。
さて少し寄り道ですが、ここで少し疑問が出る方がいらっしゃると思います。
「前のAdjustPoint関数の時と書き方が違う・・・」
そうですね。ここはTrailingStop()という関数しか書いてありません。
ここではTrailingStop関数の詳細はまだ説明しませんが、違いとしては計算した結果を返して欲しいか、計算処理だけして欲しいかの違いです。
AdjustPoint関数の計算結果は今後も利用したいので、Pips変数に値を代入しています。
TrailingStop関数は現在値を追いかけるように損切値を変更処理をして欲しいだけで、計算結果は必要ないのでTrailingStop関数のみの記述となっています。
では続いて、
1 2 3 |
//ポジション数を確認 int BuyPosition=Position(1); int SellPosition=Position(-1); |
もう処理の流れは分かりますよね( ・Д・)
では次、
1 2 3 4 |
//エントリー判定 int Entry=PerfectOrder(); if(BuyPosition==0 && Entry==1)OpenOrder(1); if(SellPosition==0 && Entry==-1)OpenOrder(-1); |
if関数についてもう少し説明しますと、if(条件){条件と一致すれば処理をする} となり、その条件の設定方法ですが、同じは=ではなく、==です。複数条件の一致の場合は&&を間に使用します。
ちなみに複数条件の内どれか1つの条件であれば、間に|を2本使って||を使用します。(キーボードの場所で言うとBackSpaceの左隣りです)
処理内容を{ }で閉じるとありますが、省略する事が出来ます。
以下は同じ処理の意味になります。
1 2 3 4 5 |
if(BuyPosition==0 && Entry==1)OpenOrder(1); if(BuyPosition==0 && Entry==1){ OpenOrder(1); } |
では次、
1 2 3 |
//クローズ判定 if(BuyPosition!=0 && PerfectClose(1)==1)CloseOrder(1); if(SellPosition!=0 && PerfectClose(-1)==-1)CloseOrder(-1); |
まず上のクローズ判定では、if関数を利用して、BuyPosition!=0(買いポジションが0ではない)とPerfectClose(1)==1(買いのパーフェクトオーダー条件が崩れている)場合はCloseOrder(1)(買いの決済を入れる)という内容です。
まずif関数の符号で!=は「~ではない」という意味になりますので、0ではない。つまりここでの条件は買いポジションがある。という条件です。
では何故符号を==で1にしないかと言うと、例えば複数ポジションを持つようにロジックを変えたら1では対応出来ないからです。
次にPerfectClose関数はオリジナル関数で、パーフェクトオーダーが崩れたかどうかを判断する関数になります。買い条件が崩れたら1、売り条件が崩れたら-1を返すようにしています。
そして買いポジションが0ではない(ポジションがある)かつ、買いパーフェクトオーダー条件が崩れているから、CloseOrder関数で買いポジションを手仕舞いするとなります。
CloseOrder関数は1を使ってプログラムを動かすと買い手仕舞い、-1で売り手仕舞いを行うオリジナル関数です。
最後に、
1 |
}//OnTick |
プログラム全体を{ }で囲うのを忘れないように!
間に沢山のプログラム文が入るので、予め{ }は最初に書いておき、//を使ってコメント文でどの{ }かを記述するようにしています。
ここで沢山オリジナル関数が出てきましたが、オリジナル関数についてはまた別の記事で説明しますのでお待ち下さい( ・Д・)
OnDeinit関数
1 2 3 |
void OnDeinit(const int reason){ //EA削除時に最後に動くプログラム } |
ここでは入力しませんが、例えばチャート上に線を表示するインジケーターがあったとして、ここに線を削除する。というプログラムを書いていないと、インジケーターを削除しても線がチャート上に残ってしまう。といった事が発生します。
今日はこの辺りで。
では( ・Д・)
コメント