【MT5】MQLウィザードでトレーリングストップを実装してみる

MQLウィザードでトレーリングストップを実装 メタトレーダー5

ノンプログラミングで自動売買EAを作れるMQL5ウィザードですが、トレーリングストップが組み込めるようになっています。

以前の記事で取り上げたウィザードを使ってのプログラム作成では、プロフラムの簡略化のためにルンルンでスキップさせてもらいましたが、今の私はトレーリングストップのことが書きたくて書きたくて震えてます。

ということで、今回の記事ではトレーリングストップの実装について書きます。トレーリングストップが全人類が望んで止まない損小利大実現のための武器になる可能性、あると思います!

この記事で分かること
  • トレーリングストップの実装の仕方
  • 実装できるトレーリングストップの種類
  • トレーリングストップの発動条件
  • トレーリングストップのパラメータ

トレーリングストップとは

トレーリングストップとは、相場の価格の変動に合わせてストップロス(損切り)注文を動かしていく手法です。トレーリングは追従という意味です。

相場の動きに合わせて損切り注文を動かすことにより損失を抑えながら利益を伸ばしていくことで「損小利大」を実現しようとしています。うまく相場の流れに乗ることができれば、大きく利益を伸ばすことができます。

トレーリングストップの挙動
トレーリングストップの挙動

実装の仕方

ちょちょいのちょいで実装できるので、まずは実装の方法をお伝えします。

MQLウィザードの4番目の画面で「エキスパートアドバイザのトレーリングプロパティ」が出てきますので、お好みのトレーリングストップの方法を選択します。
これで実装完了です。

エキスパートアドバイザのトレーリングプロパティ
エキスパートアドバイザのトレーリングプロパティ
  • Trailing Stop not used
    トレーリングストップを使用しない
  • Trailing Stop based on fixed Stop Level
    固定幅に基づくトレーリングストップ
  • Trailing Stop based on MA
    移動平均に基づくトレーリングストップ
  • Trailing Stop based on Parabolic SAR
    パラボリックSARに基づくトレーリングストップ

トレーリングストップを使った決済方法

MQLウィザードでは、トレーリングストップでの決済が選択できるようになっています。その機能を活用することで「トレーリングストップのみ」「トレーリングストップ+利食い」の2つのパターンを構築できます。

  • トレーリングストップは、3種類の方法が選べます。(後で見ていきます)
  • トレーリングストップが発動するまでは固定の損切りを入れておくということも可能です。

トレーリングストップのみ

1つ目は、トレーリングストップのみを仕掛ける方法です。

相場の流れに乗ることができれば、想像を超える利益が転がり込んでくる可能性があります。

その一方、ここまで行けば利食いをしたいという価格まで達したにも関わらずそこから下落(売りの場合は上昇)した価格で決済されることがあります

トレーリングストップ+利食い

2つ目は、トレーリングストップにプラスして利食いも仕掛ける方法です。

この方法では、相場の流れに乗って利益を伸ばすという部分を取り入れながら、ここまで行けば利益を確定するというポイントを作ることができます

そうすることで目標価格に達した場合は、すぐに利益を確定できます。

固定幅でのトレーリングストップを利用すると利食いに対してもトレーリングを仕掛けることができます。

トレーリングストップの種類

次は、MQLウィザードを使って実装ができるトレーリングストップの種類を見ていきます。

もっとも単純な固定幅でストップロスの価格をずらしていく方法だけではなく、移動平均を使った方法、パラボリックSARを使った方法があります。

  • ストップロスの価格が変更されるのは、新しい足に移ったタイミングです。ティックの動きに応じての変更はありません。
  • パラメータは、決済に関連のあるパラメータのみを取り上げています。
  • トレーリングストップは、発動条件を満たしたときに初めて有効になります。発動するまでは、通常の損切りが有効になっています。

固定幅に基づくトレーリングストップ

これは至極単純な話で、買いポジションを持ったのちに足の終値が高値を更新(売りポジションの場合は安値を更新)すると指定した固定幅に合うようにストップロスを調整していく方法です。

勘違いしがちですが、高値の判断の対象となるのは足の終値です。その足の高値がいくら跳んでいようと足の終値に基づいてストップロスが調整されます。

パラメータ

  1. Stop Loss level (in points)
    新規注文の際の損切り(ストップロス)を指定します。
    0は損切りなしです。
  2. Take Profit level (in points)
    新規注文の際の利食い(テイクプロフィット)を指定します。
    0は利食いなしです。
  3. Stop Loss trailing level (in points)
    トレーリングストップを指定します。
    0はトレーリングストップなしです。
  4. Take Profit trailing level (in points)
    トレーリング利食い(テイクプロフィット)を指定します。
    0はトレーリングの利食いなしです。

Take Profit trailing level (in points)を設定すると足の終値が高値(買いポジションの場合)を更新すると、それに合わせてテイクプロフィットが調整されます。

