インジケータでのOnDeinit - ページ 7

 

開発者の皆さん、どこかに間違いがあるのではないでしょうか。

void OnDeinit(const int reason)
{
 //Comment("");
 Comment(ArrayInitialize(body_down,EMPTY_VALUE),"  ",body_down[0],"  ",body_down[1],"  ",body_down[2],"  ",body_down[3]);
}

ターミナルを閉じて、1分後に開いたときのCommentのスクリーンショットをご覧ください。

初期化された要素の数、およびバッファの1番目、2番目、3番目、4番目の要素が空であること。

インジケータは、0番目のバッファのみをカウントします。では、なぜ2本のロウソクなのか?


 
あ、そうそう。英語のヘルプには、ArrayInitializeは 何も返さないとも書いてあります。

 
eevviill:

開発者の皆さん、どこかに間違いがあるのではないでしょうか。

ターミナルを閉じて、1分後に開いたときのCommentのスクリーンショットをご覧ください。

初期化された要素の数、およびバッファの1番目、2番目、3番目、4番目の要素が空であること。

インジケータは、0番目のバッファのみをカウントします。では、なぜ2本のロウソクなのか?


なぜなら、新しいバーを分析するとき、バーの数はチェックせず、時間だけをチェックするからです。操作中に端末を起動したり、サーバーとの接続を解除したりすると、(全履歴に対する)欠損バーが到来する前に、ティックが発生します。このティックでは、新しいローソク足が作成されますが、サーバーからダウンロードしてシステムに挿入される端末内の履歴との間にギャップ(欠落履歴)があり、バーの本数を分析しないので、次の計算では新しいバーはないと思ってしまい、その時に2本目のローソクが表示されます。新しいバーを開くと、それは消えます。
 
mql5:
なぜなら、新しいバーを分析するとき、バーの数を確認するのではなく、時間を確認することに限定するからです。操作中に端末を起動したり、サーバーとの接続が切れたりすると、(全履歴への)欠損バーが来る前にティックが来る。このとき、新しいローソクが作成されますが、端末内の履歴との間にギャップ(欠落した履歴)があるため、サーバーからダウンロードしてその場所に挿入します。新しいバーを開くと、それは消えます。

また、deinitでは、端子を閉じた ときにゼロになるのは問題ないのでしょうか?

 

Vasily、バーの 数を表示するテストインジケータを実行します。

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int      rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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
   if(NewBar(PERIOD_CURRENT, lb))
    {
     Print("rates_total = ", rates_total);
     rates_ = rates_total;
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//if(reason == REASON_CLOSE)
Print("OnDeinit сработал ", rates_);
}

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|

ログにはこのように出力されます。

0       22:52:04.765    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:52:04.795    test EURUSD.z,M1: initialized
0       22:52:04.795    test EURUSD.z,M1: rates_total = 75183
0       22:52:11.902    test EURUSD.z,M1: rates_total = 75184
0       22:52:28.712    test EURUSD.z,M1: uninit reason 9
0       22:52:28.712    test EURUSD.z,M1: OnDeinit сработал 75184
0       22:52:28.832    Custom indicator test EURUSD.z,M1: removed
0       22:57:10.366    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:57:10.396    test EURUSD.z,M1: initialized
0       22:57:10.396    test EURUSD.z,M1: rates_total = 75184
0       22:57:14.972    test EURUSD.z,M1: rates_total = 75185
0       22:57:59.167    test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0       22:58:34.237    test EURUSD.z,M1: uninit reason 1
0       22:58:34.237    test EURUSD.z,M1: OnDeinit сработал 75190
0       22:58:34.247    Custom indicator test EURUSD.z,M1: removed


これで問題の原因がわかるかも・・・。

 
eevviill:

わかりやすい答えは、開発者に聞いてください。

ターミナルを閉じたとき、チャートに付属するプログラムではDeInit()関数が実行されますか?

厳密には、そうではありません。

OnDeinit が実行される。DeInitはOnDeinitから明示的に呼び出した場合のみ実行されます。

もし、昔のdeinit関数を参照しているのであれば、関数名は大文字と小文字を区別することも覚えておいてください。つまり、deInitは未知の関数、deinitは初期化時の標準的なエントリポイント(OnDeinitのようなもの)です

 
eevviill:

また、deinitでは、ターミナルが閉じているときにゼロ調整が行われるのは問題ないのでしょうか?

誰が気にする?ターミナルが閉じられると、これらのバッファは不要になる。なぜなら、プログラムがアンロードされるとき(OnDeinitの直後)に、これらのバッファは直ちに解放されるからである。

タイムフレームを変えるだけでも試してみてください。OnDeinitは動作し、バッファは残りますが(この場合、プログラムのアンロードは起こらないため)、誰もその内容を "前世" から保証することはありません。

ついにドキュメントを読む!https://docs.mql4.com/ru/runtime/running、http s://docs.mql4.com/ru/runtime/event_fire#deinit

 
stringo:

誰が気にする?ターミナルを閉じたとき、これらのバッファは不要になります。なぜなら、プログラムがアンロードされるとき、つまり OnDeinit

タイムフレームを変えるだけでも試してみてください。OnDeinitは動作し、バッファは残りますが(この場合、プログラムのアンロードは起こらないため)、誰もその内容を "過去の人生 "から保証するものではありません。

ついにドキュメントを読む!https://docs.mql4.com/ru/runtime/running、http s://docs.mql4.com/ru/runtime/event_fire#deinit

ということは、私の場合、チャートを再開した時点ですでにバッファが分割されているのでしょうか?
 
eevviill:
つまり、私の場合、グラフを開き直すとバッファが二分されるのですね。

バッファー分岐がないんですね。

こうして自分でバッファを埋めていくのです。1回目は描くとき、2回目はデータの一部を取得するときです。2回とも同じTime[0]の値で動作させる。

 
stringo:

バッファー分割はしていないんですね。

こうして自分でバッファを埋めていくのです。1回目はレンダリング時、2回目はデータ到着時。2回とも同じTime[0]の値で動作させる。

OKです。

英語のヘルプを訂正してください、以上です。

また、英語のヘルプにはArrayInitializeは 何も返さないと書いてあります。