目次
MQL4におけるfor文とは?
MQL4のfor文は、指定した回数だけ繰り返し処理を行うための制御構文です。主な特徴は以下の通りです。
- 基本構文
for (初期化; 条件式; 更新式) {
// 繰り返し実行したい処理
}
- 使用例
for (int i = 0; i < 10; i++) {
Print(i);
}
- 主な用途
- 配列の要素を順に処理する
- 一定回数の繰り返し処理を行う
- チャートデータを遡って処理する
- 特徴
- 初期化、条件チェック、更新を1行で記述できる
- カウンタ変数のスコープをループ内に限定できる
- 繰り返し回数が明確な場合に適している
- 応用
- break文でループを途中で抜ける
- continue文で現在の繰り返しをスキップして次に進む
- ネストして使用することも可能
for文を使いこなすことで、効率的なEAやインジケーターの開発が可能になります。特に、過去のデータを分析したり、複数のポジションを管理したりする際に非常に有用です。
サンプルコード
MQL4でfor文を使用して複数のポジションをすべて決済するサンプルコード(オリジナル関数)を以下に示します。
void CloseAllPositions()
{
int total = OrdersTotal();
for(int i = total - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
int type = OrderType();
// 現在のシンボルのポジションのみを対象とする
if(OrderSymbol() == Symbol())
{
bool result = false;
// 買いポジションの場合
if(type == OP_BUY)
{
result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, clrRed);
}
// 売りポジションの場合
else if(type == OP_SELL)
{
result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 3, clrBlue);
}
if(!result)
{
Print("OrderClose error: ", GetLastError());
}
else
{
Print("Position closed: ", OrderTicket());
}
}
}
}
}
コードの説明
OrdersTotal()
関数を使用して、現在のオープンポジションの総数を取得します。- for文を使用して、すべてのオープンポジションをループ処理します。ループは最新のポジションから開始するため、逆順(total – 1から0まで)で処理します。
OrderSelect()
関数を使用して、各ポジションを選択します。- 現在のシンボル(通貨ペア)のポジションのみを対象とするため、
OrderSymbol() == Symbol()
で確認します。 - ポジションのタイプ(買いまたは売り)に応じて、適切な決済価格(BidまたはAsk)を使用します。
OrderClose()
関数を使用してポジションを決済します。- 決済が成功したかどうかを確認し、エラーが発生した場合はエラーメッセージを出力します。
このコードを実行すると、現在のシンボルに関するすべてのオープンポジションが決済されます。必要に応じて、特定のマジックナンバーを持つポジションのみを決済するなど、条件を追加することもできます。