スポンサーリンク
ホーム » EA制作お役立ち記事 » 【MQL5】5分で書ける、シンプルなトレーリングストップ
a

【MQL5】5分で書ける、シンプルなトレーリングストップ

EA制作お役立ち記事
スポンサーリンク

※【おススメのMT5MQL5対応のFX業者】

MQL5にて開発した、MT5EAを実運用するにあたり、

当サイトでは以下のFX業者をおススメいたします。

外為ファイネスト

アヴァトレードジャパン

フィリップ証券

スポンサーリンク

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

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

保有しているポジションが想定している方向に動き始めたとき、最初に設定している損切り価格を、(利益を確保できる方向に)変更する一連の処理

のことを指します。

簡単に言えば、

買いポジションだったら損切価格を引き上げる

売りポジションだったら損切価格を引き下げる

ということになります。

相場が、自分の想定している方向に動いていて一時期利益が出ていたのに、その後リミット(=利益確定価格)に到達する前に逆行して、結局ストップロスにかかり、損切になってしまった・・・

という事態を避けるために、相場が仮に逆行しても最低限の利益は確保しよう、という投資戦略に基づいた処理になります。

以前記事にした、ブレイクイーブンストップ処理↓

にも似ているんですが、ブレイクイーブンストップはストップロスの変更が一度だけなのに対し、トレーリングストップがその後も相場の伸長が続く場合に、それに追随するにストップロスを引き上げていく

ような回路を組み込むことが多いです。

単純な価格の上下動にあわせるのではなく、

例えば

直近高安値や

一目均衡表の雲、

パラボリック・・・等に連動した、より相場観の王道に準じた動的トレーリングストップを作成することも可能です。

(私も実運用では↑のような決済回路を組み込んでいます)

今回はより、シンプルなトレーリングストップの記述を作っていきたいと思います。

スポンサーリンク

シンプルトレーリングストップのロードマップ

以下の手順でコードを記述していきます

スポンサーリンク

標準ライブラリのトレードファイルをインクルードし、CTradeクラスのオブジェクトを宣言

発注回路をOnTick()関数内に簡単に組み込むために、Trade.mqhをインクルードして、CTradeクラスのオブジェクトを生成します。

#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする

CTrade trade;
// CTradeクラスのオブジェクトを宣言

スポンサーリンク

OnTick()内に必要な値の取得、発注回路、トレーリングストップ命令を記述

OnTick()関数に必要な値の取得、発注回路、トレーリングストップ命令を記述していきます。

トレーリングストップの挙動を確認するためなので、発注条件は超テキトーです(笑)

トレーリングストップを実行する関数はこのままだと、コンパイルエラーになってしまうのでこの後定義していきます。

void OnTick()
  {
//---
      //現在値(買い)情報の取得と正規化
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

      //買い注文回路
      if(PositionsTotal()<2)
      {
         trade.Buy(0.1,NULL,Ask,Ask-1000*_Point,Ask+500*_Point,NULL);
         
      }//if(PositionsTotal()<2)
      
      //トレーリングストップ命令
      TrailingStop(Ask);
     
  }//void OnTick()

★注意:↑のソースコードには発注回路が含まれています。

ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、

デモ口座お試しいただくようお願いします。

スポンサーリンク

グローバル領域にトレーリングストップ関数を定義

この関数では、トレーリングストップの執行基準を

現在設定されているストップロス値と、変更予定のストップロス価格との比較

のみにおいています。

つまり、まだポジション損益がマイナスな状態でも発動します。

普通は「このぐらい利益が出たら発動する最低限の価格」等を発動条件に設けるのが一般的かと思いますが、今回はシンプルさを優先しました。<(_ _)>

