[MT4]仮想通貨(ビットコイン)のシステムトレード検証(ソースコードあり)
公開日:
:
無料配布EA(MT4 用), MT4/MT5の仮想通貨自動売買 ea, ビットコイン, 自動売買, ソースコードあり
目次/もくじ
MT4/MT5でも仮想通貨の取扱業者が増えてきたので、そろそろ自動売買やらバックテストやらができるようになってきました。
仮想通貨FXトレードができるおすすめ海外FX会社一覧(MT4/MT5)
現物でアービトラージをするならいざ知らず、テクニカルベースのシステムトレードをするならやっぱりMT4が便利です。
という訳で適当にテクニカルイニジケーターでバックテストしてみました。同じことを独自開発のシステムでやろうとすると鬼のように大変なので、様子見ということでやってみるのはありだと思います。
今回はまず手始めとしてBTCUSDチャートに対して従来の一般的なシステムトレードの流れを試してみます。
移動平均線のゴールデンクロスで買い、デッドクロスで売り
具体的には、移動平均線のゴールデンクロスで買い、デッドクロスで売り。決済は固定幅SLTPを行い、数値最適化を行います。
仮想通貨から相場の世界に入ってきた人はそもそもMT4が何なのか知らない人もいるかもしれませんが、自動売買やシステムトレードに特化した業者をまたいで使えるツールだと思ってください。
他にもcTraderやjForexなどがありますが、MT4がシェア9割以上なのでとりあえず慣れておいて損はないです。
エントリー条件の記述
買いエントリーの条件ですが、シンプルに記述します。
最新の未確定足(#0バー)を条件に使うと、リペイントしたり、反応し過ぎたりするので、数値が確定した最新の足から演算に使うのが最近では主流です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//MQL4 bool BuyCondition() { double sMA[3],lMA[3]; sMA[1] = iMA(Symbol(),Period(),ShortPeriod,0,MA_MODE,PRICE_MODE,1); sMA[2] = iMA(Symbol(),Period(),ShortPeriod,0,MA_MODE,PRICE_MODE,2); lMA[1] = iMA(Symbol(),Period(),LongPeriod,0,MA_MODE,PRICE_MODE,1); lMA[2] = iMA(Symbol(),Period(),LongPeriod,0,MA_MODE,PRICE_MODE,2); if( sMA[1] >= lMA[1] && sMA[2] < lMA[2] ) { return(true); } else return(false); } |
仮想通貨チャートの場合、最小桁数が偶数なので(小数点第二位)、FX用の自動売買ソフトを使うと桁がずれて不具合を起こす可能性があります。
何年も昔ではFXチャートでも少数第2位や第4位のFX業者もありましたが、今では少数第3位か第5位しかないので、仮想通貨用に少し修正を加える必要があります。
また、ボラティリティが大きいのでSL,TPの固定幅が10000Point(100USD)とかになったりしますが、チャートで確認してみると意外と妥当な値だったりします。
2017年は急成長した期間なので、順張りが大正義になることは目に見えているため、テスト期間は2018年の1年にしました。
2018/1/1~2018/12/13 H1の期間でSL,TPを数値最適化したグラフ(横がSL、縦がTP)
SL=100000(1000USD), TP=90000(900USD)でやったときの資産グラフ(横が取引、縦が資産)
やりようによっては勝てるトレードもある、ということがわかります。
問題点としては、ヒストリーデータの信頼性が低い(欠損が多い)ことと、取引回数が少ないことがやはり気になります。
時間枠を下げて取引回数を増やしてもいいのですが、スプレッドを考慮するとH1あたりが限界じゃないかと思います。
また、仮想通貨によってはボラティリティに開きがあるので、固定SLTPはあまり役に立たないんじゃないかという気もします。
こういう場合、ATRの2倍、3倍…をSLTP幅の計算に使うのが正攻法ですが、
初心者の方にとってはわかりにくくなるばかりなので、決済も移動平均を使う方向に改良してみます。
トレードロジックを少し変えてみる
【ストラテジ】
ゴールデンクロスで買い、デッドクロスで売り、固定SLTPで決済(変更前)
↓
ゴールデンクロスで買い、デッドクロスで売り、デッドクロスで買い決済、ゴールデンクロスで売り決済(変更後)
.
エントリー用の移動平均期間と決済用の移動平均期間をそれぞれ分けて、数値の最適化を行いました。
成績の良い組み合わせが以下の表です。
試しに、ShortPeriod_entry=18 LongPeriod_entry=36 ShortPeriod_exit=18 LongPeriod_exit=36
で資産推移曲線を見てみると、
さっきよりは良くなったんじゃないかと思います。
リップルの場合
期間は同じく2019/1/1~2019/12/31です。
仮想通貨FXトレードができるおすすめ海外FX会社一覧(MT4)
ソースコード
EA(自動売買プログラム)のダウンロード
mq4(ソースコード)のダウンロード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
extern double Lot = 0.01; extern double SL = 0; extern double TP = 0; extern int ShortPeriod_entry = 12; extern int LongPeriod_entry = 24; extern int ShortPeriod_exit = 12; extern int LongPeriod_exit = 24; extern int MA_MODE = MODE_SMA; extern string note = "SMA:"+MODE_SMA+" EMA:"+MODE_EMA+" LWMA:"+MODE_LWMA+" SMMA:"+MODE_SMMA; extern int PRICE_MODE = PRICE_CLOSE; extern string note2 = "CLOSE:"+PRICE_CLOSE+" OPEN:"+PRICE_OPEN+" HIGH:"+PRICE_HIGH+" LOW:"+PRICE_LOW; extern int Slippage = 30; extern int MagicNumber = 88888; int OrdersTotal_; int LastOpenBar; bool R; int Ticket; int i; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- //CLOSE------------------------- OrdersTotal_ = OrdersTotal(); for( i=0; i<OrdersTotal_; i++ ) { R = OrderSelect(i,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && Symbol() == OrderSymbol() ) { if( OrderType() == OP_BUY ) { if( BuyCloseCondition() ) { R = OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrYellow); } } else if( OrderType() == OP_SELL ) { if( SellCloseCondition() ) { R = OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrYellow); } } } } //Entry if( EAOpenedPositions() == 0 && LastOpenBar != Bars) { double SLrate,TPrate; if( BuyCondition() ) { Ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,WindowExpertName(),MagicNumber,0,clrRed); if( SL != 0 || TP != 0 ) { R = OrderSelect(Ticket,SELECT_BY_TICKET); SLrate = OrderOpenPrice() - SL*Point; TPrate = OrderOpenPrice() + TP*Point; SLrate = NormalizeDouble(SLrate,Digits); TPrate = NormalizeDouble(TPrate,Digits); R = OrderModify(Ticket,OrderOpenPrice(),SLrate,TPrate,0,clrRed); } LastOpenBar = Bars; } else if( SellCondition() ) { Ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,WindowExpertName(),MagicNumber,0,clrBlue); if( SL != 0 || TP != 0 ) { R = OrderSelect(Ticket,SELECT_BY_TICKET); SLrate = OrderOpenPrice() + SL*Point; TPrate = OrderOpenPrice() - TP*Point; SLrate = NormalizeDouble(SLrate,Digits); TPrate = NormalizeDouble(TPrate,Digits); R = OrderModify(Ticket,OrderOpenPrice(),SLrate,TPrate,0,clrBlue); } LastOpenBar = Bars; } } } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+ int EAOpenedPositions() { int EAorders = 0; OrdersTotal_ = OrdersTotal(); for(i=0;i < OrdersTotal_;i++) { R = OrderSelect(i,SELECT_BY_POS); if( (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()) ) { if( (OrderType() == OP_BUY) || (OrderType() == OP_SELL) ) { EAorders++; } } } return(EAorders); } bool BuyCondition() { double sMA[3],lMA[3]; sMA[1] = iMA(Symbol(),Period(),ShortPeriod_entry,0,MA_MODE,PRICE_MODE,1); sMA[2] = iMA(Symbol(),Period(),ShortPeriod_entry,0,MA_MODE,PRICE_MODE,2); lMA[1] = iMA(Symbol(),Period(),LongPeriod_entry,0,MA_MODE,PRICE_MODE,1); lMA[2] = iMA(Symbol(),Period(),LongPeriod_entry,0,MA_MODE,PRICE_MODE,2); if( sMA[1] >= lMA[1] && sMA[2] < lMA[2] ) { return(true); } else return(false); } bool SellCondition() { double sMA[3],lMA[3]; sMA[1] = iMA(Symbol(),Period(),ShortPeriod_entry,0,MA_MODE,PRICE_MODE,1); sMA[2] = iMA(Symbol(),Period(),ShortPeriod_entry,0,MA_MODE,PRICE_MODE,2); lMA[1] = iMA(Symbol(),Period(),LongPeriod_entry,0,MA_MODE,PRICE_MODE,1); lMA[2] = iMA(Symbol(),Period(),LongPeriod_entry,0,MA_MODE,PRICE_MODE,2); if( sMA[1] <= lMA[1] && sMA[2] > lMA[2] ) { return(true); } else return(false); } bool BuyCloseCondition() { double sMA[3],lMA[3]; sMA[1] = iMA(Symbol(),Period(),ShortPeriod_exit,0,MA_MODE,PRICE_MODE,1); sMA[2] = iMA(Symbol(),Period(),ShortPeriod_exit,0,MA_MODE,PRICE_MODE,2); lMA[1] = iMA(Symbol(),Period(),LongPeriod_exit,0,MA_MODE,PRICE_MODE,1); lMA[2] = iMA(Symbol(),Period(),LongPeriod_exit,0,MA_MODE,PRICE_MODE,2); if( sMA[1] <= lMA[1] && sMA[2] > lMA[2] ) { return(true); } else return(false); } bool SellCloseCondition() { double sMA[3],lMA[3]; sMA[1] = iMA(Symbol(),Period(),ShortPeriod_exit,0,MA_MODE,PRICE_MODE,1); sMA[2] = iMA(Symbol(),Period(),ShortPeriod_exit,0,MA_MODE,PRICE_MODE,2); lMA[1] = iMA(Symbol(),Period(),LongPeriod_exit,0,MA_MODE,PRICE_MODE,1); lMA[2] = iMA(Symbol(),Period(),LongPeriod_exit,0,MA_MODE,PRICE_MODE,2); if( sMA[1] >= lMA[1] && sMA[2] < lMA[2] ) { return(true); } else return(false); } |
関連記事
-
ストキャスティクス スイングトレード[MT4EA]
バックテスト結果 2019/1/1~2019/12/31 M5 EURCAD PF:10.
-
[無料.EA4]デイブレイクアウトEA(MT4) コツコツ型
ロットは変動ロットにできますが、マーチンゲールではなく証拠金変動タイプです。 EURUSDの1
-
3通貨相関 三角/トライアングルアービトラージEA(MT4MT5)
合成通貨トライアングルアービトラージとは FXは2つの通貨のペアなので、その組み合わせは無数に
-
直近二日の高値、安値のブレイクアウト戦略EA検証[MT4]
もともと昔から「日の高値、安値のブレイクアウト」、もしくは「高値・安値に数pips幅を持たせたライン
-
トラリピEAの開発と検証 ループイフダン/iサイクル[MT4/MT5]
トラリピとは トラリピとはトラップリピートイフダンの略でグリッドトレードの一種です。一定幅毎に