見出し画像

噂のトレード手法を検証した結果 あの通貨ペアなら年利**%!!!

ネットで見つけた『これは稼げる!!』みたいなFXの投資手法を、MT4で自動売買EA作って、バックテスト検証してみました。


noteとかYouTubeで#FXとかを探すと、面白そうなトレード手法がいっぱい見つかりますよね?

これって本当に稼げるの?って疑いつつも、限られた時間で適当にマネして損してしまい、『何やねん!稼げへんやん!』ってなってる方も多いと思います。


果たして本当にそのトレード手法は稼げるのでしょうか?

・トレード回数が少なくて、統計的に収束していない
・たまたま連敗の期間で、長期的には稼げる
・取引通貨ペアや、取引時間の相性悪い
・最適なパラメータが選択できていない
・根本的に稼げないクソ仕様

このようにトレード手法が成功しない理由はいろいろあるかと思います。5つ目は最悪ですが、4つ目まではバックテストすることで対応することが出来ます。


ところが、このバックテストってのが面倒で、多くの方が挫折してしまうポイントでしょう。


『MT4?MT5?MQL?アレルギー出るわ。。。』


結果、過去チャート眺めながら、それっぽいエントリーポイントをいくつか見つけるだけで、『このトレードいけるやん!!』ってそのトレード手法を使い始めちゃう ”視覚的なバックテスト” だけで実弾トレード始めちゃう人がほとんどでしょう。


・実際に長期的に運用したらどうなの?
・もっと最適な条件や通貨ペアはないの?
・手作業でトレードしんどい。。。


そんなみんなが面倒がっていて、でもお金になることって需要あるんじゃないかなって思って、自分の勉強がてらトレード手法のバックテスト検証をしていこうと思います。


うまく動くものが出来れば、自動売買として売れry


今回は、noteで#FXで検索した時に上位に表示された以下の人気記事を検証してみます。

結論から言うと、GBPJPYでなかなか良さそうです。

気になる方は、上記noteを是非チェックしてみてください。


トレード手法検証の前に自己紹介

トレード手法検証の前に、簡単にわたしの自己紹介。


一昨年はPythonを勉強して、BTCbotの作成とか頑張ってました。


そこそこ稼げるbotも作れました。

画像1


でも、今年2019年2月のサーキットブレイカー発動などでbotが正常に動かず(オーダーが通らず)損失が膨らみ続けるだけの状態になったりしたことでbot作りは止めちゃいました。


あとはPythonやPineScriptに飽きてきちゃいました。kerasやtensolで機械学習とか、遺伝的アルゴリズムとか、複雑なことはあるんですけど、トレードってもっと単純やろって思ってしまって熱が冷めました。


で、以前からちまちま弄っていたMT4をもう一度勉強しなおしてみようかなって半年ぐらいカチャカチャ遊んでいたら、それなりに動くものが作れるようになってきたので、次の段階としてトレード手法のバックテスト&自動化を始めようってなったわけです。


はい、自己紹介終了。それでは、さっそく検証いってみましょう。


億トレ『真空地帯トレード』とは?

今回検証させていただくのは、億を稼ぐトレーダーが使用しているトレード手法で、その名も『真空地帯トレード』。



詳しいトレード手法は、上記のnoteを読んでもらうとして、要点はこんな感じ。

・11本の移動平均線を引く
・ローソク足がどの移動平均線よりも高いor低い位置で確定
 (これが移動平均線と接していない真空地帯ってことらしいです。)
・直近高値安値ブレイク
・損切:直近安値or高値、利確:損切幅と同じ


要するに、高値安値を貫いた時のエントリーなので、レンジブレイク手法の一つです。レンジブレイクはブレイク後に戻すダマシにかかることが多いですが、移動平均線でトレンドを見極めているのでかかりにくくしているのがミソのようです。

また、損切幅と利益幅が同値なので、単純に勝率が50%以上であれば利益が増えていく計算になります。


なるほど理屈は通っていますので、早速検証してみましょう。


バックテストの方法

・MT4使用
・過去データはFXDDの1分足をPeriodConverterで編集して使用
・OANDAで検証
・モデルは高速化のため、始値のみ使用
・高値と安値を計算する期間を決定するため、2015年1月1日~2017年12月31日で最適解を求め、2018年1月1日~2019年12月31日でテスト
・最適化計算の期間は25日スタート25日刻み、300日まで
・スプリットは30
・時間足は15分足
・初期口座残高10000ドル
・1取引1万通貨単位(ナンピン、買い増し、両建てなし)
 *決済するまで次のトレードは行いません


