mql5言語の特徴、微妙なニュアンスとテクニック - ページ 132

 
Igor Makanu:

インジケータのクラス計算をラップする - バッファをクラスフィールドにバインドする

残念...
うまくいかなかった。クラスとハンドルの内部にバッファがあっても、作成された内部中間計算バッファは、クラスインスタンスが削除されても、すべてRAMに残ります。

TFを変更しないとメモリはクリアされません。

ハンドルによるメモリクリーニングのコマンドは明らかに不足しています。例えば、MemErase( int handle) です。

 
Nikolai Semko:

残念...
うまくいかなかった。クラスとハンドルの内部にバッファがあっても、作成された内部中間計算バッファは、クラスインスタンスが削除されても、すべてRAMに残ります。

TFを変更しないとメモリはクリアされません。

明らかに不足しているのは、ハンドルでメモリをクリアすることを目的としたコマンドです。例えば、MemErase( int handle) です。

1. オブジェクトポインタとオブジェクトインスタンス(※のこと)の組み合わせを確認しましたか?

2.デストラクタを書き、その中で配列のサイズを 削除しましたか?(ArrayFree()とArrayResize(arr,0,0) )

 
Nikolai Semko:

残念...
うまくいかなかった。クラスとハンドルの内部にバッファがあっても、作成された内部中間計算バッファは、クラスインスタンスが削除されても、すべてRAMに残ります。

TFを変更しないとメモリはクリアされません。

明らかに不足しているのは、ハンドルでメモリをクリアすることを目的としたコマンドです。例えば、MemErase( int handle) です。

そしてIndicatorReleaseは使わなかったのですか?

しかし、それでも私は空手形だと思うのです。何のために必要なのですか?アニメーションを描くため?トレーディングには?Moving Averageを 直線になるまで平均化すること?

 
Nikolai Semko:

残念...
うまくいかなかった。クラスやハンドルの内部にバッファがあっても、作成された内部中間計算バッファは、クラスインスタンスが削除されても、すべてRAMに残ります。

TFを変更しないとメモリはクリアされません。

明らかにハンドルでメモリをクリアするコマンドが抜けています。例えば、MemErase( int handle) です。

端末は、プログラムが使用しない場合でも、しばらくの間キャッシュを保存します。

メモリが解放されるまでの時間をキャッチすることができます。

 
Alexey Viktorov:

IndicatorReleaseを使用したことがありますか?

それにしても、もったいないと思います。教えてください、何のために必要なのですか?アニメを描くため?トレーディングには?Moving Averageを直線になるまで平均化すること?

はい、ありがとうございます、アレクセイ。この機能を忘れていました。以前見たことがあるが、使ったことはない。

試してみました。何かが間違っている。削除されるのですが、削除した後、すべてが止まってしまうのです。

インジケーターの計算 前のDrawSetup()関数に、以下のパラメータで1行だけコードを追加しただけです。

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

インジケーターが単に動かなくなっただけで、原因はまだ分かりません。

アレクセイ・ヴィクトロフ

無駄な考えだと思います。何のために必要なのか?アニメを描くため?トレーディングには?Moving Averageを直線になるまで平均化すること?

まったくもって同感です。ただの無駄なオモチャです。

 
Andrey Khatimlianskii:

端末は、プログラムがキャッシュを使用しなくても、しばらくの間、キャッシュを保持します。

メモリが解放されるまでの時間を計ることができます。

6分待っても何もクリアされない。

 
Igor Makanu:

1.オブジェクトポインタとオブジェクトインスタンス(※のことです)の組み合わせを確認しましたか?

2.デストラクタを書き、その中で配列のサイズを削除しましたか?(ArrayFree()とArrayResize(arr,0,0) )

1.はい、ポインタ、新規作成、削除でやりました。

2.だから、アレイはない。つまり、内部配列はあるが、名前がない。ハンドル番号のみです。

そして、forループの繰り返しごとに、handle変数の値が1つずつ増えていく。つまり、内部バッファは乗算され、前のバッファはすべて次のバッファの計算に参加します。

ロジック上、IndicatorRelease(handle);を行ってから、再度全く新しい計算を行うべきですが、すでに上で 書いたように、それではインジケータが死んでしまいます。理由は定かではありません。

 
Nikolai Semko:

はい、ありがとうございます、アレクセイ。その機能を忘れていました。以前見たことがあるが、使ったことはない。

試してみました。何かが間違っている。削除したら削除したで、削除した後は全部止まってしまう。

インジケーターの計算 前のDrawSetup()関数に、以下のパラメータで1行だけコードを追加しただけです。

インジケーターが単に動かなくなっただけで、原因はまだ分かりません。

まったくもって同感です。ただの無駄なオモチャです。

そういうことではないんです。チャートエニュメレーターのように、いくつかのハンドラーを作るべきだと思います

currChart=ChartNext(prevChart); // на основании предыдущего получим новый график

そして、新しいHandleを手に入れたら、使用済みのHandleは、使用済みHandleと同じように捨てることができます ...

 
Alexey Viktorov:

そういうことではないんです。グラフサーチのように、2、3回手打ちをする必要があると思います

そして、新しいハンドルを手に入れたら、使用済みのものは使用済みのものと同じように捨てることができる・・・。

というのは通用しない。

 
Nikolai Semko:

まさか

なぜダメなのか?
理由: