トレーリングストップ関数(オリジナル関数)スタンダード

オリジナル関数

どうも潤奈です( ゚Д゚)
今回はトレーリングストップの動作をさせる為のオリジナル関数を紹介します。

オリジナル関数って?という方はこちらのEA講座でオリジナル関数の説明をしていますので覗いてみて下さい( ゚Д゚)

スポンサーリンク

コード全文

トレーリングストップで使用している変数は以下の4つです。

トレーリングストップのコードは以下の通りです。

コード説明

使用する変数の用意

まず以下2つはEAのパラメーター設定の時に設定をして下さい。

次にグローバル変数として宣言します。グローバル変数とは関数の外で宣言している変数の事を言い、プログラム全体で使用できるようになります。

このままでは値が入っていないので、OnInit()関数内で必要な値を入れておきます。

AdjustPoint()関数は冒頭の「オリジナル関数とは?」の記事に記述があるのでそちらを参照してください。

StopL変数に入れている数値は、各FX業者や通貨ペアによって決められている「指値や逆指値注文を行う際に、最低限現在の価格から離れていなければいけない価格差」のことです。
これはストップロス値を変更する際に、現在価格に近すぎるとエラーが連発するのを防ぐために使用します。

例えば、MarketInfo()関数で取得したドル円のストップレベルが50の場合で_Point=0.001だと50×0.001=0.05 となり、現在価格132.775の場合132.725~132.825間にはストップロス値などを設定出来ないので、それを回避する為に使用します。

トレーリングストップ本文の説明

まずvoid型のTrailingStop関数を宣言します。

次にトレーリングストップ値を入れるTSP変数をdouble型で宣言し、注文変更を指示するOrderModify()関数の戻り値を入れるres変数をtrue(真)で宣言します。

for文で現在保持している総ポジション数をループ処理で、該当するポジションを探します。

for文の中にこのコードを記述します。上から、if文で確認して問題があれば下の処理をスキップして次のループ処理へ進みます(continue)。
1行目は、正しくポジションを取得出来なかったら→次のポジションへ
2行目は、対象のマジックナンバーでなければ→次のポジションへ
3行目は、対象の通貨ペアでなければ→次のポジションへ
この3つの条件をクリアして、取得出来たポジションで、対象のマジックナンバーで、対象の通貨ペアのポジションのみ下のコードへ進めます。

if文とelse if文で買いか売りのポジションか判断してトレーリングストップの計算を行います。

売値からトレーリングストップ値を引いた価格をTSP変数に入れます。

例えば、Bid=134.163 TrailingPips=20 Pips=0.01の場合
134.163-20*0.01=133.963となります。

3つの条件をif文で確認します。
①OrderOpenPrice()<TSP:エントリー価格よりトレーリングストップ値が上にあるか
②OrderStopLoss()+_Point*0.5<TSP:現在のストップロス値よりトレーリングストップ値が更新されたか
③StopL<Bid-TSP:トレーリングストップ値がストップレベル値より売値から離れているか

②の「_Point*0.5」の意味(売りの条件式で説明)
OrderStopLoss()>TSPの条件式だけでも、問題ないように思えますがMQL4内部の小数点数の誤差によって、同じ値でも条件式が成立してOrderModifyしようとする時があります。
・OrderStopLoss()=134.100
・TSP=134.100 
 という値でも実際は、
・OrderStopLoss()=134.1000000000000002
・TSP=134.1000000000000000
 というような小数点数の誤差によって、OrderStopLoss()>TSPという条件式が成立してしまい、結果的に同じ値でOrderModify処理に進んでしまい、OrderModify error 1が発生してしまいます。

_Point=0.001として、0.001×0.5=0.0005という価格に影響しない値を使用する事でエラーを回避させます。

買い:OrderStopLoss()+_Point*0.5<TSP
売り:OrderStopLoss()-_Point*0.5>TSP

OrderModify()関数には戻り値は処理が成功した場合はtrueで、失敗した場合はfalseを返します。

【OrderModify:エントリー中の注文や保留中の注文の変更】
bool OrderModify(チケット番号、注文価格、ストップロス価格、リミット価格、有効期限、色)

次は売りの説明です。

買値からトレーリングストップ値を足した価格をTSP変数に入れます。

売りの方は3つの条件ともしくは、2つの条件をif文で確認します。
①OrderOpenPrice()>TSP:エントリー価格よりトレーリングストップ値が下にあるか
②OrderStopLoss()-_Point*0.5>TSP:現在のストップロス値よりトレーリングストップ値が更新されたか
③StopL<TSP-Ask:トレーリングストップ値がストップレベル値より買値から離れているか

もしくは、

④OrderStopLoss()==0:ストップロス値を0に設定している
⑤StopL<TSP-Ask:これは③と同じ条件です

何故買いと条件が違うのかというと、条件②でOrderStopLoss()が0だと、TSP値より大きくなる事がないので、ストップロス値が0の時に注文変更が出来る条件を追加しています。

OrderModify()関数には戻り値は処理が成功した場合はtrueで、失敗した場合はfalseを返します。

res変数がfalseの場合は、失敗したという事なのでif文でGetLastError()でエラーコードを取得してPrint関数でプリントさせます。

まとめ

いかがでしたでしょうか。
恐らく一番スタンダードなトレーリングストップのコードになります。

エラー回避の為にちょっと複雑になっていますが、必要なものだと思います。

あ、使う時はメインロジックのどこかにTrailingStop(); と記述して使用して下さい。

では、少しでも参考になれば( ゚Д゚)

コメント

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