目次
概要
ストキャスティクス(Stochastic)は買われすぎ・売られすぎを捉えるオシレーター系のインジケータです。
似たようなインジケータにRSIなどがあります。
今回の記事では、ストキャスティクスを使用したよくある逆張り手法を検証します。
書籍での説明箇所
・『あの4億円脱税主婦が教えるFXの奥義』(池辺雪子)のP132
トレードルール
買う場合のルールのみ確認します。
エントリールール
以下の条件を両方満たす時
・%Kと%Dの両方のラインが20%を下回る
・%Kと%Dがクロスする
エグジットルール
以下の条件のいずれかを満たす時
・%Kのラインが80%を上回る
・%Kのラインが50%を上回りかつ%Kと%Dがクロスする
ソースコード
※以下のソースコードは、
『FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)』(豊嶋久道)
で紹介されているライブラリーを使用しています。
そのため、コピペだと動きません。
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 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094060 #define COMMENT "Stochastic" // 外部パラメータ extern double Lots=0.1; extern int Slippage=3; extern int SLpips=0; // 損切り値幅(pips) extern int TPpips=0; // 利食い値幅(pips) extern int HighStochastic=80; extern int LowStochastic=20; input bool isUseExit=true; extern int KPeriod=5; //%Kしかみていないので、DPeriodの変更は無意味 extern int DPeriod=3; //StochasticSlowing:1→ファースト・ストキャスティクス(メイン=%K、シグナル=%D) //StochasticSlowing:2以上→スロー・ストキャスティクス(メイン=%D、シグナル=Slow%D ) extern int StochasticSlowing=3; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double K_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,0); double D_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_SIGNAL,0); double K_Line_1=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,1); double D_Line_1=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_SIGNAL,1); double K_Line_2=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,2); double D_Line_2=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_SIGNAL,2); //現在の足をリアルタイムでみるのでなく、確定した足で確認する //買う場合は%Kと%Dの両方のラインで20%を下回っている bool isUnderLowStochastic=K_Line_1<LowStochastic && D_Line_1<LowStochastic; bool isOverHighStochastic=K_Line_1>HighStochastic && D_Line_1>HighStochastic; bool isGoldenCross=K_Line_1>D_Line_1 && K_Line_2<D_Line_2; bool isDeadCross=K_Line_1<D_Line_1 && K_Line_2>D_Line_2; bool buySignal=isUnderLowStochastic && isGoldenCross; bool sellSignal=isOverHighStochastic && isDeadCross; int ret=0; // 買いシグナル if(pos<=0 && buySignal) ret=1; // 売りシグナル if(pos>=0 && sellSignal) ret=-1; return(ret); } // スタート関数 int start() { // 売買ポジションのエグジット 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); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ExitPosition(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double K_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,0); double D_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_SIGNAL,0); double K_Line_1=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,1); double D_Line_1=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_SIGNAL,1); double K_Line_2=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,2); double D_Line_2=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_SIGNAL,2); //現在の足をリアルタイムでみるのでなく、確定した足で確認する bool isUnderLowStochastic=K_Line_0<LowStochastic; bool isOverHighStochastic=K_Line_0>HighStochastic; bool isUnderHalf=K_Line_0<50; bool isOverHalf=K_Line_0>50; bool isGoldenCross=K_Line_1>D_Line_1 && K_Line_2<D_Line_2; bool isDeadCross=K_Line_1<D_Line_1 && K_Line_2>D_Line_2; bool buyExitSignal=isOverHighStochastic||(isOverHalf && isDeadCross); bool sellExitSignal=isUnderLowStochastic||(isUnderHalf && isGoldenCross); 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); } //+------------------------------------------------------------------+ 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)); } //+------------------------------------------------------------------+ |
結果
最初は、StochasticSlowingを1(メイン=%K、シグナル=%D)に設定して検証しましたが、きれいな右肩下がりになってしまいました。
あまりに使えない結果だったので、上の結果はStochasticSlowingを3(メイン=%D、シグナル=Slow%D )に設定して検証しています。
考察
スプレッドが0.5Pipsの設定で、プロフィットファクタは1を下回っています。
このトレードルールでは儲けることはできません。
改善が必要になります。
改善点
・強いトレンドが発生している時はエントリーしない
・損切のロジックを追加する
今のロジックだと、損切がないため、損失が予期せぬほど大きくなることがあります。
・エグジットルールを工夫する
関連記事
ストキャスティクスと同様に売られすぎ・買われすぎを測るRSIの検証結果
→RSIを使用したトレードルールをMT4で検証
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント