前回Step3のサンプルコード内で、まずfor文を回して、OrderSelect()関数を用いてポジションの有無を確認しました。
なぜそんな必要があるのか?というと、OrderClose()関数を正確に実行するために必要な情報があるからです。
bool OrderClose(
int ticket, // 決済するポジションのチケット番号
double lots, // 決済するロット数
double price, // 決済価格(ロングの場合はビッド価格、ショートの場合はアスク価格)
int slippage, // 許容スリッページ(ピップ単位)
color arrow_color // チャート上に表示する矢印の色
);
まずどのポジションを決済するのかを指定するためにチケット番号というものが必要になります。これは別のStepで登場予定のマジックナンバーとも違う番号で、取引のたびに発行される自動付与の番号になります。
これをプログラマーが一つ一つ指定することは困難であるため、for文で回したOrderSelect()関数で、ヒットしたポジションのチケット番号をOrderTicket()関数で自動的に呼び出すことで
特定のポジションを決済するのかどうかをif文で決定するという手順を踏むのが安定した EAを記述することにつながります。
OrderSelect()関数呼出後に使用可能な関数について復習するならStep2.1 OrderSelect()関数の補足を参照してください。
まとめ
- OrderClose()関数にはチケット番号が必須
- チケット番号はOrderTicket()関数から指定可能
- OrderTicket()関数はOrderSelect()関数でポジションを特定した時にしか使えない
- OrderSelect()/OrderTicket()/OrderClose()のコンボを一連の流れとして身につける