事前計算された - ページ 9

 
Alexey Kozitsyn:
そう、ループはやりすぎなんです。しかし、prev_calculated = 0の時(以前はバッファがいっぱいだった時)、そのバッファのいくつかの値がリセットされるなら、おそらくそれはバグでしょう。今すぐ確認しよう...

リセットされるわけではなく、指標全体、履歴の深さ全体が再計算されるのです。したがって、バッファの右端のインデックスだけを埋める必要があり、左側にシフトしてもこれらの値が残っている必要がある場合、2つの選択肢があります。

1.インジケーターバッファーの初期化 時にゴミが多いので、クリーニングが必要です。

2.クリーニングしましたが、prev_calculated = 0にすると、バッファが再度クリーニングされ、蓄積された値がすべて削除されます。


prev_calculated = 0 とフラグを併用することで、この問題を解決することができます。

 
Alexey Viktorov:

...

prev_calculated = 0 とフラグを併用することで、この問題を解決することができます。

そんなことはない。数バー分の接続が切れ、数バーがゴミで初期化されないまま終了します。
 
Alexey Viktorov:

ふりをしないで...全てクリアしていますが、あなただけの絵があります。



コンピュータはシャットダウンせずに動いていたし、チャートは閉じないし、インジケータはリセットしないし...。

質問:2分バーはどこに消えたのでしょうか?

おそらく、コードにエラーがあるのでしょう。テスト用のインジケータを作成したところ、リフレッシュボタンでリセットしてもバッファのサイズは変わらず、バッファ内のデータも変化しません...。

#property indicator_buffers 1
#property indicator_plots 1
#property indicator_chart_window
#property indicator_type1 DRAW_NONE
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double buf[];
const double _price=98000;
bool _firstLaunch=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,buf);
//---
   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[])
  {
   if(prev_calculated==0)
     {
      if(_firstLaunch)
        {
         Print(__FUNCTION__,": Первый запуск! Размер буфера = ",ArraySize(buf));
         ArrayInitialize(buf,_price);
         _firstLaunch=false;
        }
      else
        {
         Print(__FUNCTION__,": prev_calculated после обновления = ",prev_calculated,". Размер буфера = ",ArraySize(buf));
         //--- Проверяем отличие значений от эталонного
         for(int i=rates_total-1; i>=0; i--)
            if(buf[i]!=_price)
               Print(__FUNCTION__,": Значение #",i," '"+DoubleToString(buf[i],_Digits)+
                     "' отличается от эталонного '"+DoubleToString(_price,_Digits));
        }
     }
   else
     {
      if(rates_total>prev_calculated)
         buf[rates_total-1]=_price;
     }
   return(rates_total);
  }
 

prev_calculated から rates_total までは、バッファのクリーニングが必要 です。

 
上のDimitriさんのおっしゃるように、数小節の通信が途切れたか...。ところで、prev_calculatedも接続が切れると0を返すのでしょうか?
 
Dmitry Fedoseev:
コードを見せてください。笑って説明しよう。

もう、笑っちゃいますね。

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   6
#property indicator_plots     3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1    clrGold, clrGreen, clrRed
#property indicator_width1    2
#property indicator_label1    "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2    clrCrimson
#property indicator_width2    2
#property indicator_label2    "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3    clrDarkViolet
#property indicator_width3    2
#property indicator_label3    "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;

