これまでの検証用EAを一部改良し、検証可能な方法を増やしました。
新たに試せる手法は、基本となるトレードとして、当日の始値でポジションを持ち、翌日の始値で手仕舞いを行うといったことが可能になります。
これは何に使用するかというと、トレンドの傾向やシグナルを評価するときに比較用の基本データとして使う予定です。
Table of Contents
外部変数の追加
外部変数宣言にて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
検証用EA改良版はこちら
1 ファイル 47.00 KB