ご訪問ありがとうございます。
元スーパー店員で不労所得生活を目論むひろしです。
前回
TrimPipsお試し版をリリースし
MQL5版に取り組んでいたのでが。。。
ありがたい報告をいただきました。
えーーー?
いやいや、まさかそんなことはないでしょう。
と思い再現テストを行いましたが
再現しません。
そこで、キャプチャ画像を依頼したところ
いかの画像が送られてきました。
確かに、SLとTPがとんでもない値になっています。
とはいえ、
ひろし:「再現しないからなー」
と思いつつ、「BIGBOSS」のMT4で
いろいろ触っていると再現しました。
しかしながら、正しいときもあり
異常になるタイミングがわかりません。
こういう、時々しか再現しないバグと
いうのは、ナカナカ厄介です。
で、なんとなく成行注文を連続
すると発生することがわかりました。
で、ログを見ると。。。。
Point()という関数で取得する値が
通常は、0.000010なのですが
時々、0.001000となるのです。
Point()関数は、小数点以下の桁数を
取得するもので、
注文価格は、以下のように
Point()を掛け算して算出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//選択した注文の注文価格 if(OrderType() == OP_BUY) { limit_rate = OrderOpenPrice() + (10 * Point() * input_TP); // リミット価格 = 約定価格 + 10.0pips stop_rate = OrderOpenPrice() + (10 * Point() * input_SL); // ストップロス価格 = 約定価格 - 10.0pips } else { limit_rate = OrderOpenPrice() - (10 * Point() * input_TP); // リミット価格 = 約定価格 + 10.0pips stop_rate = OrderOpenPrice() - (10 * Point() * input_SL); // ストップロス価格 = 約定価格 - 10.0pips } limit_rate = NormalizeDouble(limit_rate, Digits()); // リミット価格 を正規化 stop_rate = NormalizeDouble(stop_rate, Digits()); // ストップロス価格を正規化 |
なので、Point()関数の戻り地が100倍違うと
以下のように指値も100倍違ってきます。
結論として
プログラム的には正しいのですが、
「BIGBOSS」でときどきPointが正しく取得できない
という、厄介な問題なのです。
とここで金曜も終わり週末はテストできないので時間切れとなりました。
———2021/04/15追記———-
MQL5対応中に原因が判明しました。
複数の通貨で同時に動かしている際に
同様の現象が発生しました。
ログを見ると、本来EURJPYでのみ
機能スべきものが他の通貨ペアで
操作していました。
ようするに、プロコン動作時の通貨ペアか
どうかの判別が抜けていたわけです。
この辺は、MT5になりソースの項目が
追加されたので、判明しました。
簡単なバグなのですが、残念ながら
ソースを見ていてもわからなかったと
思います。
本来なら机上デバッグと言って
ソースとにらめっこして動作を
精査する必要があります。
これは、とても重要な作業なのですが
ぶっちゃけつまらないし、頭を
かなり使うのでほとんどやっていません^^
それが、簡単にわかったのですから
MQL5(MT5)対応さまさまです。
他にも、MQL5は、コンパイルすると
TrimPips自体を再起動しなくても
動作が反映されるのでとても便利です。
というわけで、MQL5対応により
バグが判明したというわけです。
マインドセットします。
すべての物事には良い目的がある
私の座右の銘です。
今回の場合、MQL5対応はそれなりに
意味のあることですが、一見ネガティブに
思える事象も必ず良い目的があります。
これからも常に意識して
やっていこうと誓ったのでした。
つぎはこちら
コメント