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

 
fxsaber:
オブジェクト*関数は、マウスでグラフをドラッグすると非常にラグがある。
再描画はできないの?
 
Nikolai Semko:
描き直すだけでいいのでしょうか?

例えばObjectFind ですが、再描画とどのような関係があるのでしょうか?

 
fxsaber:

例えばObjectFind ですが、再描画とどのような関係があるのでしょうか?

あ、そういうことではないんです。
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5の特性、ヒントとコツ

fxsaber, 2020.03.04 08:58

以前は怪しいとしか思っていなかったが、これで確定した。リソースを扱うとメモリリークが発生しやすい。

SB経由のスクリプトは、数値配列のグラフをチャートに出力する。その後、このチャート(オブジェクト)を手動で削除することができますが、このチャートに割り当てられたリソースは、読み取り専用モードでメモリ内に永遠にぶら下がったままです。オーナースクリプトのみが削除できるため、削除することはできません(ハイライトされた行を参照)。


MQLには、このように占有されたメモリーを解放する機能はありません。特にVPSの 場合は注意が必要です。


後始末をしないスクリプト(または異常停止したスクリプト)の後、Terminalのメモリを解放するにはどうしたらよいでしょうか?

// После окончания работы скрипта Терминал потребляет дополнительные 4 Gb. Как освободить?
void OnStart()
{
  uint Data[];
  
  ArrayResize(Data, 1 e6);
  
  for (int i = 0; i < 1000; i++)  
    ResourceCreate("::" + (string)i, Data, ArraySize(Data), 1, 0, 0, ArraySize(Data), COLOR_FORMAT_ARGB_NORMALIZE);
}

タスクマネージャ(F2)では、メモリ消費量が非常によく表示されます。現在は、Terminalを再起動することで、解決しています。

 
fxsaber:

後始末をしないスクリプトを実行した後(または異常停止した後)、Terminalのメモリを解放するにはどうしたらいいですか?

タスクマネージャ(F2)では、メモリ消費量が完全に表示されています。今のところ、Terminalの再起動だけが有効です。

通常、各リソース ごとにResourceFreeを 呼び出す 必要がある。

クラッシュに関しては、どうすることもできません。そのためには、リソースを作成し、スレッドシャットダウン後にそれらをクリーンアップするために使用されるDLLを作るしかないのです。

 
Vladimir Simakov:

通常、ResourceFreeは リソースごとに呼び出す 必要があります。

緊急停止した場合、どうすることもできません。あなたが独自のDLLを作る場合にのみ、それを介してリソースを作成し、スレッドがオフになっているときに、それら自身をクリアします。

緊急停止には、デバッグの中断も含まれます。

 
fxsaber:

クラッシュにはデバッグの中断が含まれます。

標準的なmqlの意味は、メモリリークです。これらすべての実装は、あなた自身が大人しく書いていればいいのです。DLL_THREAD_DETACH を持つ DllMain がそのようなスレッドの終了時に呼ばれる可能性がないことを考えると、最もつまらないタスクではありませんが、管理可能です。

UPD: このスレッドはバグスレッドに移動してください。IMHO
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MetaTrader 5ビルド2650の新バージョン:チャートのバックグラウンド読み込みとMQL5コードプロファイラの機能向上

fxsaber, 2020.10.23 18:44

これで、チャートバーでは、エキスパートアドバイザーがどのチャートで動作しているのか、またどのチャートで動作していないのかを確認することができます。

識別記号を付けることは可能ですか?例えば、EURUSDチャートがEAで動作している場合、最後にEURUSD*とアスタリスクを追加してください。一般的には、視覚的にキャッチーになりそうなもの。

たくさんのチャート、一部でEAを動かしています。おそらくインジケーターにも使えると思いますが、私は使っていません。だから、わからないんです。


なぜか実行中のEA一覧のホットキーがない。マウスでしか開けません。

今、F2。EAの上でENTERを押すと、そのチャートに切り替わり、ナビゲータにそのEAへのパスを示すツリーが開きます。2回目のENTER - MEでソース。

 
従来は、EAの 内部エラーでEAが終了することはありませんでした。
2021.03.18 11:41:47.413 zero divide in 'Test9.mq5' (550,5)
2021.03.18 11:42:26.619 array out of range in 'Test9.mq5' (550,8)

最近では、それが問題を引き起こしている。


以前は、Marketクライアントは端末を再起動することで問題を回避できました。今はそうではありません。

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MetaTrader 4の新バージョン(ビルド1330)。

fxsaber, 2021.04.03 00:21

// Конструкция обнаружения бесконечных циклов.
class LOOP
{
private:
  static int PrevLine;    
  static uint PrevTime;
  
public:
#define  LOOP_CHECKTIME 100000 // Максимальная длительность (в миллисекундах) выполнения цикла

  static bool CheckFirst( const int Line )
  {
    if (Line != PrevLine)
    {
      LOOP::PrevTime = ::GetTickCount();
      LOOP::PrevLine = Line;
    }
      
    return(!::IsStopped() && ::GetTickCount() - LOOP::PrevTime < LOOP_CHECKTIME);
  }
  
  static bool Description( const string Str )
  {
    if (!::IsStopped() && (::GetTickCount() - LOOP::PrevTime > LOOP_CHECKTIME))
    {
      ::MessageBox("Endless loop:\n" + Str);
  
      LOOP::PrevTime = ::GetTickCount();
    }
    
    return(!::IsStopped());
  }
#undef  LOOP_CHECKTIME
};

static int LOOP::PrevLine = 0;
static uint LOOP::PrevTime = 0;


#define _CS(A) ((LOOP::CheckFirst(__LINE__) || LOOP::Description(__FILE__ + "\n" + (string)__LINE__ + "\n" + __FUNCSIG__ + "\nCondition: " + #A)) && (A))


使用例

void OnInit()
{
  for (uint i = 5; _CS(i >= 0); i--)
    ;
}
理由: