以下は、要件に基づいて記述されたMQL5のEAの例です。これは、ボリンジャーバンドとCCIを使用して取引を行い、指定された条件に従って売買を行います。EAのパラメーターとして、ロットサイズとボリンジャーバンドのパラメーターを変更することができます。
```mql5
// パラメーター
input double LotSize = 0.03; // ロットサイズ
input int BB_Period = 20; // ボリンジャーバンドの期間
input double BB_Deviation = 2.0; // ボリンジャーバンドの偏差
// グローバル変数
double UpperBand[];
double LowerBand[];
int positions = 0;
// 初期化関数
int OnInit()
{
// ボリンジャーバンドの計算
ArraySetAsSeries(UpperBand, true);
ArraySetAsSeries(LowerBand, true);
int limit = Bars - BB_Period - 1;
for (int i = 0; i < limit; i++)
{
double sum = 0.0;
for (int j = 0; j < BB_Period; j++)
{
sum += Close[i + j];
}
double sma = sum / BB_Period;
double sumsq = 0.0;
for (int j = 0; j < BB_Period; j++)
{
sumsq += MathPow(Close[i + j] - sma, 2);
}
double stdDev = MathSqrt(sumsq / BB_Period);
UpperBand[i] = sma + BB_Deviation * stdDev;
LowerBand[i] = sma - BB_Deviation * stdDev;
}
return(INIT_SUCCEEDED);
}
// エントリーポイント関数
void OnTick()
{
if (positions == 0)
{
// トレンドの確認
double cci = iCCI(NULL, 0, 14, PRICE_TYPICAL, 0);
bool isUptrend = cci > 0;
// ボリンジャーバンドのタッチ確認
bool isUpperTouch = High[1] < UpperBand[1] && High[0] >= UpperBand[0];
bool isLowerTouch = Low[1] > LowerBand[1] && Low[0] <= LowerBand[0];
if (isUptrend && isUpperTouch)
{
// 買いポジションに入る
double stopLoss = Low[0] - (UpperBand[0] - LowerBand[0]);
double takeProfit = High[0] + 2 * (UpperBand[0] - LowerBand[0]);
int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, stopLoss, takeProfit);
if (ticket > 0)
{
positions = 1;
}
}
else if (!isUptrend && isLowerTouch)
{
// 売りポジションに入る
double stopLoss = High[0] + (UpperBand[0] - LowerBand[0]);
double takeProfit = Low[0] - 2 * (UpperBand[0] - LowerBand[0]);
int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, stopLoss, takeProfit);
if (ticket > 0)
{
positions = -1;
}
}
}
else if (positions != 0)
{
// ポジションの決済
if (positions == 1)
{
double closePrice = Bid;
double stopLoss = closePrice - 2 * (UpperBand[0] - LowerBand[0]);
double takeProfit = closePrice + (UpperBand[0] - LowerBand[0]);
bool closeOrder = OrderClose(OrderTicket(), OrderLots(), closePrice, 3, Red);
if (closeOrder)
{
// 残りの半分を決済
int ticket = OrderSend(Symbol(), OP_SELL, LotSize / 2, Bid, 3, stopLoss, takeProfit);
if (if (ticket > 0)
{
positions = -1;
}
}
}
else if (positions == -1)
{
double closePrice = Ask;
double stopLoss = closePrice + 2 * (UpperBand[0] - LowerBand[0]);
double takeProfit = closePrice - (UpperBand[0] - LowerBand[0]);
bool closeOrder = OrderClose(OrderTicket(), OrderLots(), closePrice, 3, Red);
if (closeOrder)
{
// 残りの半分を決済
int ticket = OrderSend(Symbol(), OP_BUY, LotSize / 2, Ask, 3, stopLoss, takeProfit);
if (ticket > 0)
{
positions = 1;
}
}
}
}
}
```
このコードは、指定された条件に基づいてボリンジャーバンドとCCIを使用して売買を行います。ただし、注意点として、このコードはあくまで例示であり、実際の取引に使用する前に充分なテストと検証を行うことを強くお勧めします。また、取引戦略やリスク管理には個別の要件や考慮事項があるため、必要に応じてカスタマイズする必要があります。