MQL4でEAを作成する際に困るのが暴騰と暴落のケース。検知する関数を作成してみました。
どんなテクニカル使っても、どんな手法で組んでも仕手が入ると崩れてしまいます。
それを検出して、仕手が入ったらと検知する関数作ってみました。
動かしてみて、ちゃんと検知できたので、たぶんイケてる思います。
仕手の原理
仕手の原理をちゃんと把握しておかないと、プログラム組めません。
有名なトレーダーさんも推奨しているこちらの本を参考にしました。
内容は株だけど、FXやってる方も読んだ方が良いです。仮想通貨やってる方は、絶対読んだ方がよいです(仕手入りまくりなので)
仕手でこういうケースを避けたい
MT4のEAだと、こういうケースですね。テクニカルだけ見ていると、マッチしてしまう。
暴落時も同様です。
これを検知したい。
仕手チェック関数
MQL4で組んでます。
確認はしていませんが、簡単なコードなので、MQL5(MT5)でも動作すると思います。
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 |
//+------------------------------------------------------------------+ //| 仕手チェック //| 引数1 検知価格差: double max_check_kakaku //| 引数2 現在のAsk or Bid : double my_now //| 戻り値 1=仕手あり 0=なし //+------------------------------------------------------------------+ int Pump_check(double max_check_kakaku,double my_now){ int ret = 0; int min_array_no = 0; int max_array_no = 0; double my_array[16]; double my_kakakusa = 0; //配列に過去の終値をセット for(int i = 0; i < 15; i++){ my_array[i] = Close[i+1]; } my_array[15] = my_now; //最小の配列番号 min_array_no = ArrayMinimum(my_array,WHOLE_ARRAY,0); //最大の配列番号 max_array_no = ArrayMaximum(my_array,WHOLE_ARRAY,0); //期間内の価格差 my_kakakusa = my_array[max_array_no] - my_array[min_array_no]; //パンプチェック if(my_kakakusa >= max_check_kakaku){ ret = 1; }else{ ret = 0; } return ret; } |
使い方
呼び出して、1が返ってくれば仕手あり。0は、仕手なし。
1 2 |
//仕手チェック int pump_check_flg = Pump_check(0.7,Ask); |
前にお見せしたSMAの短期と長期のゴールデンクロスでの売買トレードに組み込むと(★の箇所)
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 |
//・・・省略 //ゴールデンクロスでBUYエントリー if((sma_short_before < sma_long_before) && //1バー前の短期移動平均線が長期移動平均線より小さい (sma_short_now >= sma_long_now) && //今の短期移動平均線が長期以上? (sma_short_now < Ask) && //20SMAよりASKが大きい (damashi_chk >= 0.65) && //騙し対処 (pump_check_flg != 1) && //★仕手チェック flg_buy == 0){ ClosePositions_SELL(); // レートのリフレッシュ RefreshRates(); losscut_normalize = NormalizeDouble(Ask*(1-SLrate),trade_digit); profit_normalize = NormalizeDouble(Ask*(1+Profitrate),trade_digit); //成り行きbuyオーダー OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,losscut_normalize,profit_normalize,"Buy order",MAGIC,0,clrOrangeRed); //フラグON flg_buy = 1; } //・・・省略 |
仕手チェック関数のアルゴリズム
直前の15本のバーの終値と、現在の値(Ask or Bid)の最小と最大の価格差をチェックします。10本だと短すぎて、20本だと多いので、ちょうどよいのがこのくらいでした。
前のバーだけでなく、今現在のTickで超暴騰、暴落しているケースもあったので、買いの時はAskを、売りの時はBidを引数で渡して含めました。
価格差は、通貨ペア、見ている足によって変わるので、それも引数で渡せるようにしました。
例えば、USDJPYの1時間足であれば、0.7円くらい。0.5円だと検知しすぎてトレード出来なくなります
組み込んでみた結果
前に公開した「20SMAの短期、長期のゴールデンクロスでエントリーする」っていうEAに組み込んでみました
2019年のデータで、USDJPYペアの1時間足での結果は以下のとおり。
- USDJPY1時間足でテスト
- 10000$スタートで、+137$の黒字
- 勝率100%
- 7勝0敗
対処前と比べると、だいぶ変わったのが分かります。
ご質問はコメント欄からお願いします