atc2007

今回は、「自動売買チャンピオンシップ2007」で第5位に入賞し3ヶ月弱で$10000を約3.7倍にしたzyx40さんが使用したEAの基となったEAの読解後編です。zyx40さんはご自身の考えをこのEAにプラスしてカスタマイズしたそうです。

前回記事【自動売買チャンピオンシップ2007第5位のEA[読解前編]】へ

start()関数内の処理

前回の続きで、今回はstart()関数内の処理を見ていきます。

翌日の取引を許可する処理?

次のコードで、パラメーター変数TradeTimeは、取引する時間(初期値18時台)です。のちほど分かりますが18時台に取引注文したらcantradeをfalseにするので、18時台を過ぎ(19時台になっ)たら、グローバル変数cantradeをtrueにして翌日の取引を許可するようにしています。

   if (TimeHour(TimeCurrent()) > TradeTime) cantrade = true;

TradeTimeを23にした場合は、翌日の取引が許可されないままなので、次のコードのようにしたほうがよさそうです。

   if (TimeHour(TimeCurrent()) != TradeTime) cantrade = true;

保有ポジション数取得

このEAは1口座1EAで手動での取引もしないという前提で書かれていますので参考程度に見てください。次のコードで変数totalに保有ポジション数が格納されます。

   int total = OrdersTotal();

エントリー判定とエントリー注文

次にエントリー処理部分がありますので、一気に見ていきます。

   if (total < Orders)
   {
      if (TimeHour(TimeCurrent()) == TradeTime && cantrade)
      {
         if (Open[t1] - Open[t2] > delta_S * Point)
         {
            if (AccountFreeMarginCheck(Symbol(), OP_SELL, lot) <= 0 || GetLastError() == 134)
            {
               Print("Not enough money");
               return(0);
            }
            
            OpenShort(lot);
            cantrade = false;
            return(0);
         }
         
         if (Open[t2] - Open[t1] > delta_L * Point)
         {
            if (AccountFreeMarginCheck(Symbol(), OP_BUY, lot) <= 0 || GetLastError() == 134)
            {
               Print("Not enough money");
               return(0);
            }
            
            OpenLong(lot);
            cantrade = false;
            return(0);
         }
      }
   }
もし 保有ポジション数がパラメーターOrdersより少ない場合で、
現在の時間が[TradeTime]時台で cantradeがtrueなら、
{
 [t1]本前の始値 - [t2]本前の始値 が[delta_S]ポイントより大きい場合、
 {
  証拠金不足の場合は、Not enough moneyと出力してstart()関数終了。
            
  lotロットで売り注文
  cantrade に falseを代入
  start()関数終了。
 }
         
 [t2]本前の始値 - [t1]本前の始値 が[delta_L]ポイントより大きい場合、
 {
  証拠金不足の場合は、Not enough moneyと出力してstart()関数終了。
            
  lotロットで売り注文
  cantrade に falseを代入
  start()関数終了。
 }
}

決済処理

最後に、パラメーターMaxOpenTimeによる決済処理が次のように書かれています。

   if(MaxOpenTime > 0)
   {
      for (int cnt=0; cnt= 0)
            {
               RefreshRates();
               if (OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrGreen)) OrderPrint();
            }
         }
      }
   }

MaxOpenTimeに0より大きい値があれば、MaxOpenTime時間以上保有したポジションは決済するという処理です。

あとがき

エントリー時間を決めて、その時の過去数時間の始値の差で売りor買いを決める。ポジションには寿命がある。といった売買ルールですね。
次回は、パラメータをどう変えたらいいのかなどを書きたいと思います。