|
ボリンジャーバンドの+2σで売り−2σで買いのインジケータは出来たのですが、エキスパートプログラムがうまく動きません。
プログラムの特徴は、外部変数の BufBuyPrice と BufSellPrice で現在の買いと売りの値を持たせ、決済すると0にして、2重に買いや売りにならないようにしています。
そして、Visual modeにチェックを入れて、バックテスト実行すると、最初の+2σで売りが行われ、次の−2σで買いが実行されるのですが、その次の+2σでは売りが入らず、数個先の+2σでやっと売りが入り、その後は、売りも買いもいくつも抜けてしまいます。
システムは121証券を使っています。
どうしたら、うまくいくでしょうか?
//------------------------------
// エキスパートプログラム
//------------------------------
//マジックナンバー
#define MAGIC 20100203
//パラメーター
extern double Lots = 0.1; //売買ロット数
extern int Slippage = 30; //スリッページ
extern int BandsPeriod = 20;
extern int BandsDeviation = 2;
double BufBuyPrice=0; //買い値 (0の場合は現在買い無し)
double BufSellPrice=0; //売り値 (0の場合は現在売り無し)
//+------------------------------------------------------------------+
//| ポジションを決済する |
//+------------------------------------------------------------------+
void ClosePositions()
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break;
if(OrderMagicNumber() != MAGIC || OrderSymbol() != Symbol()) continue;
//オーダータイプのチェック
if(OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
break;
}
if(OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
break;
}
}
}
//+------------------------------------------------------------------+
//| スタート関数 |
//+------------------------------------------------------------------+
int start()
{
//ボリンジャーバンドの計算
double BufUpper0 = iBands(NULL, 0, BandsPeriod, BandsDeviation, 0, PRICE_CLOSE, MODE_UPPER, 0);
double BufLower0 = iBands(NULL, 0, BandsPeriod, BandsDeviation, 0, PRICE_CLOSE, MODE_LOWER, 0);
//買いシグナル
if(BufBuyPrice == 0 )
{
if(Low[0]<BufLower0)
{
//買い実行
ClosePositions();
OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",MAGIC,0,Blue);
BufBuyPrice = BufLower0;
BufSellPrice = 0;
}
}
//売りシグナル
if(BufSellPrice == 0)
{
if(High[0]>BufUpper0)
{
//売り実行
ClosePositions();
OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",MAGIC,0,Red);
BufSellPrice = BufUpper0;
BufBuyPrice = 0;
}
}
return(0);
}
|
|