潤奈流EA講座③(OnInit,OnTick,OnDeinit関数)

EA講座

どうも潤奈です( ・Д・)
このEA講座は完全初心者には少し難しいかもしれません。
確かに対象イメージは自作EAを作ろうとして書籍を読んで見たけど途中で挫折した。裁量でやって来たけど、自分の手法をEA化して検証するスキルが欲しい。など、ちょっと経験している方を対象にしていますのでご了承下さい( ・Д・)

では参考コードEAについて解説して行きたいと思います!

え?それどこにあるの?という方は次の記事から読み進めて下さい。
潤奈流EA講座①(参考コードと構成説明)
それ以降の記事はこちら。
潤奈流EA講座②(プロパティとパラメーター)

OnInit関数

OnInit()はEAを導入時に一度だけ動き、{ }で閉じた中のプログラムが動きます。
ここでは簡単な説明だけになりますが、
PipsにAdjustPoint関数の返り値(計算した値)を代入します。
SLPにAdjustSlippage関数の返り値(計算した値)を代入します。

Pips変数とSLP変数は前記事の「プログラム全体に関わる変数」で宣言して予め用意している為、ここではdobule型やint型は宣言しません。

 

この2つの関数はオリジナル関数で内容はまた後で説明しますが、ここでの書き方の説明として( )で囲んでいるのは、このオリジナル関数にこの( )に入れた値を使って計算して下さい。という様な意味になります。

ではこの( )に入れている変数ですが、

_Symbol:現在のチャートの銘柄名が格納されています。例)USDJPY
Slippage:パラメーター設定時に宣言して数値を格納している変数です。

つまり、AdjustPoint関数は銘柄名(例 USDJPY)を使って計算をして下さい。AdjustSlippage関数は銘柄名(例 USDJPY)と宣言したSlippage変数を使って計算をして下さい。という事になります。

最後にreturnというのは( )で囲んだ値を出力するという意味になります。
INIT_SUCCEEDEDは初期化成功という意味ですので、初期化成功しましたよ~って意味ですね。ここは定型文みたいな物です。

OnTick関数

ここはメインロジックになりますが、私はここをスッキリさせるのが好きです。
何故かというと、ここに全てのロジックを書いてしまうと後から見返した時に見にくいからです。
イメージとしては、一つの部屋に全ての物が置いてある状態から用途別のBoxに整理してしまうような感じですかね。

 

では、それぞれの処理毎に説明して行きますね( ・Д・)

