prev_calculated - 页 4 1234567891011...14 新评论 Vladimir Karputov 2016.10.18 14:58 #31 Alexey Viktorov:也许开发者应该注意指标缓冲区的初始化问题?为什么在MT4中没有这样的问题?也许这不是完全的理解?问题是,即使在EACH中从图表上取下一个指标后强制初始化缓冲区,也不是所有的缓冲区都包含垃圾,你不能把它从那里弄出来。 我个人并不介意拐杖,但前提是这些拐杖不能太复杂,而且要有积极作用。但是,写到一个文件,然后再读它,是一个蹩脚的拐杖。你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?从图表中删除指标后,你以何种方式访问其指标缓冲区?让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么... [删除] 2016.10.18 15:05 #32 Karputov Vladimir:你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?从图表中删除指标后,你能以何种方式访问其指标缓冲区?让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...纯粹的假设:在当前的缓冲区访问过程中,它可能会进入同一个内存区域,而这个区域被之前的缓冲区所占据。我还没有进入对话,不要踢,Alexey想让缓冲区的数据在重新启动(终端的开关)时保持不变,还是只在prev_calculated = 0时保持不变(如果prev_calculated > 0之前)? Alexey Viktorov 2016.10.18 15:13 #33 Karputov Vladimir:你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?在从图表中删除指标后,你以何种方式访问其指标缓冲区?让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...以下是指标的代码/********************************************************************\| 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;//+------------------------------------------------------------------+//| 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); ArrayInitialize(balance, 0.0); // принудительная ArrayInitialize(equityMax, 0.0); // инициализация ArrayInitialize(equityMaxB, 0.0); // всех ArrayInitialize(equityMin, 0.0); // буферов ArrayInitialize(equityMinB, 0.0); // индикатора ArraySetAsSeries(balance, true); // все ArraySetAsSeries(clrBalance, true); // буферы ArraySetAsSeries(equityMax, true); // индикатора ArraySetAsSeries(equityMaxB, true); // имеют ArraySetAsSeries(equityMin, true); // флаг ArraySetAsSeries(equityMinB, true); // AS_SERIES 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) return(rates_total); double bal = AccountInfoDouble(ACCOUNT_BALANCE); double equity = AccountInfoDouble(ACCOUNT_EQUITY); if(rates_total > prev_calculated) { minEquity = 0; maxEquity = 0; } minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity); maxEquity = fmax(maxEquity, equity); balance[0] = AccountInfoDouble(ACCOUNT_BALANCE); 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); }//+------------------------------------------------------------------+我稍后会发一个视频,到时就清楚了。我无法在手指上比以前解释得更清楚。我希望你不要介意下载和解压视频。 不幸的是,它从图表中移除并附加到图表上的事实没有被记录下来,但它有一个事实,即该指标在那里,然后它消失了,然后它又在那里。它只是删除并将其附加回来。在重新安装指示器后,请注意数据窗口。即使在强制初始化缓冲区后,那里仍然有空间碎片。 附加的文件: 00.zip 2614 kb prev_calculated 初学者的问题 MQL5 MT5 MetaTrader MQL5的股权振荡器意味着 Vladimir Karputov 2016.10.18 16:00 #34 Alexey Viktorov:以下是该指标的代码 你需要做这样的实验:只留一个图表,并在上面放上和取下指标。而你需要有关终端和操作系统的信息(终端的日志标签)。 Alexey Viktorov 2016.10.18 16:05 #35 Karputov Vladimir: 我想做个实验:只留一个图表,用它来放和取指标。而且你需要有关终端和操作系统的信息(终端的 "日志 "选项卡)。一个图表有什么关系呢?该指标只在一个图表上的事实还不够?补充说。虽然我不相信操作系统可以影响指标的行为,但这里有关于系统和终端的信息2016.10.16 20:56:34.904 Terminal D:\MetaTrader 5\MetaTrader 52016.10.16 20:56:34.904 Terminal Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:002016.10.16 20:56:34.904 Terminal MetaTrader 5 build 1455 started (MetaQuotes Software Corp.) prev_calculated 错误、漏洞、问题 谁拥有以下软件包:Windows 7 x64和MetaTrader 4终端? Vladimir Karputov 2016.10.18 16:10 #36 Alexey Viktorov: 一个图表有什么关系呢?该指标只在一个图表上,这还不够吗?我正在努力缩小问题的范围。我没有这样的问题。我的配置。2016.10.18 19:09:34.239 Terminal MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:002016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962 prev_calculated 错误、漏洞、问题 MetaEditor build 1463 Vladimir Karputov 2016.10.18 16:14 #37 所以...局势开始形成了。添加这个代码。 {//--- if(prev_calculated==0) { Print("prev_calculated==0"); return(rates_total); } double bal=AccountInfoDouble(ACCOUNT_BALANCE); Alexey Viktorov 2016.10.18 16:16 #38 Karputov Vladimir:我正在努力缩小问题的范围。我没有这个问题。我的配置。2016.10.18 19:09:34.239 Terminal MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:002016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962开始执行了,但当我启动指标时,在一个缓冲区内几乎所有的历史都有瘟疫数字。取出指示器后,过了一会儿再放进去,缓冲区就空了。我以后会重复拆除和放回的过程。 Vladimir Karputov 2016.10.18 16:18 #39 初步结论。1.指标不能依赖OnInit()中的指标数组的初始化。//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit() {//--- indicator buffers mapping... ArrayInitialize(balance, 0.0); // принудительная ArrayInitialize(equityMax, 0.0); // инициализация ArrayInitialize(equityMaxB, 0.0); // всех ArrayInitialize(equityMin, 0.0); // буферов ArrayInitialize(equityMinB, 0.0); // индикатора...//--- return(INIT_SUCCEEDED); }2.在指标中,有必要在OnCalculate() 中通过整个数组或只通过改变的元素。 prev_calculated 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 萌新求助,最简单的5日移动均线如何编写?mql4 Alexey Viktorov 2016.10.18 16:18 #40 Karputov Vladimir:所以...局势开始形成了。添加这样的代码。 {//--- if(prev_calculated==0) { Print("prev_calculated==0"); return(rates_total); } double bal=AccountInfoDouble(ACCOUNT_BALANCE);像这样添加Print("prev_calculated = ", prev_calculated); 1234567891011...14 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
也许开发者应该注意指标缓冲区的初始化问题?为什么在MT4中没有这样的问题?也许这不是完全的理解?问题是,即使在EACH中从图表上取下一个指标后强制初始化缓冲区,也不是所有的缓冲区都包含垃圾,你不能把它从那里弄出来。
我个人并不介意拐杖,但前提是这些拐杖不能太复杂,而且要有积极作用。但是,写到一个文件,然后再读它,是一个蹩脚的拐杖。
你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?从图表中删除指标后,你以何种方式访问其指标缓冲区?
让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...
你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?从图表中删除指标后,你能以何种方式访问其指标缓冲区?
让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...
纯粹的假设:在当前的缓冲区访问过程中,它可能会进入同一个内存区域,而这个区域被之前的缓冲区所占据。
我还没有进入对话,不要踢,Alexey想让缓冲区的数据在重新启动(终端的开关)时保持不变,还是只在prev_calculated = 0时保持不变(如果prev_calculated > 0之前)?
你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?在从图表中删除指标后,你以何种方式访问其指标缓冲区?
让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...
以下是指标的代码
| 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;
//+------------------------------------------------------------------+
//| 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);
ArrayInitialize(balance, 0.0); // принудительная
ArrayInitialize(equityMax, 0.0); // инициализация
ArrayInitialize(equityMaxB, 0.0); // всех
ArrayInitialize(equityMin, 0.0); // буферов
ArrayInitialize(equityMinB, 0.0); // индикатора
ArraySetAsSeries(balance, true); // все
ArraySetAsSeries(clrBalance, true); // буферы
ArraySetAsSeries(equityMax, true); // индикатора
ArraySetAsSeries(equityMaxB, true); // имеют
ArraySetAsSeries(equityMin, true); // флаг
ArraySetAsSeries(equityMinB, true); // AS_SERIES
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)
return(rates_total);
double bal = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
if(rates_total > prev_calculated)
{
minEquity = 0;
maxEquity = 0;
}
minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity);
maxEquity = fmax(maxEquity, equity);
balance[0] = AccountInfoDouble(ACCOUNT_BALANCE);
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);
}
//+------------------------------------------------------------------+
我稍后会发一个视频,到时就清楚了。我无法在手指上比以前解释得更清楚。
我希望你不要介意下载和解压视频。
不幸的是,它从图表中移除并附加到图表上的事实没有被记录下来,但它有一个事实,即该指标在那里,然后它消失了,然后它又在那里。它只是删除并将其附加回来。
在重新安装指示器后,请注意数据窗口。即使在强制初始化缓冲区后,那里仍然有空间碎片。
以下是该指标的代码
我想做个实验:只留一个图表,用它来放和取指标。而且你需要有关终端和操作系统的信息(终端的 "日志 "选项卡)。
一个图表有什么关系呢?该指标只在一个图表上的事实还不够?
补充说。
虽然我不相信操作系统可以影响指标的行为,但这里有关于系统和终端的信息
2016.10.16 20:56:34.904 Terminal Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:00
2016.10.16 20:56:34.904 Terminal MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
一个图表有什么关系呢?该指标只在一个图表上,这还不够吗?
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962
所以...局势开始形成了。添加这个代码。
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962
开始执行了,但当我启动指标时,在一个缓冲区内几乎所有的历史都有瘟疫数字。
取出指示器后,过了一会儿再放进去,缓冲区就空了。
我以后会重复拆除和放回的过程。
初步结论。
所以...局势开始形成了。添加这样的代码。
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
像这样添加