ナンピンマーチン的な手法で使うことがあるかも
ナンピンマーチンを使ったトレードでは、仕掛け価格ごとにロット数が異なることになります。
一方で、複数の仕掛け価格が存在する時、トータルでプラスになったら纏めて全ポジションを決済するようなケースが存在します。
この「トータルでプラスになったら」という条件を判定するためには、平均約定価格を計算するのが一般的ですね。
ロット数が均一な場合の平均約定価格は、全ての約定価格を足してポジション数で割れば算出できることは誰でも想像つくでしょう。
では、各ポジションでロット数が異なる場合の平均約定価格はどうやって算出すればいいでしょうか?
その答えは以下の加重平均約定価格の式です。
ここで、iはポジションのNo(i番目)を、nはポジションの数を表しています。
謎の記号はシグマ記号で、総和を意味します。i=1~n番目のポジションについてシグマの右側の要素を足していくことになります。
MQL4で加重平均約定価格を計算する関数のソースコードはこんな感じになります。
01 | //+------------------------------------------------------------------+ |
02 | //|【関数】加重平均約定価格を計算する | |
03 | //| | |
04 | //|【引数】 IN OUT 引数名 説明 | |
05 | //| --------------------------------------------------------- | |
06 | //| ○ aMagic マジックナンバー | |
07 | //| | |
08 | //|【戻値】加重平均約定価格 | |
09 | //| | |
10 | //|【備考】なし | |
11 | //+------------------------------------------------------------------+ |
12 | double averageEntryPrice( int aMagic) |
13 | { |
14 | double sumPrice_x_Lot = 0.0; |
15 | double sumLot = 0.0; |
16 |
17 | for ( int i = 0; i < OrdersTotal(); i++){ |
18 | if (OrderSelect(i, SELECT_BY_POS) == false ){ |
19 | break ; |
20 | } |
21 |
22 | if (OrderSymbol() != Symbol() || OrderMagicNumber() != aMagic){ |
23 | continue ; |
24 | } |
25 |
26 | sumPrice_x_Lot += NormalizeDouble(OrderOpenPrice(), Digits) * OrderLots(); |
27 | sumLot += OrderLots(); |
28 | } |
29 |
30 | // ゼロ割り防止 |
31 | if (sumLot == 0.0){ |
32 | return (0.0); |
33 | } else { |
34 | return (NormalizeDouble(sumPrice_x_Lot / sumLot, Digits)); |
35 | } |
36 | } |
すごくシンプルですが、パワフルな関数です。ゼロ割り防止がポイントでしょうか。良かったらお使いください。