見出し画像

MT4 平均建値ラインを引くインジケータ コピペOK 複数の異なるLOT用

どうも@ひろぽんと申します。Pythonで仮想通貨弄ってましたが、最近はMT4でインジやEA作ってます。


今回は、複数のLotが異なるポジションを持った時の、平均建値が分かるインジケータを作成しました。


例えば、

・102円 で 1Lot の ロングポジション
・101.5円 で 2Lot の ロングポジション
・101円 で 4Lot の ロングポジション

みたいに複数のポジションを持つ場合、平均建値がいくらか計算する必要があります。


上記の場合だと、

( 102 x 1 + 101.5 x 2 + 101 x 4 ) / ( 1 + 2 + 4) = 101.285...

となり、この101.28以上であれば含み益状態、101.28以下であれば含み損状態です。


現在、ナンピン手法を検証中です。



この買い下がりや売り上がりを行うナンピン注文の時こそ、複数ポジションの平均建値がどのあたりか知りたいんですよね。ってことで作ってみました。


平均建値を自動表示するインジケータのコード

コードの中身はこんな感じです。

#property indicator_chart_window

// パラメータとしてラインの色を指定できます。
extern color tateneColor = clrAqua;

// 利確と損切のラインを表示するならtrueに、要らないならfalse
extern bool rikaku_sonkiri = false;

// 利確、損切ラインの色とPips
extern color rikakuColor = clrLightGreen;
extern color sonkiriColor = clrLightPink;
extern double rikakuPips = 50;   //Pips
extern double sonkiriPips = 20;  //Pips


double _digit = Digits()==3 ? 0.01 : 0.0001;
double RP,SP;

// 初期化関数
int OnInit()
{
  // 利確、損切までのPipsを通貨ペアに合わせる
  RP = rikakuPips * _digit;
  SP = sonkiriPips * _digit;

  // 平均建値の水平線
  ObjectCreate("heikinTatene"+string(Symbol()), OBJ_HLINE, 0, 0, 0);

  // 利確、損切の水平線を表示する場合に反映
  if(rikaku_sonkiri==true)
  {
     ObjectCreate("heikinTateneTP"+string(Symbol()), OBJ_HLINE, 0, 0, 0);
     ObjectCreate("heikinTateneSL"+string(Symbol()), OBJ_HLINE, 0, 0, 0);
  }
  return(INIT_SUCCEEDED);
}


// インジケータ削除でラインを消します。
void OnDeinit(const int reason)
{
  ObjectsDeleteAll(0,"heikinTatene");
}


// Tickごとに再計算
int OnCalculate(const int rates_total,
               const int prev_calculated,
               const datetime &time[],
               const double &open[],
               const double &high[],
               const double &low[],
               const double &close[],
               const long &tick_volume[],
               const long &volume[],
               const int &spread[])
{

  // 変数設定
  double Price=0;
  double Lots=0;
  double TP,SL;
  bool BuySell;

  // インジケータを入れたチャートにポジションがある場合
  if(OrdersTotal()>0)
  {
     for(int i=OrdersTotal()-1; i>=0; i--)
     {
        // 上記に示したような計算を行う部分
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
        {
           Price += OrderOpenPrice() * OrderLots();
           Lots += OrderLots();
           if(OrderType()==OP_BUY) BuySell=true;
           if(OrderType()==OP_SELL) BuySell=false;
        }
     }
     Price = Price/Lots;
     
     // 利確、損切のラインを示す場合に反映
     if(rikaku_sonkiri==true)
     {
        if(BuySell==true)
        {
           TP = Price + RP;
           SL = Price - SP;
        }
  
        if(BuySell==false)
        {
           TP = Price - RP;
           SL = Price + SP;
        }
     }
  }
  
  // 平均建値ラインの色と価格を設定
  ObjectSet("heikinTatene"+string(Symbol()), OBJPROP_COLOR, tateneColor);
  ObjectSet("heikinTatene"+string(Symbol()), OBJPROP_PRICE1, Price);

  if(rikaku_sonkiri==true)
  {
     ObjectSet("heikinTateneTP"+string(Symbol()), OBJPROP_COLOR, rikakuColor);
     ObjectSet("heikinTateneTP"+string(Symbol()), OBJPROP_PRICE1, TP);
  
     ObjectSet("heikinTateneSL"+string(Symbol()), OBJPROP_COLOR, sonkiriColor);
     ObjectSet("heikinTateneSL"+string(Symbol()), OBJPROP_PRICE1, SL);
  }
  return(rates_total);
}

* 両建てには対応していません。


平均建値ラインインジケータの使い方

画像1

上記のチャートは買い下がりでいくつかの買い注文を保有している状態です。ポジションサイズは一定ではなく、下がるほどに多くしているので平均建値も複雑になります。


ここで、平均建値インジケータを放り込みます。


画像2

平均建値のラインだけが必要なら、rikaku_sonkiriはfalseのままでOKです。


画像3

水色のラインが保有ポジションの平均建値のラインです。上記のチャートの場合、110.694が平均建値です。

この平均建値よりCloseが上なら含み益状態、Closeが下なら含み損状態。つまり、上記は。。。含み損状態です。。。


画像4

利確、損切のラインを表示させたい場合は、rikaku_sonkiriをtrueにしてください。rikakuPipsで利確までのPipsを、sonkiriPipsで損切までのPipsを指定できます。


画像5

利確幅50Pips、損切幅20Pipsとした場合、黄緑色の111.194のラインが利確ライン、ピンクの110.494ラインが損切ラインです。


これに関しては、トレードで使うなら、平均建値から直近高値、安値までの距離がそれぞれ何対何になるのか見れた方が実用的かなと思ってます。


例えば、買いポジションの平均建値が110.5円の時、直近高値が111.5円で直近安値が110円ならば、高値まで(利確まで)の距離が1円で安値まで(損切まで)の距離が0.5円。つまり、損切:利確が0.5:1みたいな。

このあたりはもう少し考えてみます。


コードの内容に関しては。。。

今回紹介したコードに関して、説明しようかなとも思ったのですが、コードの中の注釈で十分かなって思ったので、やめときます。


分からなかったらツイッターで聞いてください。@ひろぽん


自動売買の検証に関しては、また報告します。
ここまで読んでいただきありがとうございます。

この記事が気に入ったらサポートをしてみませんか?