English Русский 中文 Español Deutsch Português
トレンド・ハント

トレンド・ハント

MetaTrader 4トレーディング | 16 3月 2016, 11:08
566 0
Eryomin Sergey
Eryomin Sergey

注意

本稿の情報は私の個人的観点によるものです。著者として、みなさんが本稿で述べられているアルゴリズムに従って行動するよう誘導するものではありません。また、本稿の情報を利用することで損失につながる可能性があることもご注意申しあげます。



はじめに

本稿では取引メソッド-利益トレードのボリューム蓄積、の説明をしています。私は、利益トレードのみが蓄積されると考えます。本稿はこれを実装する最適な方法について説明し、そのようなトレードを正しく実行するのに役立つ EA コードを入れています。



アルゴリズムのコンセプト

利益の出るトレードのボリュームを蓄積することで、われわれが出会う市場動向から私大利益を得ることができるのです。ただし、ボリュームはリスクを高めることにつながらないよう蓄積されるべきです。本稿では、そういったボリューム蓄積のアルゴリズムの一つについて説明します。

まず、参照ポイント-最初の主なトレード、が必要です。主要トレードは補助的トレードそれぞれより大きなボリュームである必要があります。主要トレードのボリュームが 0.2 ロット、補助トレードのボリュームが 0.1 ロットだとします。トレーリングストップロスは全トレードに適用され、たとえば50ポイントです。主要トレードの利益が +100 ポイントに到達すると、ストップロスは +50 となります。このとき、0.1 ロットのトレードは -50 ポイントのストップロスと共にオープンします。価格が戻った場合、どちらのトレードもストップロス注文によりクローズとなります。取得した利益は0.2ロットの50ポイントに等しく、損失は 0.1 ロットの ⁻50ポイントとなります。トータルで利益は0.1ロットの50ポイントとなります。これで損失保護は達成され、同時にトレードボリュームは増加します。

トレードが必要な方向で変動を続ければ、補助トレードの利益が +50 ポイントに到達すると、トレーリングストップが有効となります。主要トレードで利益が200ポイントに、補助取引で100ポイントに到達すると、補助トレードがもう一つオープンします。SL が再び -50 になります。等々。

このひじょうにシンプルな方法によりロット蓄積からよい利益を得ることができるのです。同時にリスクは最小限に抑えられます。実際、ここでのリスクは主要トレードの一部を失うだけです。すなわち、1番目の補助トレードが損失を出すリスクです。これは損失のリスクではありません。これは利益をフルに得ることのないリスクです。

標準的なトレーリング ストップ ロスにより利益がある場合のみトレーリング トレードを許可するのです。必要な利益を得る前にそれが補助トレードで行われると、ロット蓄積へのそのアプローチの利益性が高まります。MQL4 の手段で補助注文をオープンするのを最適化するのと同様、これを行うことができます。



実装

この目的で書かれた Expert Advisor は記事『快適なスキャルピング』で述べられている EA を基にしています。本稿では、EA は関数を組み合わせています。それはトレーナーゲームとトレードオープン用ツールの役目を果たします。このトレードのためにゲーム関数は削除しました。よってはチャートに矢印を2本描きます。上矢印と下矢印です。そのうち片方を削除することは、必要な方向でトレードをオープンする合図です。たとえば、下向き矢印を削除すると、上向き矢印がチャートに残ります。にとって、これは「買い」注文を出し、買いのストップ注文数を設定する合図です。

ここでは成行注文がメインの注文です。指値注文は主要オーダーより小さいロットの補助オーダーの関数を持ちます。補助トレードのオープンの『頻度』とその量を計算するには、2つの考え方が使われます。第1には、最終目標である、テイクプロフィットです。それは全注文(主要、補助)に対して等しくなっています。2番目は、未決注文をオープンするステップです。最終目標によって、EA は現行価格とテイクプロフィットレベルの間隔で注文をいくつ出すか計算します。

たとえば、400ポイントのテイクプロフィットを使い、オーダーオープンのステップが100ポイント(デフォルトで)だとすると、「買い」でオーダーが4件オープンすることとなります。最初のは「アスク」価格での「買い」で、主要オーダーです。次のものは、アスク+100ポイントでの補助的な「買いストップ」です。3番目のものは、アスク+200ポイントでの補助的な「売りストップ」です。4番目のものは、アスク+300ポイントでの補助的な「買いストップ」です。全注文に対するテイクプロフィットはアスク+400ポイントに等しくなります。すなわち、1番目の注文に対しては400ポイント、2番目に対しては300ポイント、3番目に対しては200ポイント、 番目に対しては100ポイントとなります。