//トレーリングストップ関数の定義
void TrailingStop(double Ask)
{
   //トレーリングストップ基準値の取得と正規化
   double SL=NormalizeDouble(Ask-150*_Point,Digits());
   
   //ポジションプールを直近から古い方に向かってチェック
   for(int i=PositionsTotal()-1;i>=0;i--)
   {
      //通貨ペア情報の取得
      string symbol=PositionGetSymbol(i);
      
            if(_Symbol==symbol)//通貨ペアチェック
            {
               //チケット番号情報を取得し変数に格納
               ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
               
               //現在のストップロス値情報を取得し変数に格納
               double CurrentStopLoss=PositionGetDouble(POSITION_SL);
               
               //現在のストップロス値がトレーリングストップ基準値より小さければ
               if(CurrentStopLoss<SL)
               {
                  //ストップロスの修正注文を出す
                  trade.PositionModify(PositionTicket,CurrentStopLoss+10*_Point,0);
               }//id(CurrentStopLoss<SL)
               
            }//if(_Symbol==symbol)
      
   }//for(int i=PositionsTotal()-1;i>=0;i--)
   
}//void TrailingStop(double Ask)

スポンサーリンク

全体のプログラムコード

全体のプログラムコードは以下のようになります。

トレーリングストップは興味深いテーマだと思っていますので、今後も取り上げていきたいと思っています。

#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property strict 
//+-----------------------------

//標準ライブラリーのトレードファイルを使えるようにする
#include <Trade\Trade.mqh>

// CTradeクラスのインスタンスを宣言
CTrade trade;

void OnTick()
  {
//---
      //現在値(買い)情報の取得と正規化
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

      //買い注文回路
      if(PositionsTotal()<2)
      {
         trade.Buy(0.1,NULL,Ask,Ask-1000*_Point,Ask+500*_Point,NULL);
         
      }//if(PositionsTotal()<2)
      
      //トレーリングストップ命令
      TrailingStop(Ask);
     
  }//void OnTick()
//+------------------------------------------------------------------+

//トレーリングストップ関数の定義
void TrailingStop(double Ask)
{
   //トレーリングストップ基準値の取得と正規化
   double SL=NormalizeDouble(Ask-150*_Point,Digits());
   
   //ポジションプールを直近から古い方に向かってチェック
   for(int i=PositionsTotal()-1;i>=0;i--)
   {
      //通貨ペア情報の取得
      string symbol=PositionGetSymbol(i);
      
            if(_Symbol==symbol)//通貨ペアチェック
            {
               //チケット番号情報を取得し変数に格納
               ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
               
               //現在のストップロス値情報を取得し変数に格納
               double CurrentStopLoss=PositionGetDouble(POSITION_SL);
               
               //現在のストップロス値がトレーリングストップ基準値より小さければ
               if(CurrentStopLoss<SL)
               {
                  //ストップロスの修正注文を出す
                  trade.PositionModify(PositionTicket,CurrentStopLoss+10*_Point,0);
               }//id(CurrentStopLoss<SL)
               
            }//if(_Symbol==symbol)
      
   }//for(int i=PositionsTotal()-1;i>=0;i--)
   
}//void TrailingStop(double Ask)

サンプルコードの挙動は以下のようになります。

トレーリングストップについてのコード記述については、以下の講座記事でも解説を行っていますので是非参考にしていただければ幸いです。

今回は以上とさせていただきます。

最後までお読みいただきありがとうございました<(_ _)>

★注意再掲:ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、

デモ口座でお試しいただくようお願いします。コード内に発注記述が入っています

リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。

詳しくは免責事項をご確認ください。

※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる

<MQL5でEAを作ろう講座>

をメインコンテンツとして展開しています。

【言語基礎編】

【中級実際にEAを作ろう編】

【発展編・MT5用EAを作る工程をカスタマイズしていく】

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

———————————————————————————-

※【おススメのMT5MQL5対応のFX業者】

外為ファイネストに関する記事は↓をご覧ください。

アヴァトレードジャパンに関する記事は↓をご覧ください。

フィリップ証券に関する記事は↓をご覧ください。

関連用語リンク集

MQL5FX関連の用語リンク集です。
当サイトでは、元々わからない言葉や概念に出くわしたら、すぐその言葉に立ち戻れるよう、かなり細かく内部リンクを張り巡らせており、多様な用語を網羅しています。

興味のある内容に直接アクセスし、疑問の解決にお役立ていただければと思います。

スポンサーリンク
EA制作お役立ち記事
スポンサーリンク
シェアする
エムキューエルをフォローする
スポンサーリンク
【超入門】MQL5 でEAを作ろうブログ

コメント

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