事前計算された - ページ 9 1234567891011121314 新しいコメント Alexey Viktorov 2016.10.19 07:19 #81 Alexey Kozitsyn: そう、ループはやりすぎなんです。しかし、prev_calculated = 0の時(以前はバッファがいっぱいだった時)、そのバッファのいくつかの値がリセットされるなら、おそらくそれはバグでしょう。今すぐ確認しよう...リセットされるわけではなく、指標全体、履歴の深さ全体が再計算されるのです。したがって、バッファの右端のインデックスだけを埋める必要があり、左側にシフトしてもこれらの値が残っている必要がある場合、2つの選択肢があります。1.インジケーターバッファーの初期化 時にゴミが多いので、クリーニングが必要です。2.クリーニングしましたが、prev_calculated = 0にすると、バッファが再度クリーニングされ、蓄積された値がすべて削除されます。prev_calculated = 0 とフラグを併用することで、この問題を解決することができます。 Dmitry Fedoseev 2016.10.19 07:23 #82 Alexey Viktorov:...prev_calculated = 0 とフラグを併用することで、この問題を解決することができます。 そんなことはない。数バー分の接続が切れ、数バーがゴミで初期化されないまま終了します。 削除済み 2016.10.19 07:24 #83 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 MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 エラー、バグ、質問 Dmitry Fedoseev 2016.10.19 07:25 #84 prev_calculated から rates_total までは、バッファのクリーニングが必要 です。 削除済み 2016.10.19 07:26 #85 上のDimitriさんのおっしゃるように、数小節の通信が途切れたか...。ところで、prev_calculatedも接続が切れると0を返すのでしょうか? Alexey Viktorov 2016.10.19 07:28 #86 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 = 02016.10.19 05:47:04.915 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 05:47:04.075 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 04:46:15.300 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 04:46:15.030 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 04:45:37.590 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 04:45:37.100 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 01:40:31.224 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 00:00:32.196 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.19 00:00:31.806 BalansEquityTest (EURUSD,M1) prev_calculated = 02016.10.18 20:33:02.954 BalansEquityTest (EURUSD,M1) prev_calculated = 0 // Это время последнего запуска индикатора. prev_calculated 初心者の方からの質問 MQL5 MT5 MetaTrader MQL5による株式発振器とは 削除済み 2016.10.19 07:28 #87 Dmitry Fedoseev:prev_calculated から rates_total までは、バッファのクリーニングが必要 です。 もしこれが私の答えなら、インジケーターの最初の起動時に、バッファは与えられた値で完全に初期化されます。新しいバーが 形成されると、新しい値が上書きされる。 Dmitry Fedoseev 2016.10.19 07:31 #88 Alexey Kozitsyn: あるいは、上記のDmitriyの言うように、いくつかのバーで接続不良が発生したとか...。ところで、prev_calculatedは、接続が切れたときにも0を返すのでしょうか?以前は、すべての問題で prev_calculated は 0 を返していました。その後、フォーラムで、常に 0 にリセットするのではなく、場合によっては最後にカウントした値にリセットできるかもしれないという議論があり、そのスレッドに Slava が参加して、この問題について調査することを約束しました。 しばらくして、prev_calculatedが中間値を持つことがあることに気づきました。今、私はそれについて知らない、私は毎日何をprev_calculated戻り値を見ていない。 Dmitry Fedoseev 2016.10.19 07:32 #89 Alexey Kozitsyn: もしこれが私の答えなら、インジケータを初めて起動したとき、バッファは設定値で完全に初期化されます。新しいバーが 形成されると、新しい値が上書きされます。 お前じゃない。 削除済み 2016.10.19 07:44 #90 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が等しいかどうかをチェックします。私の言葉を裏付けるように、あなたの写真。おっしゃる通り、「ゴミ」の値がゼロ付近になっているのがわかりますね。 そして、その "ゴミ "のような値のデータウィンドウを図に加えた方がいいに決まっている。 通貨ペアバスケットをトレードするときに発生するパターンのテスト パート2 考えられる.EAをリアルタイムで最適化するためのインジケータの使用法 インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布 1234567891011121314 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
そう、ループはやりすぎなんです。しかし、prev_calculated = 0の時(以前はバッファがいっぱいだった時)、そのバッファのいくつかの値がリセットされるなら、おそらくそれはバグでしょう。今すぐ確認しよう...
リセットされるわけではなく、指標全体、履歴の深さ全体が再計算されるのです。したがって、バッファの右端のインデックスだけを埋める必要があり、左側にシフトしてもこれらの値が残っている必要がある場合、2つの選択肢があります。
1.インジケーターバッファーの初期化 時にゴミが多いので、クリーニングが必要です。
2.クリーニングしましたが、prev_calculated = 0にすると、バッファが再度クリーニングされ、蓄積された値がすべて削除されます。
prev_calculated = 0 とフラグを併用することで、この問題を解決することができます。
...
prev_calculated = 0 とフラグを併用することで、この問題を解決することができます。
ふりをしないで...全てクリアしていますが、あなただけの絵があります。
コンピュータはシャットダウンせずに動いていたし、チャートは閉じないし、インジケータはリセットしないし...。
質問:2分バーはどこに消えたのでしょうか?
おそらく、コードにエラーがあるのでしょう。テスト用のインジケータを作成したところ、リフレッシュボタンでリセットしてもバッファのサイズは変わらず、バッファ内のデータも変化しません...。
#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 までは、バッファのクリーニングが必要 です。
コードを見せてください。笑って説明しよう。
もう、笑っちゃいますね。
| 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 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 // Это время последнего запуска индикатора.
prev_calculated から rates_total までは、バッファのクリーニングが必要 です。
あるいは、上記のDmitriyの言うように、いくつかのバーで接続不良が発生したとか...。ところで、prev_calculatedは、接続が切れたときにも0を返すのでしょうか?
以前は、すべての問題で prev_calculated は 0 を返していました。その後、フォーラムで、常に 0 にリセットするのではなく、場合によっては最後にカウントした値にリセットできるかもしれないという議論があり、そのスレッドに Slava が参加して、この問題について調査することを約束しました。
しばらくして、prev_calculatedが中間値を持つことがあることに気づきました。今、私はそれについて知らない、私は毎日何をprev_calculated戻り値を見ていない。
もしこれが私の答えなら、インジケータを初めて起動したとき、バッファは設定値で完全に初期化されます。新しいバーが 形成されると、新しい値が上書きされます。
もう、笑っちゃいますね。
| 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);
}
//+------------------------------------------------------------------+
潜在的には、ここに原因があるのかもしれません。
{
minEquity = 0;
maxEquity = 0;
}
minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
新しいバーが 届いたら、値を0にリセットする--結構です。しかし、その場合、推奨されない方法で、minEquityと0が等しいかどうかをチェックします。
私の言葉を裏付けるように、あなたの写真。おっしゃる通り、「ゴミ」の値がゼロ付近になっているのがわかりますね。
そして、その "ゴミ "のような値のデータウィンドウを図に加えた方がいいに決まっている。