MQL4でEAを作成する際に困るのが暴騰と暴落のケース。検知する関数を作成してみました。
どんなテクニカル使っても、どんな手法で組んでも仕手が入ると崩れてしまいます。
それを検出して、仕手が入ったらと検知する関数作ってみました。
動かしてみて、ちゃんと検知できたので、たぶんイケてる思います。
仕手の原理
仕手の原理をちゃんと把握しておかないと、プログラム組めません。
有名なトレーダーさんも推奨しているこちらの本を参考にしました。


内容は株だけど、FXやってる方も読んだ方が良いです。仮想通貨やってる方は、絶対読んだ方がよいです(仕手入りまくりなので)
仕手でこういうケースを避けたい
MT4のEAだと、こういうケースですね。テクニカルだけ見ていると、マッチしてしまう。

暴落時も同様です。

これを検知したい。
仕手チェック関数
MQL4で組んでます。
確認はしていませんが、簡単なコードなので、MQL5(MT5)でも動作すると思います。
//+------------------------------------------------------------------+
//| 仕手チェック
//| 引数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は、仕手なし。
//仕手チェック int pump_check_flg = Pump_check(0.7,Ask);
前にお見せしたSMAの短期と長期のゴールデンクロスでの売買トレードに組み込むと(★の箇所)
//・・・省略
//ゴールデンクロスで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敗
対処前と比べると、だいぶ変わったのが分かります。










ご質問はコメント欄からお願いします