しばしば、「Trailing Stop(以下TS)を自作のEAに追加する方法が知りたい」というご質問を受けることがあります。筆者は、MT Studio21の一員でもありますので、同機能を付加する際にはMT5への対応を考えなくてはなりません。そのために、結構複雑な関数を用意しているのですが、ここではMT4 EAのための関数を記してみたいと思います。MT4には、便利な関数群が用意されていますが、TSに関する関数は存在しません。MT4画面から手動により個別に設定できるため、特に必要と判断されていないのかもしれません。
まず、パラメータに「TS機能を利用するか否か」の選択をするフラッグを用意します。この例では、input bool UseTrailingStop = false; としています。デフォルトの設定は、原則TS機能は使わないことになっています。もし利用したい場合は、falseをtrueとすればTS機能利用することを選択することになります。
下記の例は、ライブラリーを利用しない一般的なコーディング例です。EA作成時には、そのまま使えると思います。この例では、関数SetTrailingStop( )はOnTick()終了の後で定義されていますが、外部パラメータの上や下で定義されても結構です。EAのフォーマットの最後に記載し、メモ化しておくと、実際に利用する際にはメモを外すだけで使うことができます。
// 外部パラメータ
sinput int Magic = 123;
input bool UseTrailingStop = false;
input double TSPips = 15;
//
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(UseTrailingStop == true) SetTrailingStop(TSPips, Magic);
}
//+------------------------------------------------------------------+
void SetTrailingStop(double tspips, int magic)
{
if(_Digits == 3 || _Digits == 5) tspips *= 10;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) == false) break;
if(OrderSymbol() != _Symbol || OrderMagicNumber() != magic) continue;
if(OrderType() == OP_BUY)
{
double newsl = Bid - tspips*Point;
if(newsl >= OrderOpenPrice() && newsl > OrderStopLoss()){
int ticket = OrderModify(OrderTicket(), 0, newsl, 0, magic);}
break;
}
if(OrderType() == OP_SELL)
{
double newsl = Ask + tspips*Point;
if(newsl <= OrderOpenPrice() && (newsl < OrderStopLoss() || OrderStopLoss() == 0)){
int ticket = OrderModify(OrderTicket(), 0, newsl, 0, magic);}
break;
}
}
}
※コメント投稿者のブログIDはブログ作成者のみに通知されます