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

 
Igor Makanu:

ここで@Vict が マクロ置換による OS 終了で例外を発生させるのを手伝ってくれたhttps://www.mql5.com/ru/forum/318246/page10#comment_12651045

という、一般的には実行可能な解決策ですがでも、見た目は不気味で気持ち悪い!?)))

本当に困ったものだ...。マクロでリターンを包むには - 倒錯についてよく知らなければならない ) そのようなコードをどう扱うか... 少なくともマクロの名前をもっとわかりやすくするべきだ、例えば TRY_OR_RETURN のように。
 
Alexey Navoykov:
これは本当にひどいものです。 マクロでリターンをラップするのは、よほど変態の知識がないと無理でしょう :) では、そのようなコードをどう扱うかですが、少なくともマクロ名をもっと説明的にすべきです - TRY_OR_RETURN, etc....

)))

見た目を見て使わないで、昔ながらの方法で書いています。OnTick()の中で if(!myfunc()) return; - コードはすべて if でいっぱいです ...は、かなりかわいいし、面白いです )))) 。

 

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

MetaTrader 5ビルド2085の新バージョン:Pythonとの統合とストラテジーテスターの大幅な改善

アンドレイ・バリノフ 2019.09.06 06:25

なぜ今このコードに警告が出るのか、まだ説明してもらえますか?

メソッドにはさまざまなサインがある...

class A
  {
   public:
                     A(void) {}
                    ~A(void) {}
      //===============
      void           Test(void) {}
      //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+  
class B : public A
  {
   public:
                     B(void) {}
                    ~B (void) {}
      //===============
      void           Test(int a) {}
      //===============
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   B b;

   b.Test(); //deprecated behavior, hidden method calling will be disabled in a future MQL compiler versions
   b.Test(5);
//---
   return(INIT_SUCCEEDED);
  }

 

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

MetaTrader 5ビルド2085の新バージョン:Pythonとの統合とストラテジーテスターの大幅な改善

アンドレイ・バリノフ 2019.09.06 06:11

ビルド2136で壊れていたtypename()

ぜひ、元に戻してください。

enum eTest
  {
   TEST
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(typename(eTest)); // eTest::eTest а правильно (и раньше так было) eTest
//---
   return(INIT_SUCCEEDED);
  }

型名


 
イリヤス

このインジケータはシステムをクラッシュさせます。
また、画面の解像度を変更すると、画素が点滅し、コンピュータを再起動する必要があります。
さらに、一見無害に見える関数 Crash()を呼ばなければ、クラッシュすることはない。
以下のように再現しています。

  • インジケータを実行する
  • タイムフレームを変更し始めると、いくつかのラグが発生します。
  • その後、MT5を最小化してみてください。



このクラッシュを毎回プレイしていた(6~8回目)

ファイル:
AnyTF.mq5  10 kb
iCanvas.mqh  21 kb
 
LTSCではクラッシュしませんでしたが、ロギングエラー: MemoryException 4424265936 bytes not available, 0 heapmin resultです。

さらにTFを数回変更し、システムがギリギリで起動した後、ブートホイールが100回転し、起動しないと思いましたが、確認しないのが一番です)クラッシュしました。
 
Fast235:
LTSCではクラッシュしませんでしたが、ログに次のようなエラーが出ています。 MemoryException 4424265936 bytes not available, 0 heapmin result.

TFを変更した後もクラッシュし、システムはギリギリで起動しましたが、ローディングホイールは100回転し、まさか起動するとは思いませんでした。)

そう、クラッシュはとても大変なんです。危ないことはしないほうがいい。
もちろん、記憶力が大事なんですけどね。
このようにメモリを片付けると

int OnInit()
  {
   ChartSetInteger(0,CHART_FOREGROUND,false);
   if(erase)
      ChartSetInteger(0,CHART_SHOW,false);
   Canvas.Erase();
   Canvas.Comm("Идет загрузка всех тиков. Подождите пожалуйста");
   Canvas.Update();
   N=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,(TimeCurrent()-Weeks*7*24*60*60)*1000,INT_MAX);
   Print("Скачено "+string(N)+" тиков");
   if(N>0) N=CalculateNewTF(ticks,bars,TF);
   ArrayFree(ticks);
   Print("Сформировано "+string(N)+" баров");
   if(N>0) ShowBars(bars);
   Crash();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason) 
  {
    ArrayFree(bars); 
    if(erase) ChartSetInteger(0,CHART_SHOW,true); 
  }

もクラッシュしない。少なくとも私には起こりませんでした。
しかし、TFが変更された場合、配列は 自動的にクリーニング されなければならないのです

また、Crash()関数はインジケータの情報のみを読み取るため、この関数がないとどうなるのか理解できません。
おそらく、この関数の実行により、TF変更時のOnDeinitが遅くなり、そのためにMT5がメモリをクリアする時間がないのでしょう。
非同期のOnDeinitについては、以前から問題視してきました。よくないですねー。非同期が原因でシステムがクラッシュしてはいけない...。

 

インジケーターでチャートをスクロールさせると、プロセッサがコアを100%ロードするのはなぜですか?

結局、指標は計算されて描かれ、考えによると、メモリからの負荷だけがあるはずです。

 
Aleksey Vyazmikin:

インジケーターでチャートをスクロールさせると、プロセッサがコアを100%ロードするのはなぜですか?

結局、指標は計算されて描かれ、考えに従って、メモリからの負荷だけがあるはずです。

グラフ描画時のCPU負荷は、グラフィックカードの性能に直接依存します。

カード性能の低い古いノートパソコンや、ビデオカードやドライバのないサーバーでは、どうしてもCPU負荷が瞬間的に、しかし短時間に急上昇してしまいます。

そして、増えたリクエストを跡形もなく食べきるためには、CPU自体の性能も向上させる必要があります。
 
Renat Fatkhullin:

グラフのレンダリング時のCPU負荷は、ビデオカードの性能に直結しています。

カード性能の低い古いノートパソコンや、ビデオカードやドライバのないサーバーでは、CPUの負荷がすぐに上がるのは避けられませんが、短時間で回復します。

そして、CPU自体もより強力でなければ、増大した要求を跡形もなく食いつぶしてしまうのです。

プロセッサーにFX-8350、グラフィックカードにRadeon HD 7950を搭載していることですね。MT5でビデオカードに負荷がかかっている感じはしませんね。