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

 

ビルド1589

IndicatorDeleteを使用せずに、アカウント/ブローカーが変更されたときに、そのようなティッカーがない場合、またはマーケット概要に追加されていない場合に、インジケータのOnTimerが動作しなくなるようにするにはどうすればよいですか?

ドキュメントの誤記 - IndicatorDelete関数はありません、ChartIndicatorDeleteがあります。

https://www.mql5.com/ru/docs/standardlibrary/cchart/cchartindicatordelete

bool  IndicatorDelete(
   int            sub_win      // номер подокна
   const string   name         // короткое имя индикатора
   );

状況は以下の通りです。 先物で添付のインジケータを走らせています。 他のブローカーに乗り換えたのですが、チャートは黒くなって更新されないものの、タイマーは回り続けています。

非初期化の 理由を書かない

REASON_ACCOUNT

6

別のアカウントが有効化された、またはアカウント設定の変更によりトレードサーバーに再接続された場合


2017.04.21 12:10:31.810 TF through OnTimer (DDM7,M1)    Работаем
2017.04.21 12:10:31.810 TF through OnTimer (DDM7,M1)    Аккаунт = AMPGlobalClearing-Demo-CQG
тут сменили брокера,причины деинициализации нет
2017.04.21 12:10:36.809 TF through OnTimer (DDM7,M1)    Работаем
2017.04.21 12:10:36.809 TF through OnTimer (DDM7,M1)    Аккаунт = FXOpen-MT5
//+------------------------------------------------------------------+
//|                                           TF through OnTimer.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
string server;
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
   Print("Причина деинициализации = ",reason);
   
  }
//+------------------------------------------------------------------+
int OnInit()
  {
  server=AccountInfoString(ACCOUNT_SERVER);
   EventSetMillisecondTimer(5000);
   IndicatorSetString(INDICATOR_SHORTNAME,"name");
   
//--- indicator buffers mapping
//---
   return(INIT_SUCCEEDED);
  }  
  
  ////////////
  void OnTimer ()
  {
  Print("Работаем");
  Print("Аккаунт = ",AccountInfoString(ACCOUNT_SERVER));
//  if ( server!=AccountInfoString(ACCOUNT_SERVER) ) ChartIndicatorDelete(0,0,"name");
  }
Документация по MQL5: Стандартная библиотека / Ценовые графики / IndicatorDelete
Документация по MQL5: Стандартная библиотека / Ценовые графики / IndicatorDelete
  • www.mql5.com
Стандартная библиотека / Ценовые графики / IndicatorDelete - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
kaus_bonus:

ビルド1589

OnDeinitは呼び出されない。
 
どういうこと
fxsaber:
OnDeinitは呼び出されない。

全く呼ばれないのか、このコードで呼ばれるのか、どういう意味ですか?

 
kaus_bonus:

ビルド1589

IndicatorDeleteを使用せずに、口座/ブローカーが変更されたときに、そのようなティッカーを持っていない、またはマーケット概要に追加されていない場合に、インジケーターのOnTimerが動作しなくなるようにするにはどうすればよいですか?

ドキュメントの誤記 - IndicatorDelete関数はありません、ChartIndicatorDeleteがあります。

https://www.mql5.com/ru/docs/standardlibrary/cchart/cchartindicatordelete

状況は以下の通りです。 先物で添付のインジケータを動かしています。 他のブローカーに乗り換えたのですが、チャートは黒くなって更新されないものの、タイマーは動き続けています。

非初期化の 理由を書かない

REASON_ACCOUNT

6

別のアカウントが有効化された、またはアカウント設定の変更によりトレードサーバーへの再接続が発生した場合



インジケーターのロード・アンロード

インジケーターは以下の場合にアップロードされます。

  • チャートへのインジケータの取り付け
  • 端末の起動(端末が以前に閉じられる前にインジケータがチャートに取り付けられていた場合)
  • テンプレートの読み込み(チャートにインジケータが添付されている場合)
  • プロファイルの変更(インジケータがプロファイルチャートの1つに取り付けられている場合)。
  • チャートのシンボルや期間を変更すること。
  • インジケータがリコンパイルに成功した後、そのインジケータがチャートにアタッチされている場合。
  • インジケータ入力 パラメータの変更。

以下の場合、インジケーターはアンロードされます。

  • インジケータがチャートから切り離されたとき。
  • 端末の終了(チャートにインジケータが装着されている場合)
  • インジケータがチャートに添付されている場合、テンプレートの読み込みを行います。
  • インジケータを貼り付けたチャートを閉じます。
  • プロファイル変更時に、変更するプロファイルのチャートの1つにインジケータが装着されている場合。
  • チャートのシンボルや期間を変更すること。
  • インジケータ入力パラメータの変更。


口座変更」が存在しないのは、口座切り替え時にインジケータがアンロードされず、結果として取引口座を変更した際のインジケータのOnDeinit()もされないことを意味します。

 
kaus_bonus:

全く呼ばれないのか、このコードで呼ばれるのか、どういう意味ですか?

あなたの立場では
 
Vladimir Karputov:

ロード/アンロード用インジケーター


以下の場合、インジケーターはアンロードされます。

  • インジケータがチャートから切り離されたとき。
  • 端末の終了(チャートにインジケーターが装着されている場合)
  • チャート上にインジケータがある場合、テンプレートの読み込みを行います。
  • インジケータを貼り付けたチャートを閉じます。
  • プロファイル変更時に、変更するプロファイルのチャートの1つにインジケータが装着されている場合。
  • チャートのシンボルや期間を変更すること。
  • インジケータ入力パラメータの変更。


口座切り替え」が存在しないのは、口座切り替え時にインジケータがアンロードされないため、結果的に取引口座を変更してもインジケータのOnDeinit()が存在しないことを意味します。

実は、この理由はExpert Advisorにしか通用しないのです。

Коды причины деинициализации эксперта ....

では、どうすればチャートからインジケータを根本的に削除することなく、タイマーを停止させることができるのでしょうか?

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

実は、私が述べた理由は、専門家にしか通用しないのです

そこで疑問が残るのですが、チャートからインジケータを大幅に削除することなく、タイマーの動作を停止させるにはどうしたらよいのでしょうか?


OnInit()でスコアを記憶させる。タイマーでアカウント番号を 確認する。スコアが変化した場合 - タイマーを終了する。
 
kaus_bonus:

では、どうすればチャートからインジケータを削除することなく、タイマーを停止させることができるのかという疑問が残ります。

ACCOUNT_LOGINとACCOUNT_SERVERを使用します。
 

それは曲がった解決方法だと思いませんか!

ACCOUNT_LOGIN!=ACCOUNT_LOGIN_NEWを 実行してタイマーを止め、このアカウントに戻ると、どうなりますか? タイマーは再び始まらないのでしょうか?

というのは、同じように「アカウントの変更」という理由をインジケータに追加する方が簡単なのでしょうか、それとも私が何か間違っていて、何か困難が生じるのでしょうか?

 
kaus_bonus:

このままでは、解決は困難です。

馬の動きだ!

ACCOUNT_LOGIN!=ACCOUNT_LOGIN_NEWと、タイマーを停止し、そのカウントに戻した場合、何が起こるでしょうか?

アカウントの変更が検出されると、新しい特性をすでに記憶しています。

ここ(マクロ)の原理で、小さなライブラリとして設計することができます。そうすれば、「曲がった」ことが迷惑になることはありません。