FX自動売買において、最高値と最安値のラインを超える瞬間は、トレーダーにとって重要なサインとなり得ます。この記事では、直近一定期間の最高値・最安値ライン越えによるエントリー戦略と、その有効性について詳しく解説します。
最高値・最安値ライン越えの重要性
最高値・最安値のラインは、市場のトレンド変化を示唆する強力なインジケーターです。特に自動売買では、これらのポイントを基にエントリーすることで、高い確率で利益を獲得するチャンスが生まれます。
(1)トレードプログラム(EA)のロジック
具体的なエントリー戦略
この戦略では、直近の最高値または最安値ラインを超えた瞬間にエントリーを行います。例えば、価格が直近の最高値を超えた場合はロングポジションを、最安値を下回った場合はショートポジションを取る戦略です。
チャート分析による実例
実際のチャートを用いて、この戦略がどのように機能するかを示します。以下のチャートは、価格が最高値ラインを超えた瞬間にロングポジションを取り、その後の価格上昇を捉えている例です。
青線が直近の高値で、足確定(Close)のタイミングでその高値を超えていたら、エントリー(上記では買い)です。その後、そのまま上昇し、決済指値に達したらポジションクローズです。このチャートは、まさに理想的な動きですね。
超えた高値ライン(レジスタンスライン)がその後にはサポートラインとなり、跳ね返って、勢いよく上昇しています。
以下はこのトレードプログラム(EA)のソースコードです。私はこのような感じでこのロジックを再現しました。
「自動売買プログラム(EA)フォーマット」で記載したEAプログラムフォーマットをベースに作成しています。
こちらに記載している内容については省略しています。
プログラム経験者(C言語とか)、もしくは、ちょっとプログラムの勉強をしたら、使っているMT4で用意されている関数の仕様をHelpやネット検索で調べれば、比較的簡単に分かるレベルなのではないかと思います。
#define COMMENT_HL "TRADE_HL_1-1"
/// 外部パラメータ
extern int MagicNo = 10000001;
extern double Lots = 0.1;
extern int Slippage = 3;
extern int timeframe_Hl = PERIOD_M15; // timeframe
extern int CheckStart_Hl = 1; //水平ラインのチェック開始位置
extern int CheckPeriod_Hl = 3; //水平ラインのチェック期間
extern double RegOpen_Hl = 10; //足の長さ(勢いの確認)
extern double ClosePrice_Hl = 300; //決済逆指値
extern double TakePrice_HL = 300; //決済指値
// 内部パラメータ
/* 省略 */
/// ===================
/// トレード用の実装(トレードロジックに依存)
/// ===================
/// 初期化関数 |
int OnInit()
{
/* 省略 */
}
void OnDeinit(const int reason)
{
/* 省略 */
}
// エントリ判定
void EntrySignal(void)
{
// オープンポジションの計算
double pos = OpenOrders(MagicNo);
double open_1 = iOpen(NULL, timeframe_Hl, 1); //1つ前の足の始値
double close_1 = iClose(NULL, timeframe_Hl, 1); //1つ前の足の終値
double high_1 = iHigh(NULL, timeframe_Hl, 1); //1つ前の足の高値
double low_1 = iLow(NULL, timeframe_Hl, 1); //1つ前の足の安値
// CheckStart_HlからCheckPeriod_Hlの期間分の最高値、最安値を取得
double highest =iHigh(NULL, timeframe_Hl, iHighest(NULL, timeframe_Hl, MODE_HIGH, CheckPeriod_Hl, CheckStart_Hl));
double lowest = iLow(NULL, timeframe_Hl, iLowest(NULL, timeframe_Hl, MODE_LOW, CheckPeriod_Hl, CheckStart_Hl));
bool order_buy = False;
bool order_sell = False;
double stop_loss = 0; //決済逆指値
double stop_take = 0; //決済指値
// 買い
if( ( close_1 > highest && highest > low_1 ) // 直近の最高値を超えており
&& (close_1 - low_1) > RegOpen_Hl*Point ){ // かつ、勢いがある(陽線の長さで判定)
// 買い注文を執行する
order_buy = True;
stop_loss = Bid-ClosePrice_Hl*Point; // 決済逆指値を設定(損切)
stop_take = Bid+TakePrice_HL*Point; // 決済指値を設定(利益確定)
}
// 売り
if( ( close_1 < lowest && lowest < high_1 ) // 直近の最安値を超えており
&& (high_1 - close_1) > RegOpen_Hl*Point ){ // かつ、勢いがある(陰線の長さで判定)
// 売り注文を執行する
order_sell = True;
stop_loss = Ask+ClosePrice_Hl*Point; // 決済逆指値を設定(損切)
stop_take = Ask-TakePrice_HL*Point; // 決済指値を設定(利益確定)
}
//買い注文
bool RO = TRUE;
if( order_buy && !ordered_Hl ){
// 買い注文処理
// 売りポジションが残っていたら決済する
if( pos<0 ){
RO = CloseOrder(Symbol(), OP_SELL, Slippage, MagicNo);
}
// 決済が成功したか確認
if( RO ){
// 既に買いポジションを持っていないか確認
if ( pos<=0 ){
// 買い注文発行
if(SendOrder(OP_BUY, Lots, Ask, stop_loss, stop_take, Slippage, MagicNo, COMMENT_HL)){
// 注文完了を保持(すぐにポジションクローズしてしまわないように)
ordered_Hl = true;
order_count_Hl++;
}
}
}
}
//売り注文
if( order_sell && !ordered_Hl ){
// 売り注文処理
// 買いポジションが残っていたら決済する
if ( pos>0 ){
RO = CloseOrder(Symbol(), OP_BUY, Slippage, MagicNo);
}
// 決済が成功したか確認
if( RO ){
// 既に売りポジションを持っていないか確認
if ( pos>=0 ){
// 売り注文発行
if(SendOrder(OP_SELL, Lots, Bid, stop_loss, stop_take, Slippage, MagicNo, COMMENT_HL)){
// 注文完了を保持(すぐにポジションクローズしてしまわないように)
ordered_Hl = true;
order_count_Hl++;
}
}
}
}
}
void OnTick()
{
/* 省略 */
}
(2)このロジックを利用して作成したEA
上で紹介したロジックを利用してEAを作成し、検証を行いました。以下、3段階で検証しています。
なかなか良い結果になっていると思います!!
コメント
[…] 今回作成してもらったEAは、こちらの記事「[EA作成]直近一定期間の最高値・最安値ライン越えでエントリー」で作成した、一定期間の最高値・最安値ライン越えでエントリーするEAです。 […]