目次
概要
『FXで稼ぐ人のテクニックVol.2 スキャルピング デイトレ編』のP54に記載されている手法が有効そうか確認する。
まずは、シンプルに、平均足だけ使ったトレードルールを検証する。
書籍に記載されているRSIやADXを使用してシグナルのフィルターをかけるルールは、いったん考えない。
トレードルール
以下は買いのトレードルールです。
(売りのエントリーはこの逆)
・平均足が連続して7回以上陰線になった後、陽線になったタイミングでエントリー
※平均足は足が確定するまで待つ
・陰線が出たら、エグジット
ソースコード
※以下のソースコードは、
『FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)』(豊嶋久道)
で紹介されているライブラリーを使用しています。
そのため、コピペだと動きません。
それに加えて、平均足のインジケータが別途必要です。
豊嶋さんの本のp123で紹介されている「HeikinAshi」というインジケータをビルドして、「Indicators」フォルダ以下に配置してください。
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 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094060 #define COMMENT "平均足" // 外部パラメータ extern double Lots=0.1; extern int Slippage=3; extern int SLpips= 0; // 損切り値幅(pips) extern int TPpips= 0; // 利食い値幅(pips) extern int BandsPeriod=21; extern int BandsDeviation=2; extern int SignalContinuousBars=7; extern int IsUseExit=true; datetime LatestTime; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double heikinAshiOpen_1 = iCustom(NULL, NULL, "HeikinAshi", 0, 0); double heikinAshiClose_1 = iCustom(NULL, NULL, "HeikinAshi", 1, 0); double isContinuousPositiveBars =CountPositiveBars(2)>SignalContinuousBars; double isContinuousNegativeBars =CountNegativeBars(2)>SignalContinuousBars; bool isPositiveBars=heikinAshiClose_1> heikinAshiOpen_1; bool isNegativeBars=heikinAshiClose_1< heikinAshiOpen_1; bool buySignal=isContinuousNegativeBars && isPositiveBars; bool sellSignal=isContinuousPositiveBars && isNegativeBars; int ret=0; // 買いシグナル if(pos<=0 && buySignal) ret=1; // 売りシグナル if(pos>=0 && sellSignal) ret=-1; return(ret); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ExitPosition(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double heikinAshiOpen_1 = iCustom(NULL, NULL, "HeikinAshi", 0, 0); double heikinAshiClose_1 = iCustom(NULL, NULL, "HeikinAshi", 1, 0); bool isPositiveBars=heikinAshiClose_1> heikinAshiOpen_1; bool isNegativeBars=heikinAshiClose_1< heikinAshiOpen_1; bool buyExitSignal=isNegativeBars; bool sellExitSignal=isPositiveBars; int ret=0; //if(pos < 0 && 売りポジションの決済シグナル) ret = 1; if(pos<0 && sellExitSignal) ret=1; //if(pos > 0 && 買いポジションの決済シグナル) ret = -1; if(pos>0 && buyExitSignal) ret=-1; // オープンポジションの決済 if(ret!=0) MyOrderClose(Slippage,magic); } // スタート関数 int start() { if(Time[0] != LatestTime) { LatestTime = Time[0]; } else { return(0); } if(IsUseExit) { ExitPosition(MAGIC); } // エントリーシグナル int sig_entry=EntrySignal(MAGIC); // 買い注文 if(sig_entry>0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_BUY,Lots,Ask,Slippage,SLpips,TPpips,COMMENT,MAGIC); } // 売り注文 if(sig_entry<0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_SELL,Lots,Bid,Slippage,SLpips,TPpips,COMMENT,MAGIC); } return(0); } //+------------------------------------------------------------------+ bool MyOrderSendSL(int type,double lots,double price,int slippage,int slpips,int tppips,string comment,int magic) { int mult=1; if(Digits == 3 || Digits == 5) mult=10; slippage *= mult; if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP) mult*=-1; double sl=0,tp=0; if(slpips > 0) sl = price-slpips*Point*mult; if(tppips > 0) tp = price+tppips*Point*mult; return(MyOrderSend(type, lots, price, slippage, sl, tp, comment, magic)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountPositiveBars(int timeshift) { int countPositiveBarsSum=0; for(int i=0; i<Bars; i++) { double heikinAshiOpen_i = iCustom(NULL, NULL, "HeikinAshi", 0, i+timeshift); double heikinAshiClose_i = iCustom(NULL, NULL, "HeikinAshi", 1, i+timeshift); if(heikinAshiClose_i<heikinAshiOpen_i) { break; } countPositiveBarsSum++; } return countPositiveBarsSum; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountNegativeBars(int timeshift) { int countNegativeBarsSum=0; for(int i=0; i<Bars; i++) { double heikinAshiOpen_i = iCustom(NULL, NULL, "HeikinAshi", 0, i+timeshift); double heikinAshiClose_i = iCustom(NULL, NULL, "HeikinAshi", 1, i+timeshift); if(heikinAshiClose_i>heikinAshiOpen_i) { break; } countNegativeBarsSum++; } return countNegativeBarsSum; } //+------------------------------------------------------------------+ |
結果
改善点
・押し目・戻りを間違えてシグナルだと捉えてしまう
・陽線(陰線)の連続回数をカウントするロジックがイマイチ
連続している陽線(陰線)の途中で押し目・戻りが発生し、1本だけ陰線(陽線)だった場合に、カウントが止まってしまう。
連続した陽線(陰線)の中に多少の陰線(陽線)があっても無視するロジックを組む。
・ちょっとした押し目・戻りに反応してエグジットしてしまう
エグジットのロジックは平均足を使用しない
・書籍に記載されているように別のインジケータを組み合わせる
・エントリーのタイミングが遅い
平均足が完成するまで待っているが、もう少し早いタイミングでエントリーする
関連記事
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント