目次
概要
『田平雅哉のFX「スイングトレード」テクニック』(田平雅哉)に記載されている手法を検証します。
この本では、MACDとスロー・ストキャスティクスの組み合わせを使用する手法が書かれています。
しかし、どのタイミングでエントリーして、どのタイミングでエグジットを行えばいいか具体的なトレードルールに落とし込めるレベルでの記載はありません。
そのため、いくつかのルールは自分が補っています。
トレードルール
買う場合の説明をします。
設定
・MACD
短期MAの期間→12
長期MAの期間→26
シグナルの期間→9
・スロー・ストキャスティクス
期間42
エントリー
・MACDのシグナルラインとメインラインがゴールデンクロスする
・ストキャスティクスが25以下
エグジット
・ストキャスティクスが75以上
↑このルールのみ足が確定するのを待たずに執行する。
・MACD のメインラインが0以上かつMACDのシグナルラインとメインラインがデッドクロスする
その他
・エントリーしてから再度エントリーするまで2時間待つ
※エントリーしたタイミングで1番目のエグジットルールを満たす場合があるため
・1時間足で検証する
・損切として25Pipsを採用する
ソースコード
※以下のソースコードは、
『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 151 152 153 154 155 156 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094060 #define COMMENT "田平本" // 外部パラメータ extern double Lots=0.1; extern int Slippage=3; extern int SLpips=25; // 損切り値幅(pips) extern int TPpips=0; // 利食い値幅(pips) extern int HighStochastic=75; extern int LowStochastic=25; extern bool isUseExit=true; extern int FastMAPeriod = 12; // MACD短期MAの期間 extern int SlowMAPeriod = 26; // MACD長期MAの期間 extern int SignalPeriod= 9; // MACDシグナルの期間 extern int KPeriod=42; extern int DPeriod=3; //StochasticSlowing:1→ファースト・ストキャスティクス(メイン=%K、シグナル=%D) //StochasticSlowing:2以上→スロー・ストキャスティクス(メイン=%D、シグナル=Slow%D ) extern int StochasticSlowing=3; //損切した場合、次のエントリーは120分(7200秒)以上経過してから行う extern int entryWaitTime=7200; datetime _lastEntryTime=TimeCurrent(); int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double D_Line_1=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,1); double D_Line_2=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,2); double macd_main_1=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_MAIN,1); double macd_signal_1=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,1); double macd_main_2=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_MAIN,2); double macd_signal_2=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,2); //現在の足をリアルタイムでみるのでなく、確定した足で確認する bool isUnderLowStochastic=D_Line_2<LowStochastic || D_Line_1<LowStochastic; bool isOverHighStochastic=D_Line_2>HighStochastic || D_Line_1>HighStochastic; //損切して一定時間経過したか確認する bool isWaitTime=TimeCurrent()-_lastEntryTime>entryWaitTime; bool isGoldenCross=macd_main_1>macd_signal_1 && macd_main_2<macd_signal_2; bool isDeadCross=macd_main_1<macd_signal_1 && macd_main_2>macd_signal_2; bool buySignal=isUnderLowStochastic && isGoldenCross && isWaitTime; bool sellSignal=isOverHighStochastic && isDeadCross && isWaitTime; 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); _lastEntryTime=TimeCurrent(); } // 売り注文 if(sig_entry<0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_SELL,Lots,Bid,Slippage,SLpips,TPpips,COMMENT,MAGIC); _lastEntryTime=TimeCurrent(); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ExitPosition(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double D_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,0); double macd_main_1=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_MAIN,1); double macd_signal_1=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,1); double macd_main_2=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_MAIN,2); double macd_signal_2=iMACD(NULL,0,FastMAPeriod,SlowMAPeriod,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,2); //現在の足をリアルタイムでみるのでなく、確定した足で確認する bool isUnderLowStochastic=D_Line_0<LowStochastic; bool isOverHighStochastic=D_Line_0>HighStochastic; bool isOverZero=macd_main_1>0||macd_main_2>0; bool isUnderZero=macd_main_1<0||macd_main_2<0; bool isDeadCross=macd_main_1<macd_signal_1 && macd_main_2>macd_signal_2; bool isGoldenCross=macd_main_1>macd_signal_1 && macd_main_2<macd_signal_2; bool buyExitSignal=isOverHighStochastic||(isOverZero && isDeadCross); bool sellExitSignal=isUnderLowStochastic||(isUnderZero && 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)); } //+------------------------------------------------------------------+ |
結果
プロフィットファクタは1をわずかに超えていますが、十分な利益を出すほどよい成績ではありません。
余計なエントリーを減らせればもう少しよい結果になることが期待されます。
改善点
・トレンドが発生しているタイミングでエントリーするのを控える
・損切を固定値にしない
→直近高値・安値に設定する
関連記事
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)