FX自動売買の戦略:最高値・最安値ライン越えによる効果的なエントリーポイント

スポンサーリンク

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段階で検証しています。
なかなか良い結果になっていると思います!!

スポンサーリンク
海外FXキャッシュバック口座開設ならTariTali(タリタリ)

コメント

  1. […] 今回作成してもらったEAは、こちらの記事「[EA作成]直近一定期間の最高値・最安値ライン越えでエントリー」で作成した、一定期間の最高値・最安値ライン越えでエントリーするEAです。 […]

タイトルとURLをコピーしました