検証用EAの改良

これまでの検証用EAを一部改良し、検証可能な方法を増やしました。

新たに試せる手法は、基本となるトレードとして、当日の始値でポジションを持ち、翌日の始値で手仕舞いを行うといったことが可能になります。

これは何に使用するかというと、トレンドの傾向やシグナルを評価するときに比較用の基本データとして使う予定です。

外部変数の追加

外部変数宣言にて2つ変数を追加しました。

extern bool ReverseClose = true;       // 反対シグナル発生時のポジションクローズ
extern int Setup = 0;                  // 0:買いセットアップ確認、1~セットアップ確認しない

オーダー処理の追加

シグナルチェックのほかにセットアップチェックを加えました。セットアップとはチャートの状態を確認するためのものです。今回はボリンジャーバンド1シグマ超えの場合、1を返します。引数にSetupを使っていて1のときは常に1を返します。

if( iBuyCnt < MaxPosition && (MarketInfo(Symbol(),MODE_SPREAD) < iSpread) && iOrderCheckBuy == 0 ){   // 買いポジション数、スプレッドの確認
      if((signalchk(0) == 1) && (setupchk(Setup)==1))                                                        // セットアップの確認
        {
            if( ReverseClose == true ){
               CloseAllSellOrders(Symbol(), Magic, iSlippage);                                           // 売り注文クローズ
            }

ReverseCloseがtrueのときは反対ポジションを全て閉じます。falseのとき、反対ポジションをそのままにします。

時間によるクローズの改良

これまでは指定時間経過となったポジションを閉じるとき、全てクローズ処理を実行していましたが、ポジション一つずつの時間を計測し、個別にクローズ処理を行うように変更しました。

               int CloseTicket = OrderTicket();
               double CloseLots = OrderLots();
               double ClosePrice = MarketInfo(Symbol(),MODE_BID);
               bool Closed;
               comptime = OrderOpenTime();                                                               // ポジションを建てた時間の取得
               /* 必ずクローズする時間  */
               if( (iBarShift(NULL,0,comptime,false)*Period()) >= (Closetime*Period()) ){                // ポジション時間からバー経過数へ変換し、クローズ時間と比較
                     if( OrderType() == OP_BUY ){
                        Closed = OrderClose(CloseTicket,CloseLots,ClosePrice,iSlippage,Red);
//                        CloseAllBuyOrders(Symbol(), Magic, iSlippage);                                   // 買い注文クローズ
                     }else if( OrderType() == OP_SELL ){
                        ClosePrice = MarketInfo(Symbol(),MODE_ASK);
                        Closed = OrderClose(CloseTicket,CloseLots,ClosePrice,iSlippage,Red);
//                        CloseAllSellOrders(Symbol(), Magic, iSlippage);                                  // 売り注文クローズ
                     }
               }

セットアップ関数の追加

ボリンジャーバンド+1シグマを基準とし、価格が+1シグマを超えていれば1を返します。またカウンターシグナル指定のときは価格が-1シグマのときを下回るときに1を返します。

int setupchk(int sel)
{
   int ret = 1;
   double dIndiVal[INDIVAL_CNT];
   ArrayInitialize(dIndiVal,0);

   if(sel > 0 ){
      return(1);
   }
   if( ZscoreCounterTrend == 0 ){
      dIndiVal[0] = iBands(NULL, 0, BandsPeriod, BandsDeviation, 0, PRICE_CLOSE, MODE_UPPER, 1);   // UPPER
      dIndiVal[1] = iClose(NULL,0,1);
      dIndiVal[2] = iBands(NULL, 0, BandsPeriod, BandsDeviation, 0, PRICE_CLOSE, MODE_LOWER, 1);   // LOWER
      dIndiVal[3] = iClose(NULL,0,1); 
   }else{
      dIndiVal[0] = iClose(NULL,0,1);
      dIndiVal[1] = iBands(NULL, 0, BandsPeriod, BandsDeviation, 0, PRICE_CLOSE, MODE_LOWER, 1);   // LOWER
      dIndiVal[2] = iClose(NULL,0,1);
      dIndiVal[3] = iBands(NULL, 0, BandsPeriod, BandsDeviation, 0, PRICE_CLOSE, MODE_UPPER, 1);   // UPPER
   }
   if( sel == 0 ){
      if(dIndiVal[0] < dIndiVal[1]){                                                               // 買いセットアップの確認
         ret &= 1;
      }else{
         ret = 0;
      }
   }else{
      if(dIndiVal[2] > dIndiVal[3]){                                                               // 売りセットアップの確認
         ret &= 1;
      }else{
         ret = 0;
      }
   }
   return(ret);
}

改良後EA

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です