分かりにくい2つの制限
MQL4で長らく曖昧に理解していたStopLevelとFreezeLevel。ようやく正しい仕様を理解できました。というか、ちゃんとMQL4のサイトに定義がありましたorz
Requirements and Limitations in Making Trades
「ここに記載されている表の条件を満たしなさい。そうしないと注文エラーになりますよ。」ということです。例えば、StopLevelのBuyポジションの場合、損切り価格(SL)は、「Bid-SL ≥ StopLevel」を満たしなさいという意味です。
StopLevelはMarketInfo(Symbol(), MODE_STOPLEVEL)、FreezeLevelはMarketInfo(Symbol(), MODE_FREEZELEVEL)で取得できます。なお、StopLevelとFreezeLevelはポイント値ですので、比較式を作る時は注意(比較する側される側、どちらもポイントに換算するか価格に換算するか)が必要です。
ずっとモヤモヤしていた問題が1つ解決できました!
今まで掲載していたorderSendReliable()とorderModifyReliable()を一部見直さないといけませんね。この記事を公開したら、すぐ書き直そうっと。
余談ですが、MarketInfo(Symbol(), MODE_STOPLEVEL)とAccountStopoutLevel()は、字面が似ていますが意味が全然違います。前者は上記の通り、通貨ペアごとの仕掛けの制限を表します。後者は、FX業者の強制ロスカット率を表します。お間違えのないように。