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

 
A100:

問題はないのですが...。がエラーになります。また、なぜ説明を引っ張り出そうとするのかも理解できません。 デフォルトのPrintには、以下のような署名があります。

また、(必要に応じて)他の機能とぶつかることもある

印刷署名がMQL5言語の 範囲外です。MQL5でPrintのオーバーロードが一切禁止されても、バグにはならないでしょう。

この「バグ」でTSが作れなくなり、書き込み松葉杖が必要な状態にならないことを祈ります。

 

テスターの性能を測定してみました。そのために、1ティックごとにポジションを建てたり、閉じたりしています。100ティックの実行時間を計測してみました。100 000ティックを走らせました。合計1000ティックを計測しました。こんなグラフができました

その間にほぼ等間隔で減速のスパイクがある。最適化モードで測定してみました。このスパイクを無視すると、テスターの性能は一定の値ではなく、25%変動します。またWindowsのスピード測光のトリックかもしれませんね。


ZZZ MT4で同じコードが動いています。

MT4 TesterはMT5と比較して、1ティックの処理に平均で1.5~2倍の時間を要します。

ファイル:
Tester.mq5  2 kb
 

遺伝的 最適化アルゴリズムの 使用により急増する可能性。


...1ティックごとにポジションをオープン、クローズ。<br /> translate="no">。
MT4-TesterはMT5と比較して、平均して1ティックの処理に1.5~2倍の時間を要します。
そして、これは純粋な操作であり、ミスリードである。
 
Sergey Dzyublik:

遺伝的 最適化アルゴリズムの 使用により急増する可能性。

GAなし。1つのエージェントで2つのパスから最適化。

そして、これはもう純粋な操作であり、ミスリードである。

ソースコードはちゃんとある。

 

一方は警告、もう一方はエラー

void f()
{
    for ( int i = 0;; )
    {
        Print( i );
        int    i = 5; //Warning: declaration of 'i' hides local declaration
        Print( i );
        break;
    }
}
void For( int i = 0 )
    {
        Print( i );
        int    i = 5; //Error: redefinition of formal parameter 'i'
        Print( i );
    }

根本的な違いは何でしょうか?例えばC++の場合、どちらのケースでもエラーが発生します

 

クラスインスタンスへのポインタの問題を理解するために、知識のある人たちに助けを求めています。私には理解できない。

以下は、そのスクリプトの例です。

class A
  {
public :
                     A() { Print("Start"); };
                    ~A() { 
                     Print("End"); 
                     Print(EnumToString(CheckPointer(GetPointer(this)))); 
                     if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC) 
                     delete GetPointer(this);};
  };
  
A a;

void OnStart()
  {
  }

実行すると、予想通りです。

2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


と宣言されている場合、そのクラスのインスタンスは

A *a= new A;

であれば、実行時に私たちは

2018.09.23 21:46:42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

つまり、デストラクタが起動さえしていないため、メモリが解放されないのです。


しかし、あるクラスのインスタンスが宣言された場合。

A a= new A;

コンストラクタは2回、デストラクタは1回起動されますが、メモリは解放されず、POINTER_AUTOMATIC オブジェクトポインタ型になります(POINTER_DYNAMICに するつもりだったのですが)。

2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


デストラクタを常に実行し、deleteを正しく実行する方法

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


C++からスマートポインタの話題を参照し、MQLに適応する(https://habr.com/post/140222/)
kodobaseに何かあるのかも・・・。

 
Sergey Dzyublik:


C++からスマートポインタの話題を参照し、MQLに適応してください(https://habr.com/post/140222/)
kodobaseに何かあるのかも・・・。

ありがとうございます、でも私の質問に対する答えはそこにありませんでした。
A *a= new A のとき、デストラクタが呼ばれないのはなぜか。

 
Nikolai Semko:

ありがとうございました。しかし、そこには私の疑問に対する答えはありませんでした。
A *a= new A のとき、デストラクタが呼ばれないのはなぜか。

では、こんな風にやってみてください。
class A { public:
         A() { Print( 1, ":", EnumToString(CheckPointer(GetPointer(this)))); }
        ~A() { Print( 2, ":", EnumToString(CheckPointer(GetPointer(this)))); }
};
class B { public:
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
        void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart() {}

結果

1:pointer_automatic
1:ポインターダイナミック
2:ポインターダイナミック
2:ポインターオートマチック

 
Nikolai Semko:

ありがとうございました。しかし、そこには私の疑問に対する答えはありませんでした。
A *a= new A のとき、なぜデストラクタが呼ばれないのか理解できない。

newで 作成、deleteで 削除