バックテストの結果 USDJPYの場合

画像2

2015年1月1日~2017年12月31日で最適化計算した結果、250日期間の高値安値ブレイクでのエントリーであれば、損益416ドル、PF1.08、ドローダウン11.33%。

この条件で2018年1月1日~2019年12月31日をテストしてみました。

画像3

画像4

見事な右肩下がりでした。勝率も44%と負け越し。

画像5

チャートを見てみると真空地帯でブレイクエントリーし、含み益の期間があるものの、利確ポイントに届かず損切まで落ちているようでした。


ドル円の場合、ブレイク後の一方的な上昇や下降が弱いためブレイクアウト戦略には向かないのかなと考え、次は値幅が大きく動くポン円で検証してみました。


バックテストの結果 GBPJPYの場合

2015年1月1日~2017年12月31日で最適化計算した結果です。

画像6

すべての結果で損失が出ました。

75日期間の高値安値ブレイクでのエントリーであれば、マイナス600ドル、PF0.93、ドローダウン25.47%。全く使えませんが、とりあえず上記条件で2018年1月1日~2019年12月31日をテストしてみました。

画像7

画像8

右肩下がりではありませんが、これでは稼げそうにないですね。勝率はドル円より高く47%ですが、負け越しに変わりないです。


トレード手法にトレーリングを足してみる

ポン円のバックテストのチャートを眺めてみると、エントリーポイントと方向性は高確率で合っており、その後含み益になっているものの、利確ポイントに届かず反転。結果、損切されているような感じでした。


そこで、トレーリングストップを入れてみることにしました。条件は以下の感じです。

① エントリー価格より現在値が上昇
② 上昇した分だけ損切ライン近づける
③ 利確ポイントはそのまま

これが、上記noteの手法として正しいかどうかは分かりませんが、エントリーがトレンド方向と合っているなら、トレールさせる方がいいかなって思ったので。。。


バックテスト GBPJPY トレール・利確ありの場合

2015年1月1日~2017年12月31日で最適化計算した結果です。

画像18

75日期間の高値安値ブレイクでのエントリーであれば、1228ドル、PF1.22、ドローダウン21.88%。さっそく上記条件で2018年1月1日~2019年12月31日をテストしてみました。

画像19

画像20

利益が伸ばしきれないのか、イマイチの結果になってしまいました。


利確ポイントを消してしまえば、利益が伸びる?

利確ポイントを限定してしまっていることが、逆に利益の伸びを抑えているのではと考え、利確を無くし、損切幅を縮めるトレーリングのみを適応してみました。

① エントリー価格より現在値が上昇
② 上昇した分だけ損切ライン近づける
③ 利確条件はなし



バックテスト結果 GBPJPY トレールのみの場合

2015年1月1日~2017年12月31日で最適化計算した結果です。

画像9

さきほどの結果に比べて、だいぶ良くなりました。

200日期間の高値安値ブレイクでのエントリーであれば、1500ドル、PF1.22、ドローダウン20.55%。さっそく上記条件で2018年1月1日~2019年12月31日をテストしてみました。


画像10

画像11

念願の右肩上がりの収益グラフが現れました。

初期口座残高10000ドル、収益2108ドルなので年利10%くらいですね。トレールのストップにかかることが増えるので、勝率は下がって36.7%。しかし、ドローダウンは12%とまずまずの状態にまで抑えられています。PFも1.34となかなかです。


収益グラフでも分かるかと思いますが、損切が続いて負けが続きながらも、トレンド相場などの大きく動く場面でしっかりと回収しているようです。


バックテスト結果 その他の通貨ペア

大きく動く通貨ペアなら他にも右肩上がりの収益グラフが見つかるかもってことで、他の通貨ペアも検証してみました。


【 GBPUSD 】

画像12

期間75日でテストした結果。

画像13

画像14

GBPUSDではうまく機能しませんでした。


【 EURUSD 】

画像15

最適化検証時点で、プラスの結果が見られなかったのでパス。


【 EURJPY 】

画像16

期間250日でテストした結果。

画像42

画像43

これも問題外ですね。


【 AUDJPY 】

画像17

期間150日でテストした結果。

画像40

画像41

これでは結果として寂しいですね。


【 AUDUSD 】

画像21

USDが入る通貨ペアとは相性が悪いようです。


【 AUDNZD 】

画像22

期間250日でテストした結果。

画像38

画像39

この通貨ペアも相性が悪いです。


【 CADJPY 】

画像23

期間150日でテストした結果。

画像36

画像37

この結果ではちょっと寂しいですね。


【 EURGBP 】

画像24

大きくは稼げていませんが、高値安値の期間に左右されないようです。

期間150日でテストした結果。

画像34

画像35

この通貨ペアも相性が悪いです。


【 GBPCHF 】

画像25

GBP絡みの通貨ぺアと相性が良いようです。

期間100日でテストしてみました。

画像32

画像33

これでは、使えないですね。


【 USDCAD 】

画像26

期間200日でテストした結果。

画像30

画像31

これもダメです。


【 USDCHF 】

画像27

期間150日でテストした結果。

画像28

画像29

ダメですね。。。



検証まとめ GBPJPYなら機能するかも。。。

今回検証した結果、GBPJPYの通貨ペアであれば、トレール注文を付けることで大きく稼げそうです。

最後に最適解の200日高値安値を利用して、2005年から現在までの運用をバックテストしてみました。

【 トレールのみの場合 】

画像44

画像45

2014年以降からは右肩上がりの収益曲線が描けました。


ちなみに利確条件追加の場合だと、結果は下記のようになりました。高値安値の期間は、最適解の75日を使用して計算しています。


【 利確条件追加の場合 】

画像46

画像47

どちらも15年運用して、純利益が6800ドルくらい。年500ドルってことは、年利5%。。うーーーん。。。


さらに稼ぐために、複利の条件を追加してみました。

・口座残高 10000ドル ⇒ 10000通貨
・口座残高 11000ドル ⇒ 11000通貨

上記のように、10%口座残高が増えると、Lot数を上げていく複利運用を追加してみました。


【 トレールのみの場合 】

画像50

画像51

複利運用をすることで、逆にパフォーマンスは悪くなるようです。


【 利確条件追加の場合 】

画像48

画像49

こちらも複利運用をすることで、逆にパフォーマンスは悪くなるようです。


結論 GBPJPYで高値安値200日トレールのみが最適

今回検証した『真空地帯トレード』なる手法は、GBPJPYで高値安値設定を200日期間でバックテスト検証すると、最も良いパフォーマンスを示しました。


100万円が15年で170万くらいになる計算です。年利にして5%。

短期間で大きくは稼げませんが、長期的に自動放置で良いならなかなか良いのではないでしょうか。


ちなみに。。。10万通貨でトレードすると。。。

100万円の元手で1万通貨なんてヌルイ投資をするんじゃなくて、10万通貨でトレードしたらどうなる?って思った方もいるでしょう。

実際、トレーリングストップがかかりますし、ナンピンとかしないので超安全設計なので、リスクは取りやすい仕組みです。

そこで、よりドローダウンが少なく安全な利確条件アリの方を10万通貨でバックテストしてみました。

画像68

画像69

最終口座残高が78530ドル。純益が68530ドルなので、15年でおよそ700万円くらいの儲けです。これなら年利50%くらいですね。


国内のFX業者ならポンド円1万通貨あたり6万円の証拠金が必要なので、10万通貨で60万円の証拠金が必要です。


海外ならXMとか1万通貨あたり2000円くらいですから10万通貨でも証拠金は2万円くらいです。少ない元手で始めるなら海外FXでしょうね。


おまけ 他の時間足ならどう?

上記noteでは15分足が最適と書かれていましたが、他の足ではどうでしょうか?検証してみました。

・GBPJPY使用
・トレールのみ使用
・2015年1月1日~2017年12月31日で最適化計算
・2018年1月1日~2019年12月31日で検証


【 1分足 】

画像52

250日期間で検証。

画像62

画像63

これは相当ヤバイですね。

2015年から2017年でフィッティングされてるだけで、2018年以降ガタガタです。


【 5分足 】

画像53

期間50日だと3年間で5000ドル以上稼げる結果になりました。

さっそく2018年からデータでバックテストしてみます。

画像60

画像61

うーーーん。。。。そうそう、うまくはいかないってことですね。


結局1分や5分ってノイズが多いので、ダマシを食らいやすいのと、単純にトレード回数が増えるので、スプレッド負けが増える感じです。


