トレーリングストップは、トレンド相場では本領発揮できますが、持ち合い相場には向いてません。
ここでは、既存のトレーリングストップ発動条件に加え、ボリンジャーバンドの±1σの幅も加味するようにしていきます。
今回は、前回記事【最大利益の半分で決済するEA】で作成したEAをカスタマイズしていきます。
EAカスタマイズ内容
前回作成したEAはタイトル通り利益が出ている状態でプラス決済になる値でトレーリングストップを発動させるという前提でカスタマイズしていきます。
もとのEAのコード確認
もとのEAのポジション保有時の処理部分は次の通りです。
// ポジション保有時の処理 -----------------------------
if (pos_ticket > 0)
{
if (OrderSelect(pos_ticket, SELECT_BY_TICKET) == false) return;
// トレーリングストップ
sl = NormalizeDouble(OrderStopLoss(), Digits);
if (Bid >= OrderOpenPrice() * (100 + TrailingStartPer) * 0.01)
{
ts = NormalizeDouble(OrderOpenPrice() + (Bid - OrderOpenPrice()) * TrailingStopPer * 0.01, Digits);
if (sl == 0 || sl < ts)
if (OrderModify(OrderTicket(), 0, ts, OrderTakeProfit(), 0, clrRed) == false)
Print("OrderModify error.");
}
}
パラメーター設置
ボリンジャーバンドの期間とトレーリングストップ発動を許可する±1σの価格に対する%を指定するパラメーターを追加します。
extern int BandsPeriod = 20; extern double BandsWidthPer = 0.5;
トレーリング発動前と発動後で条件を分ける
トレーリングストップを実行するのに最低限必要な条件は、次の条件文です。
if (Bid >= OrderOpenPrice() * (100 + TrailingStartPer) * 0.01)
上記条件文の{}括弧内で、トレーリングストップ発動前と発動後の条件を分けてコードを書いていきます。
それが次のコードです。
ts = NormalizeDouble(OrderOpenPrice() + (Bid - OrderOpenPrice()) * TrailingStopPer * 0.01, Digits);
bool trail_ok = false;
if (sl == 0 || sl < OrderOpenPrice()) // トレーリング発動前
{
double bb_u = iBands(NULL, 0, BandsPeriod, 1.0, 0, PRICE_CLOSE, MODE_UPPER, 0);
double bb_l = iBands(NULL, 0, BandsPeriod, 1.0, 0, PRICE_CLOSE, MODE_LOWER, 0);
if (bb_u - bb_l >= Bid * BandsWidthPer * 0.01) trail_ok = true;
}
else // トレーリング発動後
{
if (sl < ts) trail_ok = true;
}
if (trail_ok == true)
if (OrderModify(OrderTicket(), 0, ts, OrderTakeProfit(), 0, clrRed) == false)
Print("OrderModify error.");
まとめ
今回は、トレーリングストップを発動するための条件を追加しました。次回は、ポジションサイジングについて記事にしたいと思います。
では、また次回で^^







慶次さんはじめまして
メタトレーダをしらべていてこのブログをみつけました、これからも楽しみにしています!
たま
たまさん、はじめまして!
ご期待にこたえられるように
がんばります!
更新は、週1回程度とゆっくりなんですが
有益な記事を書いていきたいと思ってますので
よろしくお願いいたします!