主要トレードに対するトレーリング ストップ ロス は、必要な利益を得た場合(デフォルトでは 50 ポイント)のみ作用します。補助トレードについては、オープンの瞬間から作用します(すなわち、ストップロスは損失領域をひきずられます)。トレーリングストップの損失レベルはすべてのトレードと等しくなっています。また、トレーリングストップロスは補助トレードに対するストップロスレベルです。

主要オーダーがクローズしたら、残りの未決注文は削除されます。その後、2本の矢印はチャート上でふたたび下向きとなります。これは EA がトレードを再度オープンするすばやさを示します。

これはすべて長いように思えますが、実際には簡単に実装することができます。EA コードを分析します。

//+------------------------------------------------------------------+
//|                                                   take_trend.mq4 |
//|                                       Copyright © 2008, FXRaider |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, FXRaider"
extern int gap=20;            //level at which arrows are placed 
extern int TP=400;            //Take Profit level
extern int SL=0;              //Stop Loss level
extern double Lots1=0.2;      //lot of a main trade
extern double Lots2=0.1;      //lot of auxiliary trades 
extern int slippage=2;        //level of acceptable requote
extern int MagicNumber1=5345; //magic number of the main trade
extern int MagicNumber2=4365; //magic number of auxiliary trades
extern int Open_Step=100;     //step for opening auxiliary trades
 
extern bool UseTrailing = true; //enabling/disabling T-SL
extern int TrailingStop = 50;   //Trailing Stop Loss level
extern int TrailingStep = 1;    //Trailing Stop Loss step
int start()
  {
//------------------------------       
//+----------------------------------------------------------------------------------------------+
//|                              searching open orders for a pair                                |
    int pos_sell=0;
  for (int i_op_sell=OrdersTotal()-1; i_op_sell>=0; i_op_sell--)
  {
   if (!OrderSelect(i_op_sell,SELECT_BY_POS,MODE_TRADES)) break;
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1
   &&(OrderType()==OP_SELL))
   {
    pos_sell=1; break;
   }
  }
    
    int pos_buy=0;
  for (int i_op_buy=OrdersTotal()-1; i_op_buy>=0; i_op_buy--)
  {
   if (!OrderSelect(i_op_buy,SELECT_BY_POS,MODE_TRADES)) break;
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1
   &&(OrderType()==OP_BUY))
   {
    pos_buy=1; break;
   }
  }    
//|                              searching open orders for a pair                                |
//+----------------------------------------------------------------------------------------------+  
//+------------------------------------------------------------------------------------+
//|                                 working with objects                               |  
 
//+----------------------------------------------------------+
//|                    deleting objects                      | 
  if(iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))>0
     ||ObjectGet("down",OBJPROP_PRICE1)!=Open[0]-gap*Point)
    {
     ObjectDelete("down");
    }
  if(iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))>0
    ||ObjectGet("up",OBJPROP_PRICE1)!=Open[0]+gap*Point)
    {
     ObjectDelete("up");
    } 
//|                    deleting objects                      |   
//+----------------------------------------------------------+ 
 
//+----------------------------------------------------------+
//|                   drawing objects                        |   
   if((ObjectFind("down") != 0&&ObjectFind("up") != 0) //if no objects
   &&!pos_sell&&!pos_buy)                              //if no open orders
   {
     ObjectCreate("down", OBJ_ARROW, 0, Time[0], Open[0]-gap*Point); //draw a down arrow
     ObjectSet("down", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("down", OBJPROP_ARROWCODE, 234);
     ObjectSet("down", OBJPROP_COLOR, Red);
 
     ObjectCreate("up", OBJ_ARROW, 0, Time[0], Open[0]+gap*Point); //draw an up arrow
     ObjectSet("up", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("up", OBJPROP_ARROWCODE, 233);
     ObjectSet("up", OBJPROP_COLOR, Blue);
   }    
//|                   drawing objects                        |
//+----------------------------------------------------------+   
      
//|                                 working with objects                               |   
//+------------------------------------------------------------------------------------+
 



//+----------------------------------------------------------------------------------------------+ 
//|                                deleting unnecessary orders                                   | 
int cnt_del; 
if(pos_buy==0)
{
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++)
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;
    if(OrderSymbol()==Symbol())
    {
     if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket());
    }
  }
 }
 
if(pos_sell==0)
{
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++)
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;
    if(OrderSymbol()==Symbol())
    {
    if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket());
    }
  }
 }  
//|                                deleting unnecessary orders                                   |
//+----------------------------------------------------------------------------------------------+  
 

