エラー、バグ、質問 - ページ 1661

 

バグなのか質問なのか、何か訳の分からないことになっている...テスターとデバッガーで起きていることです...EURUSDは問題ないのですが、USDJPYに問題が......。

コードの一部

void funArrPositionTicket(ulong & arrBuy[], int & buySize, ulong & arrSell[], int & sellSize)
{
 double bp, sp;
  buyProfit = 0; sellProfit = 0; buyVolume = 0; sellVolume = 0;
   int i, total = PositionsTotal();
    for(i = 0; i < total; i++)
     {
      if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol)
       {
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          buySize = ArraySize(arrBuy);
           ArrayResize(arrBuy, buySize+1);
            arrBuy[buySize] = (int)PositionGetInteger(POSITION_TICKET);
           buyProfit += PositionGetDouble(POSITION_PROFIT);
          buyVolume += PositionGetDouble(POSITION_VOLUME);
         }
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          sellSize = ArraySize(arrSell);
           ArrayResize(arrSell, sellSize+1);
            arrSell[sellSize] = (int)PositionGetInteger(POSITION_TICKET);
           sp = PositionGetDouble(POSITION_PROFIT);
           sellProfit += sp;
          sellVolume += PositionGetDouble(POSITION_VOLUME);
         }
       }
     }
}/*******************************************************************/

コードで気になるのは、スクリーンショットを見れば一目瞭然ですが...。コードに記されています。

7.39の損失がある売り注文が1つありますが、コードでは損失は0.93だけです。


以下のスクリーンショットの緑色の矢印は、この行でデバッグが停止していることを表しています...



つまり、sl変数には既にPositionGetDouble(POSITION_PROFIT)が設定されています。


QUESTION:なぜこのようなことが起こるのでしょうか?バグなのかパターンなのか、mql5テスター/デバッガーの特殊機能なのか...?

変数spは少し遅れて導入され、最初は変数sellProfitがチェックされ、関数が入力されると0に設定された。

 
Alexey Viktorov:

バグなのか質問なのか、でも何か腑に落ちない...。がテスターとデバッグで発生する...。EURUSDでは問題ないのですが、USDJPYで問題が......。

十数年前のビルドでは、MQLは正常に動作しているのに、ビジュアライザーが1ティック分未来を表示している--という問題があったのだそうです。

次のティックでPositionGetDouble(POSITION_PROFIT)を比較してみてください。ビジュアライザーが以前に表示したものと一致する場合 - 問題はそこにあるのです。スラワは説明を行い、訂正することを約束した。

そうでない場合 - この場合、別のバグがあります。

 
fxsaber:

現在のビルドより十数個前のビルドでは、MQLは正常に動作しているのに、ビジュアライザーが1ティックで未来を表示している-未来が見えないという不具合がありました。

次のティックでPositionGetDouble(POSITION_PROFIT)を比較してみてください。ビジュアライザーが以前に表示したものと一致する場合 - 問題はそこにあるのです。スラワは説明を行い、訂正することを約束した。

そうでない場合 - この場合、別のバグです。

そうかもしれませんが、このコードでは次のティックでのチェックはできません。新店オープン時に1回のみ。また、この値が次のティックのものであるという保証はあるのでしょうか?なし...もう一度やってみました。損失は2.55ですが、デバッガはまだ0.93を表示しています。

でも、祈るばかりです...。テスター5がテスター4よりずっといい...。不具合や操作性の悪さだけが...。このような不具合があるExpert Advisorをどのようにデバッグすればよいのでしょうか?他にどうやって最適化をするんだ?実は、最適化とは自己欺瞞であり、このようないじわるをすれば、嘘八百を並べる程度の自己欺瞞なのです。

デモでテストしてみないと...。何週間も...

 

ビジュアライザーが無意味なことを表示したからといって、テスター自体が間違っているわけではありません。テスターは可視化の問題など、まったく気にしていない。

TickValue を使って利益サイズを計算し、POSITION_PROFIT と比較します。すべてが同じであることがおわかりいただけると思います。可視化にはバグがあるようです。

 
fxsaber:

ビジュアライザーが無意味なことを表示したからといって、テスター自体が間違っているわけではありません。テスターは可視化の問題など、まったく気にしていない。

TickValue を使って利益サイズを計算し、POSITION_PROFIT と比較します。すべてが同じであることがおわかりいただけると思います。可視化にはバグがあるようです。

はい、質問を投稿する前に計算し直しました。スクリーンショットから再計算できるのは事実のようです。理由があってチェックするようになったわけではありません。損切りは、テイクプロフィット終了時に予想される利益につながるロットサイズに基づいて計算されます。EURUSDではすべて正しく計算されていたのに、USDJPYで突然損失がカバーされなくなった...。配合を確認し始めたら...。と、このバグにたどり着きました。ビジュアライザーは関係ないことがわかりました。

 
Alexey Viktorov:

はい、質問を投稿する前に数えました。スクリーンショットから再計算することができるようです。理由があってチェックを始めたわけではありません。損失は、予想される利益がテイクでクローズされるロットの大きさに基づいて計算されます。EURUSDではすべて正しく計算されていたのに、USDJPYで突然損失がカバーされなくなった...。配合を確認し始めたら...。と、このバグにたどり着きました。ビジュアライザーは関係ないことがわかりました。

申し訳ないが、あなたの言いたいことについていけない。テスターとビジュアライザー、どちらがバグだと思いますか?
 

Script1.mq5 のコンパイルに失敗しました。

//Script.mqh
typedef void (*fn)();
#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void h();
        void h( fn );
#import
class A {
public:
        void f1() { h( g ); } //Error: #1 - no one of the overloads can be applied to the function call
                              //Error: #2 - cannot resolve function address
        void f2() {    g(); } //нормально (*)
        void f3() { Print( __FUNCTION__ ); }
};
//Script1.mq5
#property library
#include "Script.mqh"
void g() export
{
        A a;
        a.f3();
}

エラーその1。ここではシグネチャによってhコールが曖昧にならないようにしています。

エラーその2。A::f1() では g の意味で h( g ) を呼び出すことは曖昧に見えますが、一方 A::f2() ではコンパイラは g() に関して余計な質問をしません (正しくそうします。少なくとも、関数宣言を 含むヘッダーファイルをモジュールに含めて その実装とモジュールでの利用を行うという当初の問題は、かなり前に解決されました)。それに、Script.mqhは一般的なヘッダーファイルなので、それ以外の書き換えは困難です

 
fxsaber:
申し訳ないが、あなたの言いたいことは理解できない。テスターとビジュアライザー、どちらが悪いと思いますか?

もし、真実に近い値を表示しても、間違ったデータを使って計算しているなら、問題はmql5にあり、テスターやビジュアライザーにあるわけではありません。

全体として、ご意見ありがとうございました。長い目で見て、この問題に打ち勝ちたいと思います。そして、今日、別の似たような通貨を確認する予定です。もしかして、その場所でのダニの問題で、hhz?

 

なぜ警告が平然と出ているのか?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
プロフェッショナルの皆様、よろしくお願いします。エキスパートアドバイザーは、3本のバーから10000本以上のバーまで幅広い範囲で変更可能なインジケーターのシグナルによって動作します。インジケーター自体は単体で問題なく動作し、この範囲内であれば期間の変化にも十分に反応します。しかし、Strategy TesterのExpert Advisorは1002本以上の設定を受け付けず、「Zero Divide」と報告されます。何が問題なのでしょうか?Expert Advisor のコードに制限は見当たりません。