以下は、myPositionが0の場合に、エントリーロジックが真であればロングポジションをエントリーするサンプルコードです。
サンプルコード
// グローバル変数
int myPosition = 0; // 1: ロング, -1: ショート, 0: ポジションなし
// もしmyPositionが0(ポジションなしの場合)
if (myPosition == 0) {
if (/* エントリーロジックをここに記述*/ ) {
int ticket = OrderSend(
Symbol(), // 通貨ペア
OP_BUY, // ロング(買い)
lotSize, // ロットサイズ
Ask, // 現在のアスク価格
slippage, // 許容スリッページ
stopLoss, // ストップロス価格
takeProfit, // テイクプロフィット価格
"comment", // 注文コメント
0, // マジックナンバー
0, // 有効期限(0は期限なし)
clrBlue // チャート上の矢印の色
);
// エントリー結果を確認
if (ticket > 0) {
Print("ロングポジションをエントリーしました: チケット番号=", ticket);
myPosition = 1; // myPositionを更新(ロングポジション保有)
} else {
Print("ロングポジションのエントリーに失敗しました: エラーコード=", GetLastError());
}
}
} else {
// 既にポジションがある場合
Print("既にポジションを保有しています。新規エントリーは行いません。");
}
コード解説
1. myPositionの確認
• myPosition == 0(ポジションがない場合)にのみ、エントリーロジックを実行します。
• myPositionが1(ロングポジション)または-1(ショートポジション)なら、新規エントリーを行わず処理を終了します。
2. エントリーロジック
• 実際のエントリーロジックは条件式に置き換えてください。
3. OrderSend()によるロングポジションエントリー
• 必要なパラメータを指定してロングポジションをエントリーします。
• Symbol(): 現在の通貨ペア。
• OP_BUY: ロングエントリー。ショートはOP_SELL
• Ask: ロングならアスク価格を指定。ショートならBid
• stopLoss/takeProfit: ストップロスとテイクプロフィットを設定。
4. エントリー成功時の処理
• エントリー成功後、myPositionを1に更新してロングポジション保有状態を記録します。
5. エラー処理
• エントリー失敗時にはGetLastError()を使用してエラーコードを確認し、適切な対応を行います。
6. ポジションがある場合の処理
• myPosition != 0の場合、ログに「既にポジションを保有している」と出力してエントリーを行いません。
出力例
• ロングポジションをエントリーした場合:
ロングポジションをエントリーしました: チケット番号=12345
• すでにポジションを保有している場合:
既にポジションを保有しています。新規エントリーは行いません。
• エントリーに失敗した場合:
ロングポジションのエントリーに失敗しました: エラーコード=4756
注意点
1. ロットサイズの設定
• lotSizeはアカウントの資金管理に基づき、適切な値を設定してください。
2. ストップロスとテイクプロフィット
• トレード戦略に応じて、ストップロスとテイクプロフィットを適切に設定する必要があります。
3. エラーハンドリング
• OrderSend()が失敗した場合は、GetLastError()でエラーの原因を特定し、対応してください。
4. エントリーロジックの具体化
• 実際のトレード戦略に応じたロジックを実装してください。
これで、myPositionを活用し、ロングポジションをエントリーする際の基本的なロジックを構築できます。
エントリーに使うOrderSend()関数はOrderClose()関数と異なりOrderSelect()関数は不要です。
そのためOrderSelect()が入っているFor文のなかに記述する必要はありません。
つづく