prev_calculated - 页 9 1234567891011121314 新评论 Alexey Viktorov 2016.10.19 07:19 #81 Alexey Kozitsyn: 是的,这个循环可能太多。但如果在prev_calculated = 0时(当缓冲区先前已满),该缓冲区中的一些值被重置,也许这是一个错误。让我们现在检查一下...不是说它们被重置,而是整个指标,整个历史的深度被重新计算。因此,如果我只需要填充缓冲区的最右边的索引,但当我把它移到左边时,这些值必须保留,那么我有两个选择。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的任何问题,对算法和代码的帮助和讨论 萌新求助,最简单的5日移动均线如何编写?mql4 Dmitry Fedoseev 2016.10.19 07:25 #84 从prev_calculated到rate_total,必须对缓冲区进行清理。 [删除] 2016.10.19 07:26 #85 要么,就像迪米特里上面说的那样,在交流中出现了几个小节的中断......。顺便问一下,当连接中断时,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到rate_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是否相等,这种方式不值得推荐。为了证实我的话--你的照片。你可以看到,如你所说,"垃圾 "值在零左右。 当然,更好的做法是将带有 "垃圾 "值的数据窗口添加到图中。 利用指标实时优化智能交易系统 测试当交易货币对篮子时出现的形态第二部分 如何为 MetaTrader 市场创建一款非标准图表的指标 1234567891011121314 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
是的,这个循环可能太多。但如果在prev_calculated = 0时(当缓冲区先前已满),该缓冲区中的一些值被重置,也许这是一个错误。让我们现在检查一下...
不是说它们被重置,而是整个指标,整个历史的深度被重新计算。因此,如果我只需要填充缓冲区的最右边的索引,但当我把它移到左边时,这些值必须保留,那么我有两个选择。
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到rate_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到rate_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是否相等,这种方式不值得推荐。
为了证实我的话--你的照片。你可以看到,如你所说,"垃圾 "值在零左右。
当然,更好的做法是将带有 "垃圾 "值的数据窗口添加到图中。