//+------------------------------------------------------------------------------------+ 
//|                                   opening trades                                   |
double sl_buy, sl_sell;
 if(!SL)
 {
  sl_buy=0;
  sl_sell=0;
 }
 else
 {
  sl_buy=Ask-SL*Point;
  sl_sell=Bid+SL*Point;
 }
 int stop_positions=MathFloor(TP/Open_Step-1);
 int i, open_step_2;
  if(
     ObjectGet("up", OBJPROP_PRICE1)==Open[0]+gap*Point
     &&iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))==0
     &&ObjectFind("down") != 0
     &&ObjectFind("up") == 0
     &&!pos_buy
     )
     {
      OrderSend(Symbol(),OP_BUY, Lots1,Ask,slippage,sl_buy,Ask+TP*Point,"take_trend",MagicNumber1,0,Blue);
      for(i=stop_positions;i>=0; i--)
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_BUYSTOP, Lots2,
       Ask+open_step_2*Point,slippage,
       0,Ask+TP*Point,"take_trend",MagicNumber2,0,Blue);
      }
     }
  if(
     ObjectGet("down", OBJPROP_PRICE1)==Open[0]-gap*Point
     &&iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))==0
     &&ObjectFind("up") != 0
     &&ObjectFind("down") == 0
     &&!pos_sell
     )
     {
      OrderSend(Symbol(),OP_SELL, Lots1,Bid,slippage,sl_sell,Bid-TP*Point,"take_trend",MagicNumber1,0,Red);
      for(i=stop_positions;i>=0; i--)
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_SELLSTOP, Lots2,
       Bid-open_step_2*Point,slippage,
       0,Bid-TP*Point,"take_trend",MagicNumber2,0,Red);
      }
     }
//|                                   opening trades                                   |  
//+------------------------------------------------------------------------------------+   
 

//+-------------------------------------------------------------------------------------------------+ 
//|                                      trail of open orders                                       |
if (UseTrailing)
{
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
//|                                      trail of open orders                                       |
//+-------------------------------------------------------------------------------------------------+
     
   return(0);
  }
//+------------------------------------------------------------------+

コードには必要なコメントがすべて入っています。

変数:

gap -矢印が設定されるレベル
TP -テイクプロフィットレベル
SL -ストップロスレベル
Lots1 -主要トレードのロット
Lots2 -補助トレードのロット
slippage -許容できる再クオートレベル
MagicNumber1 -主要トレードのマジックナンバーマジックナンバー
MagicNumber2 -補助トレードのマジックナンバーマジックナンバー
Open_Step -補助トレードオープン用ステップ


UseTrailing -T-SL の有効化/無効化
TrailingStop -トレーリングストップ ロスレベル
TrailingStep -トレーリングストップ ロス ステップ

Expert Advisor がチャートにアタッチされるとき、2本の矢印を描きます。

残りの矢印は次のろうそく足までチャートに残ります。

矢印の一方が削除されるとすぐに、EA はトレードをオープンします。

残りの矢印はスクリーンショットに表示されていないのがわかります。それは前に描かれたもので、次のろうそく足で削除され、全トレードがクローズされるまでやじるつぃは表示されないのです。最初のトレードの利益が必要なレベルに到達するとすぐに、T-SL が動作を始めます(つねに補助トレードに対して動作します)。例では、ロールバックで採捕のトレードだけがクローズされています。これと共に、その他すべてのオーダーが削除されます。

おわりに

結論として、私はトレーリングストップロスレベル、テイクプロフィット、補助トレードオープンレベルはペアそれぞれに個別に選択するべきであることを付け足してお伝えしたいと思います。また、効率的に使用するため、補助トレードオープンレベルは T-SLレベルより大きくなければならないことに注意が必要です。主要トレードでは、補助トレードよりも大きなロットサイズにすることをお薦めします。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1515

添付されたファイル |
take_trend.mq4 (8.22 KB)
ターミナルサービスクライアントどのようにポケットPCをBig Brotherの相棒にするか ターミナルサービスクライアントどのようにポケットPCをBig Brotherの相棒にするか
この記事は、MT4クライアントターミナルのインストールされたリモートPCにPDAを経由し接続する方法を紹介します。
T. Demark のアプローチを考慮したトレンドラインインディケータ T. Demark のアプローチを考慮したトレンドラインインディケータ
インディケータは市場における最近のイベントを表示してトレンドラインを示します。インディケータは推奨事項とテクニカル分析を考察する Thomas Demark の手法を考慮して作成されます。インディケータは、トレンドの一番最後の方向と最後から2番目の逆方向を表示します。
ZUP - ペサベントパターンのZigZag パート2 ZUP - ペサベントパターンのZigZag パート2
ZUP - ペサベントパターンのZigZag パート2 - 組み込みツールの詳細
MQL におけるオブジェクト・アプローチ MQL におけるオブジェクト・アプローチ
本稿はまず MQL 環境で作業を行う初心者プログラマ、プロのプログラマー両方にとって興味深いものとなります。また、本稿が環境開発者や観念論者に読まれると、役に立つと思われます。というのも、ここで分析される疑問は将来 MetaTrader や MQL を実装する上でのプロジェクトとなりうるからです。