bool flag = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, balance, INDICATOR_DATA);
   SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, equityMin, INDICATOR_DATA);
   SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
   SetIndexBuffer(4, equityMax, INDICATOR_DATA);
   SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
   ArraySetAsSeries(balance, true);
   ArraySetAsSeries(clrBalance, true);
   ArraySetAsSeries(equityMax, true);
   ArraySetAsSeries(equityMaxB, true);
   ArraySetAsSeries(equityMin, true);
   ArraySetAsSeries(equityMinB, true);
   IndicatorSetInteger(INDICATOR_DIGITS, 2);
   IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
   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[])
  {
//---
if(prev_calculated == 0)
  {
   Print("prev_calculated = ", prev_calculated);
   if(flag)
    {
     ArrayInitialize(balance, 0.0);
      ArrayInitialize(equityMax, 0.0);
       ArrayInitialize(equityMaxB, 0.0);
      ArrayInitialize(equityMin, 0.0);
     ArrayInitialize(equityMinB, 0.0);
      flag = false;
    }
   return(rates_total);
  }
  double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
  double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
    balance[0] = bal;
    clrBalance[0] = 0.0;
    equityMinB[0] = balance[0];
    equityMin[0] = minEquity;
    equityMaxB[0] = balance[0];
    equityMax[0] = maxEquity;
    if(balance[0] > balance[1])
     clrBalance[0] = 1.0;
    if(balance[0] < balance[1])
     clrBalance[0] = 2.0;
    Comment(PositionsTotal());
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

一晩でこれだけのprev_calculateのゼロ化が行われました。

2016.10.19 08:42:23.309 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 05:47:04.915 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 05:47:04.075 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:46:15.300 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:46:15.030 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:45:37.590 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:45:37.100 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 01:40:31.224 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 00:00:32.196 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 00:00:31.806 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.18 20:33:02.954 BalansEquityTest (EURUSD,M1)    prev_calculated = 0 // Это время последнего запуска индикатора.
 
Dmitry Fedoseev:

prev_calculated から rates_total までは、バッファのクリーニングが必要 です。

もしこれが私の答えなら、インジケーターの最初の起動時に、バッファは与えられた値で完全に初期化されます。新しいバーが 形成されると、新しい値が上書きされる。
 
Alexey Kozitsyn:
あるいは、上記のDmitriyの言うように、いくつかのバーで接続不良が発生したとか...。ところで、prev_calculatedは、接続が切れたときにも0を返すのでしょうか?

以前は、すべての問題で prev_calculated は 0 を返していました。その後、フォーラムで、常に 0 にリセットするのではなく、場合によっては最後にカウントした値にリセットできるかもしれないという議論があり、そのスレッドに Slava が参加して、この問題について調査することを約束しました。

しばらくして、prev_calculatedが中間値を持つことがあることに気づきました。今、私はそれについて知らない、私は毎日何をprev_calculated戻り値を見ていない。

 
Alexey Kozitsyn:
もしこれが私の答えなら、インジケータを初めて起動したとき、バッファは設定値で完全に初期化されます。新しいバーが 形成されると、新しい値が上書きされます。
お前じゃない。
 
Alexey Viktorov:

もう、笑っちゃいますね。

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   6
#property indicator_plots     3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1    clrGold, clrGreen, clrRed
#property indicator_width1    2
#property indicator_label1    "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2    clrCrimson
#property indicator_width2    2
#property indicator_label2    "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3    clrDarkViolet
#property indicator_width3    2
#property indicator_label3    "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;

bool flag = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, balance, INDICATOR_DATA);
   SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, equityMin, INDICATOR_DATA);
   SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
   SetIndexBuffer(4, equityMax, INDICATOR_DATA);
   SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
   ArraySetAsSeries(balance, true);
   ArraySetAsSeries(clrBalance, true);
   ArraySetAsSeries(equityMax, true);
   ArraySetAsSeries(equityMaxB, true);
   ArraySetAsSeries(equityMin, true);
   ArraySetAsSeries(equityMinB, true);
   IndicatorSetInteger(INDICATOR_DIGITS, 2);
   IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
   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[])
  {
//---
if(prev_calculated == 0)
  {
   Print("prev_calculated = ", prev_calculated);
   if(flag)
    {
     ArrayInitialize(balance, 0.0);
      ArrayInitialize(equityMax, 0.0);
       ArrayInitialize(equityMaxB, 0.0);
      ArrayInitialize(equityMin, 0.0);
     ArrayInitialize(equityMinB, 0.0);
      flag = false;
    }
   return(rates_total);
  }
  double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
  double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
    balance[0] = bal;
    clrBalance[0] = 0.0;
    equityMinB[0] = balance[0];
    equityMin[0] = minEquity;
    equityMaxB[0] = balance[0];
    equityMax[0] = maxEquity;
    if(balance[0] > balance[1])
     clrBalance[0] = 1.0;
    if(balance[0] < balance[1])
     clrBalance[0] = 2.0;
    Comment(PositionsTotal());
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

潜在的には、ここに原因があるのかもしれません。

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

新しいバーが 届いたら、値を0にリセットする--結構です。しかし、その場合、推奨されない方法で、minEquityと0が等しいかどうかをチェックします。

私の言葉を裏付けるように、あなたの写真。おっしゃる通り、「ゴミ」の値がゼロ付近になっているのがわかりますね。

そして、その "ゴミ "のような値のデータウィンドウを図に加えた方がいいに決まっている。