prev_calculated - 页 6 1234567891011121314 新评论 Dmitry Fedoseev 2016.10.18 17:03 #51 你只是不需要用坚果敲击铁器。 Vladimir Karputov 2016.10.18 17:09 #52 Alexey Viktorov: 这不在文件中因此,这是一篇关于自由主题的论文。就像我说的自动初始化,甚至更酷。至少我的有一个免责声明...在文件中不可能绝对地描述一切。 如果 "prev_calculate==0"--这意味着我们必须浏览整个指标缓冲区。如果 "prev_calculate!=0",那么只有最右边的柱子或几个新的柱子会被计算(我们使用limit)。 const int &spread[]) {//--- if(prev_calculated==0) { Print("prev_calculated==0"); for(int i=0;i<rates_total;i++) { //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) ) } return(rates_total); }//--- экономный пересчёт только самого правого бара или новых баров int limit=rates_total-prev_calculated+1;//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров for(int i=0;i<limit;i++) { ExtBuffer[i]=чевой-то там; } prev_calculated 编码帮助 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 Alexey Viktorov 2016.10.18 17:21 #53 Karputov Vladimir:在文件中不可能绝对地描述一切。 如果 "prev_calculate==0"--这意味着我们必须浏览整个指标缓冲区。如果 "prev_calculate!=0",那么只有最右边的柱子或几个新的柱子会被计算(我们使用limit)。 const int &spread[]) {//--- if(prev_calculated==0) { Print("prev_calculated==0"); for(int i=0;i<rates_total;i++) { //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) ) } return(rates_total); }//--- экономный пересчёт только самого правого бара или новых баров int limit=rates_total-prev_calculated+1;//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров for(int i=0;i<limit;i++) { ExtBuffer[i]=чевой-то там; }价值是什么?除了最右边的栏,我不需要任何数值。但是!!!。然后当这个最右边的人向左移动时,这个数据必须被保存......你不必写所有的缓冲区,但你可以考虑到我的愿望来写一个。如果是第一次运行,所有历史记录应该是空的。如果prev_calculated由于历史互换而被重置,所有 被放入缓冲区的东西 都应该保持不变。即使有漏洞。 Alexey Viktorov 2016.10.18 17:26 #54 Karputov Vladimir:初步结论。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()中通过整个数组或只通过改变的元素。 你在胡说八道什么?如果这个初始化是在OnCalculate 中实现的,它将在没有任何循环的情况下被初始化。但如果我们将prev_calculated清零,就会清除工作中积累的所有数据。 Vladimir Karputov 2016.10.18 17:53 #55 Alexey Viktorov: 你为什么要胡说八道呢?如果这个初始化被放到OnCalculate中,它就会被清零,没有任何循环。但如果我们将prev_calculated清零,就会清除所有在操作中积累的数据...... 请使用表达方式。再看看标准交付集的指标实例:Data Catalogue/MQL5/Indicators/Examples/。 Vladimir Karputov 2016.10.18 18:00 #56 Alexey Viktorov:有什么价值呢?我不需要除最右边一栏以外的任何值。但是!!!。然后当这个最右边的人向左移动时,这个数据就需要被保存.........我已经提出了一个方法。 关于交易、自动交易系统和交易策略测试的论坛 prev_calculated Karputov Vladimir, 2016.10.18 15:11 很抱歉延迟回复。保存某个时间段的计算值的唯一方法是将它们保存到一个文件中。你需要处理好同步问题--这样当从文件中读取数据时,数据就会被放在它们的柱子上。最合理的方式是与条形图的打开时间 同步,但可能有一些细微的差别:例如,条形图的打开时间(保存到文件中)是2016.09.05. 25:02,但现在图表上有一个条形图,时间等于2016.09.05. 25:01。一个指标不是一个数据库或资料库。 因此,如果指标显示的数据然后不能在历史上计算,那么只需要将指标缓冲区保存到文件中,然后(在历史互换的情况下)读取并同步文件和条形图。 Alexey Viktorov 2016.10.18 18:06 #57 Karputov Vladimir:我已经提出了一个方法。一个指标不是一个数据库或资料库。 因此,如果指标显示的数据,然后不能在历史上计算,那么我们只需要将指标缓冲区保存在一个文件中,然后(在历史交换的情况下)进行读取并同步文件和条形图。阿列克谢-维克多罗夫。...而且最好不要写到文件里,更不要写到GV里。 prev_calculated www.mql5.com Форум трейдеров MQL5.community Alexander Puzanov 2016.10.18 18:13 #58 Vladimir,既然你专门为prev_calculated提供了这个话题,那就在这个话题上让它发挥作用。首先,你应该说明这个变量通常出现的问题。如果你对这些问题不熟悉,我将提出---a--尽管它在帮助中说prev_calculated // обработано баров на предыдущем вызове原因是(它写在帮助中+由开发人员告知),当校验和改变时,变量被重置为零,通常是因为历史交换。---b - 你也不能用prev_calculated == 0作为第一次运行onCalculate 的标志。出于同样的原因---c - 你也不能用prev_calculated == 0作为历史分页标志。---为了减少对用户的损耗,措辞应该简明扼要:如果在当前调用OnCalculate时还没有发生历史分页,prev_calculated包含在上一次调用时处理的条数。如果它发生了 - 它被重置为零---所列的3个问题都可以用拐杖解决。然而,既然MT5顾名思义不能有拐杖,弗拉基米尔,你能否为这三个问题创造一个有吸引力的解决方案?一个丑陋的是这样的。#property indicator_chart_window#property indicator_buffers 0#property indicator_plots 0struct BROWNIE { int i_Prew_Calculated; // кол-во посчитанных баров bool b_First_Run; // флаг первого запуска bool b_History_Updated; // флаг обновления истории BROWNIE() { i_Prew_Calculated = WRONG_VALUE; b_First_Run = true; b_History_Updated = false; } void f_Reset(bool b_Reset_First_Run = true) { i_Prew_Calculated = WRONG_VALUE; if(b_Reset_First_Run) b_First_Run = true; b_History_Updated = false; } void f_Update(int i_New_Prew_Calculated = WRONG_VALUE) { if(i_New_Prew_Calculated > -1) { b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE; if(b_First_Run) b_First_Run = false; if(i_Prew_Calculated == WRONG_VALUE) i_Prew_Calculated = i_New_Prew_Calculated; else if(i_New_Prew_Calculated > 0) i_Prew_Calculated = i_New_Prew_Calculated; } }}; BROWNIE go_Brownie;int OnInit(void) {return(INIT_SUCCEEDED);}void OnDeinit(const int reason) { go_Brownie.f_Reset(reason != REASON_CHARTCHANGE);}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 &TickVolume[], const long &Volume[], const int &Spread[]) { if(go_Brownie.b_First_Run) {/* обработка 1го запуска */} if(go_Brownie.b_History_Updated) {/* обработка обновления истории */} go_Brownie.f_Update(prev_calculated); return(rates_total);}免责声明:代码--只是一个想法,我没有在图表上尝试。在OnDeinit中,有一个样本--对不使用缓冲区的指标进行处理,它不关心TF和符号,在TF/符号的每一次变化中,没有必要从头开始。例如,它与现有的图形元素一起工作,输出有关账户状态、订单等信息。---顺便说一下Karputov Vladimir:如果该选项被启用,只需要将指标缓冲区保存到文件中,然后(在历史分页的情况下)读取并同步文件和条形图。 你不必销毁磁盘,你可以把它保存在图表项中 prev_calculated 错误、漏洞、问题 mt5 ObjectDelete中是否有一个错误? Konstantin Gruzdev 2016.10.18 18:19 #59 Alexey Viktorov:...而且最好不要写到文件中,更不要写到GV中。这 对你有好处吗? Alexey Viktorov 2016.10.18 18:42 #60 Konstantin Gruzdev: 也许这 对你有好处?我没有细说,但这是通过这行代码解决的。将一个数组复制到自身,并进行索引移动。double arr[5];ArrayCopy(arr, arr, 0, 1, 4);// и дальнейшее заполнение 4го индекса массива. 你可以把它倒过来,从零号索引复制,从第一个索引粘贴。然后,数组的零索引将被填入。而这是完全不同的事情......)) 1234567891011121314 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这不在文件中因此,这是一篇关于自由主题的论文。就像我说的自动初始化,甚至更酷。至少我的有一个免责声明...
在文件中不可能绝对地描述一切。
如果 "prev_calculate==0"--这意味着我们必须浏览整个指标缓冲区。如果 "prev_calculate!=0",那么只有最右边的柱子或几个新的柱子会被计算(我们使用limit)。
{
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
for(int i=0;i<rates_total;i++)
{
//--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
}
return(rates_total);
}
//--- экономный пересчёт только самого правого бара или новых баров
int limit=rates_total-prev_calculated+1;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
for(int i=0;i<limit;i++)
{
ExtBuffer[i]=чевой-то там;
}
在文件中不可能绝对地描述一切。
如果 "prev_calculate==0"--这意味着我们必须浏览整个指标缓冲区。如果 "prev_calculate!=0",那么只有最右边的柱子或几个新的柱子会被计算(我们使用limit)。
{
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
for(int i=0;i<rates_total;i++)
{
//--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
}
return(rates_total);
}
//--- экономный пересчёт только самого правого бара или новых баров
int limit=rates_total-prev_calculated+1;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
for(int i=0;i<limit;i++)
{
ExtBuffer[i]=чевой-то там;
}
价值是什么?除了最右边的栏,我不需要任何数值。但是!!!。然后当这个最右边的人向左移动时,这个数据必须被保存......
你不必写所有的缓冲区,但你可以考虑到我的愿望来写一个。如果是第一次运行,所有历史记录应该是空的。如果prev_calculated由于历史互换而被重置,所有 被放入缓冲区的东西 都应该保持不变。即使有漏洞。
初步结论。
你为什么要胡说八道呢?如果这个初始化被放到OnCalculate中,它就会被清零,没有任何循环。但如果我们将prev_calculated清零,就会清除所有在操作中积累的数据......
有什么价值呢?我不需要除最右边一栏以外的任何值。但是!!!。然后当这个最右边的人向左移动时,这个数据就需要被保存......
...
我已经提出了一个方法。
关于交易、自动交易系统和交易策略测试的论坛
prev_calculated
Karputov Vladimir, 2016.10.18 15:11
很抱歉延迟回复。保存某个时间段的计算值的唯一方法是将它们保存到一个文件中。你需要处理好同步问题--这样当从文件中读取数据时,数据就会被放在它们的柱子上。最合理的方式是与条形图的打开时间 同步,但可能有一些细微的差别:例如,条形图的打开时间(保存到文件中)是2016.09.05. 25:02,但现在图表上有一个条形图,时间等于2016.09.05. 25:01。一个指标不是一个数据库或资料库。
因此,如果指标显示的数据然后不能在历史上计算,那么只需要将指标缓冲区保存到文件中,然后(在历史互换的情况下)读取并同步文件和条形图。我已经提出了一个方法。
一个指标不是一个数据库或资料库。
因此,如果指标显示的数据,然后不能在历史上计算,那么我们只需要将指标缓冲区保存在一个文件中,然后(在历史交换的情况下)进行读取并同步文件和条形图。...而且最好不要写到文件里,更不要写到GV里。
Vladimir,既然你专门为prev_calculated提供了这个话题,那就在这个话题上让它发挥作用。首先,你应该说明这个变量通常出现的问题。如果你对这些问题不熟悉,我将提出
---
a--尽管它在帮助中说
原因是(它写在帮助中+由开发人员告知),当校验和改变时,变量被重置为零,通常是因为历史交换。
---
b - 你也不能用prev_calculated == 0作为第一次运行onCalculate 的标志。出于同样的原因
---
c - 你也不能用prev_calculated == 0作为历史分页标志。
---
为了减少对用户的损耗,措辞应该简明扼要:如果在当前调用OnCalculate时还没有发生历史分页,prev_calculated包含在上一次调用时处理的条数。如果它发生了 - 它被重置为零
---
所列的3个问题都可以用拐杖解决。然而,既然MT5顾名思义不能有拐杖,弗拉基米尔,你能否为这三个问题创造一个有吸引力的解决方案?一个丑陋的是这样的。
#property indicator_buffers 0
#property indicator_plots 0
struct BROWNIE {
int i_Prew_Calculated; // кол-во посчитанных баров
bool b_First_Run; // флаг первого запуска
bool b_History_Updated; // флаг обновления истории
BROWNIE() {
i_Prew_Calculated = WRONG_VALUE;
b_First_Run = true;
b_History_Updated = false;
}
void f_Reset(bool b_Reset_First_Run = true) {
i_Prew_Calculated = WRONG_VALUE;
if(b_Reset_First_Run) b_First_Run = true;
b_History_Updated = false;
}
void f_Update(int i_New_Prew_Calculated = WRONG_VALUE) {
if(i_New_Prew_Calculated > -1) {
b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE;
if(b_First_Run) b_First_Run = false;
if(i_Prew_Calculated == WRONG_VALUE) i_Prew_Calculated = i_New_Prew_Calculated;
else if(i_New_Prew_Calculated > 0) i_Prew_Calculated = i_New_Prew_Calculated;
}
}
};
BROWNIE go_Brownie;
int OnInit(void) {return(INIT_SUCCEEDED);}
void OnDeinit(const int reason) {
go_Brownie.f_Reset(reason != REASON_CHARTCHANGE);
}
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 &TickVolume[],
const long &Volume[],
const int &Spread[]
) {
if(go_Brownie.b_First_Run) {/* обработка 1го запуска */}
if(go_Brownie.b_History_Updated) {/* обработка обновления истории */}
go_Brownie.f_Update(prev_calculated);
return(rates_total);
}
免责声明:代码--只是一个想法,我没有在图表上尝试。
在OnDeinit中,有一个样本--对不使用缓冲区的指标进行处理,它不关心TF和符号,在TF/符号的每一次变化中,没有必要从头开始。例如,它与现有的图形元素一起工作,输出有关账户状态、订单等信息。
---
顺便说一下
如果该选项被启用,只需要将指标缓冲区保存到文件中,然后(在历史分页的情况下)读取并同步文件和条形图。
...而且最好不要写到文件中,更不要写到GV中。
也许这 对你有好处?
我没有细说,但这是通过这行代码解决的。将一个数组复制到自身,并进行索引移动。
ArrayCopy(arr, arr, 0, 1, 4);
// и дальнейшее заполнение 4го индекса массива.