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

 

スタティック変数の動作はこれでいいのでしょうか?

タイムフレームの切り替えやパラメーターの変更を行っても、その値は変わりません。

int OnInit()
  {
   static int my_int=4444;
   Print(my_int);
   my_int=9999;
   return(INIT_SUCCEEDED);
  }

EAを起動し、タイムフレームを切り替えた後の結果です。

2021.02.24 16:23:27.999 Test1 (EURUSD,M1)       4444
2021.02.24 16:23:29.913 Test1 (EURUSD,M5)       9999
静的変数

これはヘルプからです。

静的変数は、プログラム実行時に存在し、専用関数OnInit()が呼ばれる前に一度だけ初期化されます。

つまり、OnInit()を呼び出すたびに1回、または起動前に1回、ただし再初期化は2回目の実行に近い。

テスターでもこの現象は起こるのでしょうか?

グローバル変数もこのような挙動をします。

 

タイムフレームを切り替えてもExpert Advisorは再起動せず、動作を継続する。

https://www.mql5.com/ru/docs/runtime/running

При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Выполнение программ - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilyas:

タイムフレームを切り替えてもExpert Advisorは再起動せず、動作を継続する。

https://www.mql5.com/ru/docs/runtime/running

今までのMetaTraderにはなかった、ある特殊性に気づきました。エキスパートアドバイザーをチャートから削除(コンテキストメニューのコマンドを使用)すると、チャートが閉じてしまいます。従来は、Expert Advisorを削除してもチャートが閉じませんでした。

 
Mihail Matkovskij:

今までのMetaTraderにはなかった、ある特殊性に気がつきました。Expert Advisor をチャートから削除すると(コンテキストメニューのコマンドを使用)、その後にチャートが閉じてしまいます。従来は、Expert Advisor を削除してもチャートが閉じないことがありました。

EA自体にプログラムすることもできますし、他のEAで確認することもできます...。

 

win7で履歴データをデバッグすると、観測に追加された変数がその値を表示しません。実データをデバッグすると、すべてうまくいきます。

変数を追加しても、すぐにウィンドウに表示されず、次回デバッグを開始したときに表示されますが、その値はすでに<未実装>になっていることがわかりました。

 
Vladimir Pastushak:

EA自体にプログラムされている可能性もありますので、他のEAで確認してみてください...。

確かに、標準のEAをチャートに投げました。問題なく削除しました。Expert AdvisorのソースでChartCloseを見つけようとしました。どこを探してもないんです。Expert Advisorを削除する際にチャートを閉じることは、最初から意図していませんでした。CAppDialogなど、標準的なUI要素を使用しています。もしかしたら、標準クラスの どこかにチャートの閉じ方が書いてあったのかもしれない...。

 
Mihail Matkovskij:

確かに、標準的なEAをチャートに投げました。問題なく削除しました。Expert AdvisorのソースでChartCloseを見つけようとしました。どこを探してもないんです。当初はExpert Advisorを削除する際にチャートを閉じないように考えていました。CAppDialogなど、標準的なUI要素を使用しています。もしかしたら、チャートの閉じ方が標準クラスの どこかに書いてあったのかもしれない...。

見つけた。CAppDialogクラスはCChart m_chartフィールドを持っています。

class CAppDialog : public CDialog
  {
...
protected:
   CChart            m_chart;               // object to access chart

CAppDialogが削除されると(その子孫は私のExpert Advisorで使われています) m_chartの デストラクタはおそらくチャートを閉じます

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CChart::~CChart(void)
  {
   if(m_chart_id!=-1)
      Close();
  }
//+------------------------------------------------------------------+
//| Chart close                                                      |
//+------------------------------------------------------------------+
void CChart::Close(void)
  {
   if(m_chart_id!=-1)
     {
      ChartClose(m_chart_id);
      m_chart_id=-1;
     }
  }

残念ながら、この処理はデバッガーを使って追跡することはできません。しかし、CAppDialogやCChartの ソースコードに目を通すと、すべてが明らかに なります。開発者の方々の注意を喚起します。

 
Mihail Matkovskij:

見つけた。CAppDialog クラスは、CChart m_chart フィールドを持ちます。

CAppDialogが削除されると(その子孫であるCDialogは 私のExpert Advisorで使われています)、m_chart デストラクタはおそらくチャートを閉じます

残念ながら、この処理はデバッガーを使って追跡することはできません。しかし、CAppDialogやCChartの ソースコードに目を通すと、すべてが明らかに なります。開発者の方々の注意を喚起したいと思います。

void CAppDialog::Destroy(const int reason)

チャートからの切り離し、など。

 

SignalBaseTotal() が常に1000を返す理由を教えてください。

mql5.comのシグナルサービスには1000以上の放送信号がありますが、端末で利用できるのは1000程度です。なぜ?

この千の中に一組の信号があり、一時間後には違う信号になっていることがあるのでしょうか?
Документация по MQL5: Управление сигналами / SignalBaseTotal
Документация по MQL5: Управление сигналами / SignalBaseTotal
  • www.mql5.com
SignalBaseTotal - Управление сигналами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alain Verleyen :

ファイルからの保存/読み込み時に、新しいデータが追加されない派生構造でエラーが発生する。

@Ilyas これを直してくれませんか?