【MAE:最大逆行幅 MFE:最大順行幅】ゴールド(金)FXのトレード反省【VBAマクロで分析】
MyFxBookに登録しておけば、MAE MFEが簡単に表示できると思っていたら、ゴールド(Gold)は対象外??ということで、自己流で分析してみようと思いました。
現状、負けがこんでいるので、こうなるとヤバいという参考になると思います。
MAE MFEについて
- MFE Maximum Favorable Excursion:最大順行幅
- MAE Maximum Adverse Excursion:最大逆行幅
のことである。MFEは最大含み益、MAEは最大含み損ということ。わたしはナンピン癖があるので、複数ポジションが総合して、口座を吹き飛ばしている訳だが、それでも、どのくらいで助からないのか・・・分析してみたいと考えた。
1分足データとトレード履歴
5分足のトレードでも、1分単位でエントリエグジットをしているわけで、1分足データを対象とする必要がある。1分足データは幾つか存在するが、最も手っ取り早く、MT4のヒストリカルデータを用いることとした。トレード履歴は、MT4から簡単に出力。
解析用VBAの準備(ガチ素人でも頑張る)
MT4のトレード履歴と1分足データを照らし合わせる下記VBAマクロで解析した。めちゃくちゃ時間がかかるので、PCが止まったか心配にさせてくれるマクロである、細かいチェックはしていない。また、解析結果を見ると、一部誤差が生じているので注意が必要。1分足データの始・終・高・安の値の平均を、その時間の価格として用いているが、1分以内に終了したトレードや、大幅に値動きがあった場合、特に誤差が生じている様子。素人はこれが限界。とりあえずのトレード反省用としては、出力結果はおおむね(多分)問題なさそうである。
Sub test()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim sec60 As Double
Dim posi_value_close, posi_value_open, MF, MB As Double
Dim trade_min, trade_max, bar_min, bar_max, bar_day_yoko, bar_time_yoko, bar_daytime_yoko, bar_close_yoko, bar_height_yoko, bar_low_yoko, bar_start, bar_posi_yoko As Long
Dim trade_ent_time, trade_exit_time, trade_buysell_yoko As Long
Dim posi_open, posi_close, write_yoko As Long
Dim if_buy, if_sell As String
Dim MF_time, MB_time As Double
Dim i, trade, deci As Long
Dim own_wb As Workbook
Dim trade_ws, bar_ws As Worksheet
Set own_wb = ThisWorkbook
Set trade_ws = own_wb.Worksheets("trade")
Set bar_ws = own_wb.Worksheets("bar")
'59秒のシリアル値を取得する--------------------
'sec60 = bar_ws.Cells(5, 3).Value
sec60 = 6.82904513888889E-04
'----------------------------------------------
'Goldの場合 deci=10 GBPUSDは10000
deci = 10
'毎回位置から読み出しするのは効率が悪いので、前回から検索する
posi_open = 0
'--------------------------------------------------------------
'読み出しの開始・終了の縦列を指定する--------------------------
trade_min = 5
trade_max = trade_ws.Cells(Rows.Count, 1).End(xlUp).Row
bar_min = 2
bar_max = bar_ws.Cells(Rows.Count, 1).End(xlUp).Row
'--------------------------------------------------------------
'1minのデータ横列を指定する----------------------------------------------
bar_day_yoko = 1
bar_time_yoko = 2
bar_close_yoko = 6 '終値でエントリ及びエグジットすることを想定
bar_height_yoko = 4
bar_low_yoko = 5
bar_daytime_yoko = 8 '!!!!!!これだけ出力する列を指定!!!!!!
bar_posi_yoko = 9 '!!!!!!これだけ出力する列を指定!!!!!!
'------------------------------------------------------------------------
'履歴のエントリ時間などの横列を指定する----
trade_ent_time = 2
trade_exit_time = 9
trade_buysell_yoko = 3 'BUYSELLの横列
if_buy = "buy" 'BUYポジションの文字列
if_sell = "sell" 'SELLポジションの文字列
'------------------------------------------
'出力する横列を指定----
write_yoko = 23
'----------------------
'1minデータの日付と時間を連結
For i = bar_min To bar_max
bar_ws.Cells(i, bar_day_yoko).Value = Replace(bar_ws.Cells(i, bar_day_yoko).Value, ".", "/")
bar_ws.Cells(i, bar_daytime_yoko).Value = bar_ws.Cells(i, bar_day_yoko).Value + bar_ws.Cells(i, bar_time_yoko).Value
bar_ws.Cells(i, bar_posi_yoko).Value = (bar_ws.Cells(i, 3).Value + bar_ws.Cells(i, 4).Value + bar_ws.Cells(i, 5).Value + bar_ws.Cells(i, 6).Value) / 4
Next i
'-----------------------------------------------------
' ここから長い計算
'-----------------------------------------------------
For trade = trade_min To trade_max
'エントリとエグジットの縦列を取得 ★毎回、初期位置から検索するのは時間がかかりそうなので、前回から検索する-----------
If (posi_open > bar_min + 3) Then
bar_start = posi_open - 2
Else
bar_start = bar_min
End If
For i = bar_start To bar_max
If ((trade_ws.Cells(trade, trade_ent_time).Value >= bar_ws.Cells(i, bar_daytime_yoko).Value) And (trade_ws.Cells(trade, trade_ent_time).Value <= bar_ws.Cells(i, bar_daytime_yoko).Value + sec60)) Then
posi_value_open = bar_ws.Cells(i, bar_posi_yoko).Value
posi_open = i
End If
If ((trade_ws.Cells(trade, trade_exit_time).Value >= bar_ws.Cells(i, bar_daytime_yoko).Value) And (trade_ws.Cells(trade, trade_exit_time).Value <= bar_ws.Cells(i, bar_daytime_yoko).Value + sec60)) Then
posi_value_close = bar_ws.Cells(i, bar_posi_yoko).Value
posi_close = i
Exit For
End If
Next i
'--------------------------------------------------------------------------------------------------------------------
'MFとMB計算の為の値をセット-----
MF = posi_value_open
MB = posi_value_open
'-------------------------------
'MFとMBの取得---------------------------------------------------------------
For i = posi_open + 1 To posi_close - 1
'BUYの場合
If (trade_ws.Cells(trade, trade_buysell_yoko).Value = if_buy) Then
If (MF < bar_ws.Cells(i, bar_height_yoko)) Then
MF = bar_ws.Cells(i, bar_height_yoko).Value
MF_time = bar_ws.Cells(i, bar_daytime_yoko).Value '一応時間も取得しておく
End If
If (MB > bar_ws.Cells(i, bar_low_yoko)) Then
MB = bar_ws.Cells(i, bar_low_yoko).Value
MB_time = bar_ws.Cells(i, bar_daytime_yoko).Value '一応時間も取得しておく
End If
End If
'SELLの場合
If (trade_ws.Cells(trade, trade_buysell_yoko).Value = if_sell) Then
If (MF > bar_ws.Cells(i, bar_low_yoko)) Then
MF = bar_ws.Cells(i, bar_low_yoko).Value
MF_time = bar_ws.Cells(i, bar_daytime_yoko).Value '一応時間も取得しておく
End If
If (MB < bar_ws.Cells(i, bar_height_yoko)) Then
MB = bar_ws.Cells(i, bar_height_yoko).Value
MB_time = bar_ws.Cells(i, bar_daytime_yoko).Value '一応時間も取得しておく
End If
End If
Next i
'---------------------------------------------------------------------------
'結果の書込み---------------------------------------------------------------
'BUYの場合
If (trade_ws.Cells(trade, trade_buysell_yoko).Value = if_buy) Then
trade_ws.Cells(trade, write_yoko).Value = posi_value_open 'ポジション
trade_ws.Cells(trade, write_yoko + 1).Value = posi_value_close 'クローズ
trade_ws.Cells(trade, write_yoko + 2).Value = (posi_value_close - posi_value_open) * deci '差分
If ((posi_value_close - posi_value_open) >= 0) Then
trade_ws.Cells(trade, write_yoko + 3).Value = (MF - posi_value_open) * deci 'win
trade_ws.Cells(trade, write_yoko + 4).Value = (MB - posi_value_open) * deci
Else
trade_ws.Cells(trade, write_yoko + 5).Value = (MF - posi_value_open) * deci 'lose
trade_ws.Cells(trade, write_yoko + 6).Value = (MB - posi_value_open) * deci
End If
End If
'SELLの場合
If (trade_ws.Cells(trade, trade_buysell_yoko).Value = if_sell) Then
trade_ws.Cells(trade, write_yoko).Value = posi_value_open 'ポジション
trade_ws.Cells(trade, write_yoko + 1).Value = posi_value_close 'クローズ
trade_ws.Cells(trade, write_yoko + 2).Value = (posi_value_open - posi_value_close) * deci '差分
If ((posi_value_open - posi_value_close) >= 0) Then
trade_ws.Cells(trade, write_yoko + 3).Value = (posi_value_open - MF) * deci 'win
trade_ws.Cells(trade, write_yoko + 4).Value = (posi_value_open - MB) * deci
Else
trade_ws.Cells(trade, write_yoko + 5).Value = (posi_value_open - MF) * deci 'lose
trade_ws.Cells(trade, write_yoko + 6).Value = (posi_value_open - MB) * deci
End If
End If
'---------------------------------------------------------------------------
Next trade
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
ゴールドの結果
MFE vs MAE
なんとも言えない。良く分からない。
トレード損益 vs MAE 及び トレード損益 vs MFE
MAEについて、なんとなく-50pipsを下回った場合、ほぼ助かっていないという風に読み取れるか?-50pipsで損切してみるというのが、ドカンを防ぎつつ、利益確保できるひとつ改善策になるかもしれない。ゴールド相場はボラが大きいので、MAEは他通貨より大きいはずで、この目安は、ゴールド相場のみで使えるものだ。
MFEについて、負けトレードでも+20pips程度確保できている場合があるということ。+70pips近くも行って、-200pipsも派手に負けているトレードなんてあるのか?と思ったら、あった。強欲。
まとめ
わたしのトレードにおいて、ゴールドは-50pipsを超えると、ほぼ助かっていない。-50pipsを一つ目安にしよう。複数ポジションなので、ざっくりある指定額で切ってしまう仕組み(EAで監視)も必要か。しかし、EAで監視させてもOFFしたら意味がない。