1

ローソク足の形状を認識するインジケーターを作成しています。

class Candlestickそのために、インディケータ ファイルに含める別のファイルを作成しました。

問題は、メモリリークに悩まされていることです。

私はポインターに慣れていないので、たくさん読んだり見たりした後でも、ここで何かを見逃しているようです。

これは Indicator クラスです。授業内容Candlestickは関係ないので割愛します。

Candlestick *candles[]; 

void OnDeinit(const int reason)
{
    for(int i = 0; i < ArraySize(candles); i++ ){
      delete(candles[i]);
    }
}

int OnCalculate(args here)
{
    ArrayResize(candles, Bars);

    for(int i = MathMax(Bars-2-IndicatorCounted(), 1); i >= 0; i--)
    {            
        candles[i] = new Candlestick();

        // Do stuff with this candle (and other candles) here e.g.
        if(candles[i+1].type == BULLISH) Print("Last candle was Bullish");
    }
}

これを行うと、メモリリークエラーが発生します。その動的配列のろうそくへのポインタを削除する必要があるようです。問題は、いつどこで?for(){...}ループの次の反復でそれらが必要になるためです。だからそこは消せない。

関数でそれを削除すると、OnDeinit()まだろうそくが残っていて、まだリークエラーが発生します。

どうして?

4

1 に答える 1

2

まず、ニック、WorldsへようこそMQL4

既にお気づきかもしれませんが、MQL4コードはC.

多くの重要な違いの中で、ここで重要なのは、コード実行プラットフォーム ( MetaTrader Terminal 4) がどの時点で何を行うかです。

OnCalculate()ゾンビに似たプロセスであり、何度も呼び出されますが、とにかく、間違いなくあなたの制御下にはありません.

次に、OnCalculate()by-design とは、新しい を意味するものではありませんBar


方法?

MQL4概念的には、コンピューティング リソースがはるかに小さく、コード実行フェーズ中のタイム シェアリング CPU-MUX-ing の点ではるかに高価だった時代に由来します。

したがって、MQL4-user-domain 言語は、直接アクセスできないいくつかの隠された宝石の利点を保持しています。これらの 1 つは、非常に効率的なレジスタ ベースの更新処理であり、リアルタイム実行の予測可能性に壊滅的な悪影響を与えるため、動的リソースの割り当てを最小限に抑えます。

これは、メモリプールをフラッディングする代わりに、この「石器時代」の非常に効率的な動作(時間とメモリの両方)を模倣することにより、概念オブジェクトをよりスマートに設計および処理する方法を理解するのに役立ちます呼び出しごとに無制限の数の管理されていないインスタンスを使用しOnCalulate()、無限の数を振りかけますnew Candlestick(); // *--> candles[]


最良の次のステップ:

疑問がある場合は、プラットフォームの localhost-help/documentation のベスト プラクティスを読んで、プロのソフトウェア設計で重要ArrayResize()な問題となるドメインでオーバーヘッド (ブロックではない場合) を導入することを理解し始めてください。nano$econd$

于 2016-04-12T14:23:29.270 に答える