MT5でBTCUSDの買い下がりEAを作って検証してみた ②
前回の記事はこちら。
FXGTのBTCUSDにて、買い下がるだけのEAを作り、指値価格の幅と指値ごとのLot枚数を変更して利益が得られるか検証しました。
結局はナンピンになるのでドローダウンが発生しますが、耐えれれば稼げるといった感じですね。
今回は、エントリーと決済についてロジックを追加して、いい感じになるかどうか検証してみます。
検証環境
FXGTのstandard口座(MT5)
BTCUSD
2021年1月1日~2022年10月9日
1時間足(モデル:1分足OHLC)
証拠金10000ドル
前回最後の検証条件
過去20本の最安値をブレイクしたら0.01Lotで成行ロング
0.2%→0.22%→0.242%…のように1.1倍の値幅20本分ロング指値
Lotは0.01から1.7倍でナンピン全ポジションの利益額合計が20ドルを超えると決済
1に戻る
過去20本の安値ラインを下にブレイクしたらエントリー
前回の結果を超えられるか検証。
過去20本の最安値をブレイクしたら0.01Lotで成行ロング
0.2%→0.22%→0.242%…のように1.1倍の値幅20本分ロング指値
Lotは0.01から1.7倍でナンピン全ポジションの利益額合計が20ドルを超えると決済
1に戻る
前回に比べて、ドローダウンは下がりPFやシャープレシオは改善されましたが、取引数は6分の1に、総利益も3分の1に減っています。
下がったときにしかエントリーしないので当然ですよね。
パラメータをいじってみます。
過去20本の最安値をブレイクしたら0.01Lotで成行ロング
0.4%→0.48%→0.576%…のように1.2倍の値幅20本分ロング指値
Lotは0.01から2倍でナンピン全ポジションの利益額合計が20ドルを超えると決済
1に戻る
値幅を広げるとドローダウンやPFは改善されますが、総利益が減りますね。
過去20本の高値ラインを下にブレイクしたらエントリー
先ほどは下方向のブレイクからの戻りを取りにいくエントリーでしたが、次は高値ブレイクを追うエントリーで検証してみます。
過去20本の最高値をブレイクしたら0.01Lotで成行ロング
0.2%→0.22%→0.242%…のように1.1倍の値幅20本分ロング指値
Lotは0.01から1.7倍でナンピン全ポジションの利益額合計が20ドルを超えると決済
1に戻る
同じ条件では、2022年1月の下落に耐えられないようです。
パラメータをいじってみます。
過去140本の最高値をブレイクしたら0.01Lotで成行ロング
0.2%→0.24%→0.288%…のように1.2倍の値幅20本分ロング指値
Lotは0.01から1.9倍でナンピン全ポジションの利益額合計が15ドルを超えると決済
1に戻る
パラメータを改善するとドローダウンを抑えた結果が得られましたが、総損益は前回に比べて控えめになりました。取引数も815と少ないですね。
2022年だけで検証してみる
いずれの損益曲線も前半が大きく利益になっていることから、2021年の上昇相場の恩恵が大きすぎると考えられます。そこで、2022年の下落相場だけで検証をしてみました。
すべてエントリー条件のみ変更し、それぞれで最適なパラメータを探した結果です。
前回のエントリー条件の場合です。
2022年は下落相場なので、ロングだけの戦略ではドローダウンも大きく、利益も小さいですね。
次に最安値ブレイクでのロングエントリーです。
2022年5月6月の暴落で死にかけていますね。
最後に、高値ブレイクのエントリーです。
取引数が少なくドローダウンの回数も多いです。ドローダウンの比率は、最安値ブレイクよりも安全なようです。
ここまでまとめ
ざっくりとしたエントリーを検証しましたが、安値割れや高値割れでエントリーをスタートすることだけでは、利益を増やし損失を減らすことは出来ませんでした。
エントリーを絞ることで取引回数が減り、ドローダウンに耐えれる証拠金の蓄積ができなかったことが原因と考えます。
そこで次は、決済の方法を検証してみます。
決済の方法を検証する
買い下がりで複数ポジを持つ場合、決済方法として以下の3点が考えられます。
全ポジ合計の固定利益での決済
平均建値からの値幅決済
平均値幅からの値幅トレーリング
1つ目の固定利益決済は、これまで検証を行ってきたものです。合計10ドル以上の利益になれば決済のような感じです。
2つ目の平均建値からの値幅は、買い下がりのたびにLotサイズと建値から平均の建値を計算し、固定した値幅で決済を行う仕組みです。
void Trailing()
{
CTrade trade;
if(PositionsTotal()>0)
{
double LaveP = 0;
double LsumLots = 0;
int Lnum = 0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
PositionSelectByTicket(PositionGetTicket(i));
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
LaveP += PositionGetDouble(POSITION_PRICE_OPEN)*PositionGetDouble(POSITION_VOLUME);
LsumLots += PositionGetDouble(POSITION_VOLUME);
Lnum += 1;
}
}
LaveP /= LsumLots;
if(SymbolInfoDouble(_Symbol,SYMBOL_BID)>LaveP+rieki)
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
trade.PositionClose(_Symbol,3);
}
}
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_BUY)
{
if(PositionGetDouble(POSITION_TP)==0)
{
trade.PositionModify(PositionGetTicket(i),0,LaveP+rieki);
}
if(PositionGetDouble(POSITION_TP)>LaveP+rieki)
{
trade.PositionModify(PositionGetTicket(i),0,LaveP+rieki);
}
}
}
}
}
こんな感じの関数をOnTickに入れて、平均建値に合わせてTakeProfitを移動させてみました。
ついでに固定値幅ではなく、固定%でも検証してみました。平均建値の1%上で決済みたいな感じです。上記と同じ条件で決済だけを平均建値の1%上になるように変更しました。
4月のこの下げがドローダウンの原因のようです。
あとは2月3月のこのあたり。
ある程度の固定損失が出たら損切して再エントリーのロジックを入れてみるのもありかもしれません。また検討してみます。
3つ目は平均建値に対し固定した値幅でトレーリングを行う決済の仕組みです。トレーリングは平均建値より下に設定すると損切になるので、BID価格が平均建値を固定値超えた後から固定値で追う設定にしました。
ここまで検証を簡単にするために、1分足のOHLCだけで検証してきましたが、より正確に検証するためリアルティックでの検証に移ります。トレーリングなどの検証ではリアルティックを用いるべきなのですが、バックテストに時間がかかるので、ここまで使用してきませんでした。
ロジックを考えずにストップを設定してしまうと損切貧乏になるようです。
買い下がりEAを検証しながら感じたこと
仕組みは誰でも簡単に作れる
ロジックはいらない(アノマリーやエッジはいらない)
下手にロジックを入れると取引回数が減る
買い下がりでエントリーの救済をしているイメージ
損切設定は損切貧乏になる可能性あり
さらに改善するためには?
2022年の下落相場では買い下がりの作戦だけではなかなか勝てないようです。そこで、売りあがりも追加して検証してみます。
単純に買い下がりと逆方向の売りあがりを追加してみた2022年の結果です。固定利益での決済です。
買い下がりだけよりは、かなり安定しました。
このあたりでFXGTのmini口座を使って実弾フォワード検証始めてみます。
結果は後日報告します。
この記事が気に入ったらサポートをしてみませんか?