【 30分足 】

画像54

125日期間で検証。

画像58

画像59

PF2.42は異常ですね。2005年からで検証してみます。


【2005年から2019年】

画像64

画像65

結局イマイチですね。


【 1時間足 】

画像55

50日期間で検証。

画像56

画像57

PF1.47はすごいですね。2005年からの検証です。


【2005年から2019年】

画像66

画像67

なかなかいい感じの右肩上がりですが、最大ドローダウン30%が気になりますね。




最後に バックテスト検証用EAの内容

最後にMT4でEAを作った内容です。

何となく勉強になったポイントを抜粋しときますので、現在MT4で自動売買のEA作りとか頑張っている方の参考になればうれしいです。

間違ってたり、もっといい書き方あれば教えてください。その他、コメントあれば書いていただけると、励みになりますし飛び跳ねて喜びます。


double MAArray[];

void OnTick()
{
  int new_size = ArrayResize(MAArray,11);

  MAArray[0] = iMA(Symbol(),0,20,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[1] = iMA(Symbol(),0,40,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[2] = iMA(Symbol(),0,50,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[3] = iMA(Symbol(),0,80,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[4] = iMA(Symbol(),0,100,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[5] = iMA(Symbol(),0,200,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[6] = iMA(Symbol(),0,320,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[7] = iMA(Symbol(),0,400,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[8] = iMA(Symbol(),0,800,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[9] = iMA(Symbol(),0,1600,0,MODE_SMA,PRICE_CLOSE,1);
  MAArray[10] = iMA(Symbol(),0,1920,0,MODE_SMA,PRICE_CLOSE,1);
  
  
  int High_num = ArrayMaximum(MAArray,WHOLE_ARRAY,0);
  int Low_num = ArrayMinimum(MAArray,WHOLE_ARRAY,0);
}


まず、真空に突入しているかどうかを判定するために、現在足の一つ前の足における最も高値に位置する移動平均線と最も安値に位置する移動平均線を計算します。

そこで、上記のようなコードでどの移動平均線が最大か最小かを調べました。


MT4って配列の数を先に決めてあげる必要があります。ArrayResizeで配列は11個だよって教えてあげてます。

移動平均線を配列にしたのも理由があって、MT4には最大値を知る方法が、MathMaxかArrayMaximumしかないんですよね。(他あれば教えてください)


で、MathMaxって二つの数字のどっちが大きいかしか計算できないんですよ。

//計算できる
double saidai = MathMax(1,100);      // 100

//計算できない
double saidai = MathMax(1,10,100);    // エラー

//計算できる
double saidai = MathMax(MathMax(1,10),100);

3つ目のやり方で11個の移動平均線の最大最小を計算するって、イケてないですよね。ってことで、移動平均線の値を配列に入れてArrayMaximum使って最大、最小の移動平均線を調べました。


トレーリング注文はこんな感じ。

  if(Trail==true && OrdersTotal()>0)
  {
     if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY && OrderStopLoss()<Ask-SL)
     {
        OrderModify(OrderTicket(),OrderOpenPrice(),Ask-SL,0,OrderExpiration());
     }
     if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL && OrderStopLoss()>Bid+SL)
     {
        OrderModify(OrderTicket(),OrderOpenPrice(),Bid+SL,0,OrderExpiration());
     }
  }

externの外部変数でTrailをboolでtrueかfalseを選べるように設定。

OrdersTotal()で、保有ポジションがあるときだけ発動。

OrderSelectとOrderTypeで買い注文か売り注文か選んで、現在値がエントリー値より有利になるたびに、有利になった分だけストップロスを近付けています。


あとは、上記のコードをくっつけたり注文オーダーを付ければ完成です。

スキが増えれば、完全版のコード載せます。


ここまで読んでいただき、ありがとうございました。

今後も、トレードの検証を報告していく予定です。乞うご期待。


注意

当サイトに含まれる情報の全ては、情報提供を唯一の目的としたものであり、収益の保証、或いは、直接的に投資助言業務、投資勧誘を行うものではありません。投資方針や時期選択等の最終決定は、リスク等を熟知した上、ご自身で判断されますようお願いいたします。
当サイトの利用、あるいは取引により利用者に生じたいかなる損害についても著者及び発行者はそれに対し、一切の責任を負いません。あらかじめご了承ください。
万が一、損失を被った場合でも、著者は一切の責任を負わないものとします。

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