トレーリングストップとは?
トレーリングストップとは
保有しているポジションが想定している方向に動き始めたとき、最初に設定している損切り価格を、(利益を確保できる方向に)変更する一連の処理
のことを指します。
簡単に言えば、
買いポジションだったら損切価格を引き上げる、
売りポジションだったら損切価格を引き下げる、
ということになります。
相場が、自分の想定している方向に動いていて一時期利益が出ていたのに、その後リミット(=利益確定価格)に到達する前に逆行して、結局ストップロスにかかり、損切になってしまった・・・
という事態を避けるために、相場が仮に逆行しても最低限の利益は確保しよう、という投資戦略に基づいた処理になります。
以前記事にした、ブレイクイーブン処理↓
にも似ているんですが、ブレイクイーブンはストップロスの変更が一度だけなのに対し、トレーリングストップがその後も相場の伸長が続く場合に、それに追随するにストップロスを引き上げていく
ような回路を組み込むことが多いです。
単純な価格の上下動にあわせるのではなく、
例えば
直近高安値や
一目均衡表の雲、
パラボリック・・・等に連動した、より相場観の王道に準じた動的トレーリングストップを作成することも可能です。
(私も実運用では↑のような決済回路を組み込んでいます)
今回はより、シンプルなトレーリングストップの記述を作っていきたいと思います。
シンプルトレーリングストップのロードマップ
以下の手順でコードを記述していきます
- 標準ライブラリのトレードファイルをインクルードし、CTradeクラスのオブジェクトを宣言
- OnTick()内に必要な値の取得、発注回路、トレーリングストップ命令を記述
- グローバル領域にトレーリングストップ関数を定義
標準ライブラリのトレードファイルをインクルードし、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)
サンプルコードの挙動は以下のようになります。
最後までお読みいただきありがとうございました<(_ _)>
★注意再掲:ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座でお試しいただくようお願いします。コード内に発注記述が入っています。
リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。
詳しくは免責事項をご確認ください。
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
コメント