まずvoid OnTick(){ を書いてその中にメインロジックを入力して行きます。
このOnTick関数はティック受信、つまり値が変動する度に動くプログラムという事を覚えておいて下さい。
なのでかなり処理が多いプログラムや、無駄な処理が多いプログラム(例えばローソク足確定時だけに必要なプログラムだったり、1回計算したら必要ないプログラムなど)は出来るだけ減らしましょう。

まぁ~今回の参考コードも無駄な処理がありますが、この程度であれば動作に問題ありません( ・Д・)

次に、

これはTrailingStop()という関数を作成しています。オリジナル関数のトレーリングストップの処理に飛ぶことが出来ます。

さて少し寄り道ですが、ここで少し疑問が出る方がいらっしゃると思います。

「前のAdjustPoint関数の時と書き方が違う・・・」

そうですね。ここはTrailingStop()という関数しか書いてありません。
ここではTrailingStop関数の詳細はまだ説明しませんが、違いとしては計算した結果を返して欲しいか、計算処理だけして欲しいかの違いです。

AdjustPoint関数の計算結果は今後も利用したいので、Pips変数に値を代入しています。
TrailingStop関数は現在値を追いかけるように損切値を変更処理をして欲しいだけで、計算結果は必要ないのでTrailingStop関数のみの記述となっています。

では続いて、

これはエントリーしている買いと売りポジションがあるかを確認しています。
Position関数を作成しており、(  )に1を入れると買いポジション、-1を入れると売りポジションの数を計算するようにプログラムを書いています。
その計算して取得した数をint型で宣言したBuyPosition変数とSellPosition変数の中に代入するようになります。

もう処理の流れは分かりますよね( ・Д・)

では次、

エントリー条件として、パーフェクトオーダーになっているかをPerfectOrder関数というオリジナル関数で確認します。
この関数は買いのパーフェクトオーダーだと1を返して、売りだと-1、エントリー条件外だと0を返すようにしており、その値をEntry変数に代入します。

if関数は( )内の条件に当てはまったら右側もしくは{ }で囲んだ中のプログラムを処理するようになります。
上側だとBuyPosition==0(買いポジションが0)でEntry==1(買いのエントリー条件を満たしている)場合はOpenOrder(1)(買いの注文を入れる)という内容になります。

OpenOrder関数は1を使ってプログラムを動かすと買いエントリー、-1で売りエントリーを行うオリジナル関数です。

if関数についてもう少し説明しますと、if(条件){条件と一致すれば処理をする} となり、その条件の設定方法ですが、同じは=ではなく、==です。複数条件の一致の場合は&&を間に使用します。
ちなみに複数条件の内どれか1つの条件であれば、間に|を2本使って||を使用します。(キーボードの場所で言うとBackSpaceの左隣りです)

処理内容を{ }で閉じるとありますが、省略する事が出来ます。

以下は同じ処理の意味になります。

では次、

まず上のクローズ判定では、if関数を利用して、BuyPosition!=0(買いポジションが0ではない)とPerfectClose(1)==1(買いのパーフェクトオーダー条件が崩れている)場合はCloseOrder(1)(買いの決済を入れる)という内容です。

まずif関数の符号で!=は「~ではない」という意味になりますので、0ではない。つまりここでの条件は買いポジションがある。という条件です。
では何故符号を==で1にしないかと言うと、例えば複数ポジションを持つようにロジックを変えたら1では対応出来ないからです。

次にPerfectClose関数はオリジナル関数で、パーフェクトオーダーが崩れたかどうかを判断する関数になります。買い条件が崩れたら1、売り条件が崩れたら-1を返すようにしています。

そして買いポジションが0ではない(ポジションがある)かつ、買いパーフェクトオーダー条件が崩れているから、CloseOrder関数で買いポジションを手仕舞いするとなります。

CloseOrder関数は1を使ってプログラムを動かすと買い手仕舞い、-1で売り手仕舞いを行うオリジナル関数です。

最後に、

プログラム全体を{ }で囲うのを忘れないように!
間に沢山のプログラム文が入るので、予め{ }は最初に書いておき、//を使ってコメント文でどの{ }かを記述するようにしています。

ここで沢山オリジナル関数が出てきましたが、オリジナル関数についてはまた別の記事で説明しますのでお待ち下さい( ・Д・)

OnDeinit関数

この中にはEAを閉じる時に動くプログラムを記入します。
ここでは入力しませんが、例えばチャート上に線を表示するインジケーターがあったとして、ここに線を削除する。というプログラムを書いていないと、インジケーターを削除しても線がチャート上に残ってしまう。といった事が発生します。
ただし、プログラムの書き方によっては他の必要な線も削除してしまうリスクがありますので、そこはしっかり確認しておく必要があります。その辺りの話は他で・・・

今日はこの辺りで。
では( ・Д・)

次の記事「潤奈流EA講座④(オリジナル関数とは,AdjustPoint関数,AdjustSlippage関数)

コメント

  1. […] え?それどこにあるの?という方は次の記事から読み進めて下さい。 潤奈流EA講座①(参考コードと構成説明) それ以降の記事はこちら。 潤奈流EA講座②(プロパティとパラメーター) 潤奈流EA講座③(OnInit,OnTick,OnDeinit関数) […]

タイトルとURLをコピーしました