MT4 StrategyTesterのOrderSelect関数の不思議?


以前以下のような記事を書きましたが、もう少し原理がわかりました。(2012/11/21 追記)
OrderSelectコマンドのインデックス管理が、実行中にコマンド(約定、決済等)が実行
されるとインデックスが更新されるのが仕様のようです。(最初の書き方だと、最初の
インデックスが決済された時インデックスが更新されて、次のインデックスが一つ減った
状態になっているようです)
つまり、最初の誤動作をする書き方では実際にも誤動作する可能性が大きいので注意
した方がよく、2つ目の書き方の方が良さそうです。


いきなりですが、MT4のStrategyTesterのバグと思われる現象がありました。
OrderSelect関数が上手く動作しない場合がありました。尚Build432でも残って
いるのでまだ解決されていない気もします。(FXCM用だけかもしれません)
#プログラムの他の部分とも絡んでいそうで、プログラム依存があるのかもしれません。
#最後にも書きましたが、これは仕様(最近の?)かもしれませんwww



以下のような関数で、strategyTesterで指定MagicNumberの買いまたは売りの全てのポジションを決済します。




void BuySellClose(bool BuyFlag, bool SellFlag){
if(BuyFlag || SellFlag){
for (int i=0; i




でこれを実行した結果の一部が以下です。



これを見るとわかりますが?、ポジションの一部が残ってしまっています。
ただ、これが発生するケースがわかっていません。



で決済だけなら、以下のように書けばこのバグは回避出来ます。




void BuySellClose(bool BuyFlag, bool SellFlag){
if(BuyFlag || SellFlag){
int i;
int BuyCount=0,SellCount=0;
while(true){                   //<−ここがポイント
BuyCount=0;SellCount=0;
for (i=0; i


ポジションが無くなるまで無限ループってやると上手くいきます。



このバグはOrderSelect関数の動作から考えると、StrategyTeserのバグ(仕様???)で
実際のサーバーの動作では問題がないのでは?と思ったりしています。



後日談・・・というかここまで書いてちょこっと確認

mql4.comを見てみると・・・・while(残数チェック)と同じような事をやっているのがあった・・・これって仕様だったの??????
でも、最初のような記述方法のもある??? 単に実時間で、ペンディングされているオーダーの時間関係が無い為の対応????