高値を更新するたびに現在より値が設定されるので約定することがないのではと思ってましたが、その足内で達した場合に利食いが発動する仕組みになっていました。
※トレーリングストップでの指値/逆指値の変更は新しい足に移ったときのみ

ちなみにトレーリングプロフィットと言うとこちらの方が一般的なようです。

発動条件

発動条件をTrailingFixedPips.mphのソースコードから確認します。

ソースコードはメタエディターの寝ナビゲーターから選択します。
トレーリングストップ関連ファイルは「Include」→「Expert」→「Trailing」配下にあります。

買いポジションの場合
現在値(Bid)-損切り値>トレーリングストップの設定値×調整値

コード
m_symbol.Bid()-position.StopLoss()>m_stop_level*m_adjusted_point

position.StopLoss()(損切り値)が設定されてない場合は、position.PriceOpen()(買い値)が使われます。

売りポジションの場合
損切り値-現在値(Ask)>トレーリングストップの設定値×調整値

  • 損切りの設定がない場合は、ポジションの買値/売値が入ります。
  • 調整値は通貨ペアごとに違います。例えば、ドル円やユーロ円は0.01が入ります。
  • トレーリング利食いも同じ発動条件です。

移動平均に基づくトレーリングストップ

相場の変動に合わせて追ってくる移動平均でストップロスを調整していく方法です。

固定幅での指定では、相場が上下どちらにもあまり動かない膠着状態になった場合は決済されませんが、移動平均を使うことで膠着状態が続けば利食い(損切り)するようにできます。

パラメータ

  1. Stop Loss level (in points)
    新規注文の際の損切り(ストップロス)を指定します。
    0は損切りなしです。
  2. Take Profit level (in points)
    新規注文の際の利食い(テイクプロフィット)を指定します。
    0は利食いなしです。
  3. Period of MA
    移動平均指標の平均化の期間を指定します。
  4. Shift of MA
    移動平均指標をずらす(シフトする)幅を指定します。
  5. Method of averaging
    移動平均指標の平均化手法を4種類から指定します。
  6. Prices series
    移動平均指標を算出する価格を7種類から指定します。

移動平均の設定値について詳しくはこちらをご覧ください。

発動条件

発動条件をTrailingMA.mphのソースコードから確認します。

買いポジションの場合
以下の2つの条件が正になった場合にトレーリングストップが発動します。
・一本前の足の移動平均の値>損切り値
・一本前の足の移動平均の値<現在値(Bid)-発動バッファ

コード
m_MA.Main(1)>pos_sl && m_MA.Main(1)<m_symbol.Bid()-m_symbol.StopsLevel()*m_symbol.Point()

position.StopLoss()(損切り値)が設定されてない場合は、position.PriceOpen()(買い値)が使われます。

【発動バッファ】
発動バッファ(勝手に命名)は、トレーリングストップが買値のすぐ上で発動するのをさけるために入れられているバッファのようです。

コード
m_symbol.StopsLevel()*m_symbol.Point()

m_symbol.StopsLevel()m_symbol.Point()は、通貨ペアごとに設定されています。(どこで設定されているかまでは調べきれていません)

ドル円ユーロ円
m_symbol.StopsLevel()2030
m_symbol.Point()0.0010.001

どこで設定されているのかが分からない場合もprintfを使って操作ログに出力すると数値が確認できます。

売りポジションの場合
以下の2つの条件が正になった場合にトレーリングストップが発動します。
・一本前の足の移動平均の値+スプレッド<損切り値
・一本前の足の移動平均の値+スプレッド>現在値(Ask)+発動最低ライン

コード
m_MA.Main(1)+m_symbol.Spread()*m_symbol.Point()<pos_sl && m_MA.Main(1)+m_symbol.Spread()*m_symbol.Point()>m_symbol.Ask()+m_symbol.StopsLevel()*m_symbol.Point()

スプレッドが表れている点が買いポジションとの違いです。移動平均の値はBidなのでスプレッドを足して疑似的なAskの値を作っているようです。

パラボリックSARに基づくトレーリングストップ

パラボリックSARの位置でストップロスを調整していく方法です。

パラボリックSAR…私は不勉強なので存じ上げていませんでした。どれぐらいの知名度なのか分かりませんが、パラボリックSARってなんぞやについても書いておきます。

パラボリックSARとは、SAR(ストップ&リバースポイント)と呼ばれる点を用いたトレンドフォロー型の指標です。SARをつけないで「パラボリック」と表記されていることも多いです。

パラボリックSAR
パラボリックSAR
[出典:OANDA FXラボ]

【指標を見るうえでのポイント】

  • SARは上昇トレンドのときは価格の下に表示され、下降トレンドのときは価格の上に表示される(SARの表示されている位置でトレンドの状況を把握できる)
  • 突破すると反転の勢いが強まると予想される水準にSARが表示される
  • 価格がSARに到達するとSARの位置が上下入れ替わりトレンドが転換する

