これまでの検証用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);
}