【SARの計算方法】
計算方法については一番わかりやすかったOANDAの記事をご確認ください。
※惜しむべくは「加速因子の加算」の部分が誤っている点です。加速因子の加算は、前の足で高値(上昇トレンド)もしくは安値(下降トレンド)を更新した場合にのみ行われます。

パラボリックSARを使った場合も、相場が膠着状態になった際に利食い(損切り)が発動します。

パラメータ

  1. Stop Loss level (in points)
    新規注文の際の損切り(ストップロス)を指定します。
    0は損切りなしです。
  2. Take Profit level (in points)
    新規注文の際の利食い(テイクプロフィット)を指定します。
    0は利食いなしです。
  3. Speed increment
    パラボリックSARの加速因子を指定します。
  4. Maximum rate
    加速因子の最大値を指定します。

発動条件

発動条件をTrailingParabolicSAR.mphのソースコードから確認します。

買いポジションの場合
以下の2つの条件が正になった場合にトレーリングストップが発動します。
・一本前の足のSARの値>損切り値
・一本前の足のSARの値<現在値(Bid)-発動バッファ

コード
m_sar.Main(1)>pos_sl && new_sl<m_symbol.Bid()-m_symbol.StopsLevel()*m_symbol.Point()

posposition.StopLoss()(損切り値)が設定されてない場合は、position.PriceOpen()(買い値)が使われます。

売りポジションの場合
以下の2つの条件が正になった場合にトレーリングストップが発動します。
・一本前の足のSARの値+スプレッド<損切り値
・一本前の足のSARの値+スプレッド>現在値(Ask)+発動最低ライン

コード
m_sar.Main(1)+m_symbol.Spread()*m_symbol.Point()<position.StopLoss() && m_sar.Main(1)+m_symbol.Spread()*m_symbol.Point()>m_symbol.Ask()+m_symbol.StopsLevel()*m_symbol.Point()

m_symbol.StopsLevel()m_symbol.Point()は、移動平均の場合と同じ値でした。(少なくともドル円、ユーロ円では)

移動平均EAに固定幅TSを組み込んで最適化

せっかくなので第二回で最適化した移動平均EAに固定幅トレーリングストップを組み込んだ新移動平均EAで勝負を挑んでみます。

バックテストの対象は前回と同じく、2019年のドル円1時間足チャートです。

最適化するパラメータ

最適化するパラメータは前回採用したパラメータを基本にトレーリングストップ用のStop Loss trailing level (in points)Take Profit trailing level (in points)を追加しました。

パラメータ開始値ステップ終了値
Price level to execute a deal-501050
Stop Loss level (in points)010100
Expiration of pending orders (in bars)015
Moving Average(12,0,…) Period of averaging5525
Moving Average(12,0,…) Time shift-313
Moving Average(12,0,…) Method of averagingSimpleLinear weighted
Stop Loss trailing level (in points)010100
Take Profit trailing level (in points)010100
  • トレーリングストップで波に乗るのを第一優先としTake Profit level (in points)は採用せず、0で固定としました。
  • シグナルでの決済を避けるためにSignal threshold value to close [0…100]は、100で固定としています。

結果発表

新移動平均の最適化結果だ!ドンッッッッ!!!!!

最適化結果
極細最適化結果[クリックして拡大]
残高推移グラフ
残高推移グラフ[クリックして拡大]
クノウ
クノウ

パラメータが増えたんだから順当な結果だろうよ

主要な項目を表にしてトレーリングストップなしとありの比較をしてみます。

項目移動平均EA新移動平均EA
総損益83,661138,405
総利益146,275177,172
総損失-62,614-38,767
取引数9333
最大 勝ちトレード6,13018,530
平均 勝ちトレード1,9508,437
最大 負けトレード-8,260-4,361
平均 負けトレード-3,479-3,231
ポジション最長保持時間60:16:26457:31:52
ポジション平均保持時間13:15:0892:33:08

最大 勝ちトレード、平均 勝ちトレード、最大 負けトレード、平均 負けトレードの数値を比べると損小利大を実現できたと小声で言える結果となっています。

また、取引数が約1/3となり、ポジションの保有時間が大きく伸びているのも大きな変化です。

あとがき

ちょっとくせが強かったですが、なんとかトレーリングストップも攻略できたような気になってます。トレーリングストップはティックで作動させたいと思うのは私だけなのでしょうか…。

トレーリングストップを実装して成績がかなり伸びましたが、そこには特に意味がありません。やりたいことをできるようになったというのが大切です。

MQLウィザードシリーズを3回記事化してちょっと詳しくなってきたような気がします。MT5の記事は超絶ニッチだということも発覚してますが、誰かの役にたつこともあるでしょう(と思い込むしかない)。

コメント

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