新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 659 1...652653654655656657658659660661662663664665666...1953 新评论 Igor Makanu 2018.10.12 14:01 #6581 Roman Sharanov:我还发现一个严重的缺点,对CopyClose()的调用 太多 你能告诉我如何在一个循环中复制货币对数组的报价吗? 这似乎是一个双数组,这就是为什么MQL不支持它,像%。 MQL4似乎适用于二维动态数组。 你可以用ArayResize()改变第一维,并将第二维传递给CopyClose()。 或者是开发人员的通用解决方案,因为二维动态数组在MQL5中不工作,将一维数组包裹在一个结构中并创建一个这样的结构数组....。如果你开窍了,考虑到你几乎已经创建了一个类,而且是更理想的--一个带有加载数据并将其存储在类的属性(字段)的方法的类 Roman Sharanov 2018.10.12 14:56 #6582 Igor Makanu:MQL4似乎适用于二维动态数组,使用ArayResize()来改变第一维,CopyClose() 来改变第二维。 或开发人员提供的通用解决方案,因为二维动态数组在MQL5中不工作,将一维数组包裹在一个结构中并创建一个这样的结构数组....。如果你掌握了这个方法,考虑到你几乎已经创建了一个类,而且是比较理想的--一个具有加载数据本身并将其存储在类的属性(字段)中的方法的类谢谢你,我将尝试 Roman Sharanov 2018.10.12 14:59 #6583 关于指标的另一个问题,我不知道在这里还能做什么 我需要打印所输入货币对的收盘价与它们的移动平均线 之间的差额。 我不知道还能做什么。 #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 2 #property indicator_type1 DRAW_COLOR_LINE #property indicator_style1 STYLE_SOLID #property indicator_type2 DRAW_LINE #property indicator_style2 STYLE_SOLID #property indicator_width1 1 #include <MovingAverages.mqh> input string active_1 = "EURUSD"; input string active_2 = "USDJPY"; input ENUM_TIMEFRAMES timeframe = PERIOD_H1; input int ma_period = 30; double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, dataBuffer, INDICATOR_DATA); SetIndexBuffer(1, maBuffer, INDICATOR_DATA); SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS); SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- CopyClose(active_1,timeframe,0,rates_total,firstBuffer); CopyClose(active_2,timeframe,0,rates_total,secondBuffer); int first, bar; if(prev_calculated == 0) first = begin; else first = prev_calculated - 1; for(bar = first; bar<rates_total; bar++){ dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar]; } ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ Algotrader18 2018.10.12 15:59 #6584 Igor Makanu:订单应该在一个循环中被列举出来,而不是在每一次打勾的时候...更准确地说,一个嘀嗒声来了,你所有的订单都在循环中被计算了:for(j=0;j<OrderTotal;j++) OrdersTotal()显示了有多少订单未结(包括挂单,包括所有符号的订单...总的来说...这里是在终端开了多少个订单--这是多少个))))。 订单编号就像在数组中一样,从0到OrdersTotal()-1--这是最后一个订单,你可能在每一个tick上都有一个不存在的票号[OrdersTotal()]或日记中的其他信息,这很难猜到。是的,我想--而且我希望它能通过所有的订单。起初功能有点不同,但我已经尽可能简化,希望能找到原因并加以解决。完全的连续回调只发生在当点数很少的时候,或者在我把EA从图表上移开,没有新的点数出现之后。 我一直认为,如果EA已经进入了一个函数的主体,那么在退出循环之前,它应该不会对其他的ticks做出反应,但似乎情况并非如此。如何避免这种情况? int test() { 总数。 total = OrdersTotal(); log("total = " + total +"; " )。 for (int j = 0; j < total; j++){ log("j = " + j +"; " )。 } return(0);} Algotrader18 2018.10.12 16:13 #6585 Андрей: 为什么我们甚至需要所有订单的信息,每一个刻度?引入顺序查看的限制不是更好吗,例如每隔一分钟、五分钟、...、一小时?问题甚至不是我需要每个tick的信息,而是,如果我理解正确的话,在新的tick到来之前,循环没有时间完成,新的tick就会以某种方式破坏账户。这是另一张截图,这样你就不必再去找以前的截图了。它显示,EA已经数到了52,然后跳到了93。我很难相信这是因为新的刻度线,但我找不到其他原因,因为当刻度线很少时,账户完成得很好,EA从图表中删除后的最后一个周期也是如此。 我已经尽可能地简化了代码。 int test() { 总数。 total = OrdersTotal(); log("total = " + total +"; " )。 for (int j = 0; j < total; j++){ log("j = " + j +"; " )。 } return(0);} 附加的文件: test.jpg 82 kb Algotrader18 2018.10.12 16:27 #6586 Artyom Trishkin:你怎么知道的?它 没有。 在完成所有从tick的到来开始的计算之前,所有后续的tick都被跳过。就像我在上面写的那样,我也有同样的情况,只是我已经把它简化到了一定程度,得出的结论是,我不仅可以正常地不做任何计算,而只是一个一个地查看订单,在日志中打印它们的数字。 我也一直认为,"在所有以一个刻度线的到来开始的计算完成之前,所有后续的刻度线都被跳过"。我希望是这样,但除了新的虱子之外,我还找不到其他原因。 Algotrader18 2018.10.12 16:32 #6587 Artyom Trishkin:没有密码,谁也不会知道。这里是一个极其简化的代码,它有同样的问题--新的刻度线会丢掉连续输出的顺序号。 int test(){ int total; total =OrdersTotal(); log("total = " + total +"; " ); for (int j = 0; j <)total; j++){ log("j = " + j +" 。");} return(0);} Alexey Viktorov 2018.10.12 16:35 #6588 Algotrader18:这里有一个极其简化的代码,它有同样的问题--新的刻度线会丢掉顺序输出的序号。 int test() { 总数。 total = OrdersTotal(); log("total = " + total +"; " )。 for (int j = 0; j < total; j++){ log("j = " + j +"; " )。 } return(0);} 这段代码的编译真的没有错误吗?我不相信... [删除] 2018.10.12 16:40 #6589 Roman Sharanov:关于指标的另一个问题,我不知道在这里还能做什么 我需要打印所输入货币对的收盘价与它们的移动平均线 之间的差额。 最后,它只是显示了没有MA的差异,问题是什么? 这真是太酷了! 罗曼! 例如,我是一个拥有20年经验的成功交易员。 我不明白为什么你需要"所输入的货币对的收盘价和它们 的移动平均数 之间的差额"。 此外,你知道如何建立这些差异的移动平均线吗?- 太棒了! 你能简单地画出报价的移动平均线吗?- 也没有? 那么问题出在哪里呢? Igor Makanu 2018.10.12 17:19 #6590 Algotrader18:这里有一个极其简化的代码,它有同样的问题--新的刻度线会破坏顺序输出的顺序号。 int test() { 总数。 total = OrdersTotal(); log("total = " + total +"; " )。 for (int j = 0; j < total; j++){ log("j = " + j +"; " )。 } return(0);} 这个代码是有效的,通过类比来做。 int NumberOfOrders(int magic_) { int i,res=0,k=OrdersTotal(); string sy=Symbol(); for(i=0; i<k; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++; } } return(res); } 1...652653654655656657658659660661662663664665666...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我还发现一个严重的缺点,对CopyClose()的调用 太多
你能告诉我如何在一个循环中复制货币对数组的报价吗?
这似乎是一个双数组,这就是为什么MQL不支持它,像%。
MQL4似乎适用于二维动态数组。 你可以用ArayResize()改变第一维,并将第二维传递给CopyClose()。
或者是开发人员的通用解决方案,因为二维动态数组在MQL5中不工作,将一维数组包裹在一个结构中并创建一个这样的结构数组....。如果你开窍了,考虑到你几乎已经创建了一个类,而且是更理想的--一个带有加载数据并将其存储在类的属性(字段)的方法的类MQL4似乎适用于二维动态数组,使用ArayResize()来改变第一维,CopyClose() 来改变第二维。
或开发人员提供的通用解决方案,因为二维动态数组在MQL5中不工作,将一维数组包裹在一个结构中并创建一个这样的结构数组....。如果你掌握了这个方法,考虑到你几乎已经创建了一个类,而且是比较理想的--一个具有加载数据本身并将其存储在类的属性(字段)中的方法的类谢谢你,我将尝试
关于指标的另一个问题,我不知道在这里还能做什么
我需要打印所输入货币对的收盘价与它们的移动平均线 之间的差额。
我不知道还能做什么。
订单应该在一个循环中被列举出来,而不是在每一次打勾的时候...更准确地说,一个嘀嗒声来了,你所有的订单都在循环中被计算了:for(j=0;j<OrderTotal;j++)
OrdersTotal()显示了有多少订单未结(包括挂单,包括所有符号的订单...总的来说...这里是在终端开了多少个订单--这是多少个))))。
订单编号就像在数组中一样,从0到OrdersTotal()-1--这是最后一个订单,你可能在每一个tick上都有一个不存在的票号[OrdersTotal()]或日记中的其他信息,这很难猜到。
是的,我想--而且我希望它能通过所有的订单。起初功能有点不同,但我已经尽可能简化,希望能找到原因并加以解决。完全的连续回调只发生在当点数很少的时候,或者在我把EA从图表上移开,没有新的点数出现之后。
我一直认为,如果EA已经进入了一个函数的主体,那么在退出循环之前,它应该不会对其他的ticks做出反应,但似乎情况并非如此。如何避免这种情况?
int test()
{
总数。
total = OrdersTotal();
log("total = " + total +"; " )。
for (int j = 0; j < total; j++)
{
log("j = " + j +"; " )。
}
return(0);
}
为什么我们甚至需要所有订单的信息,每一个刻度?引入顺序查看的限制不是更好吗,例如每隔一分钟、五分钟、...、一小时?
问题甚至不是我需要每个tick的信息,而是,如果我理解正确的话,在新的tick到来之前,循环没有时间完成,新的tick就会以某种方式破坏账户。这是另一张截图,这样你就不必再去找以前的截图了。它显示,EA已经数到了52,然后跳到了93。我很难相信这是因为新的刻度线,但我找不到其他原因,因为当刻度线很少时,账户完成得很好,EA从图表中删除后的最后一个周期也是如此。
我已经尽可能地简化了代码。
int test()
{
总数。
total = OrdersTotal();
log("total = " + total +"; " )。
for (int j = 0; j < total; j++)
{
log("j = " + j +"; " )。
}
return(0);
}
你怎么知道的?它 没有。
在完成所有从tick的到来开始的计算之前,所有后续的tick都被跳过。
就像我在上面写的那样,我也有同样的情况,只是我已经把它简化到了一定程度,得出的结论是,我不仅可以正常地不做任何计算,而只是一个一个地查看订单,在日志中打印它们的数字。
我也一直认为,"在所有以一个刻度线的到来开始的计算完成之前,所有后续的刻度线都被跳过"。我希望是这样,但除了新的虱子之外,我还找不到其他原因。
没有密码,谁也不会知道。
这里是一个极其简化的代码,它有同样的问题--新的刻度线会丢掉连续输出的顺序号。
int test()
{
int total;
total =OrdersTotal();
log("total = " + total +"; " );
for (int j = 0; j <)total; j++)
{
log("j = " + j +" 。");
}
return(0);
}
这里有一个极其简化的代码,它有同样的问题--新的刻度线会丢掉顺序输出的序号。
int test()
{
总数。
total = OrdersTotal();
log("total = " + total +"; " )。
for (int j = 0; j < total; j++)
{
log("j = " + j +"; " )。
}
return(0);
}
关于指标的另一个问题,我不知道在这里还能做什么
我需要打印所输入货币对的收盘价与它们的移动平均线 之间的差额。
最后,它只是显示了没有MA的差异,问题是什么?
这真是太酷了!
罗曼!
例如,我是一个拥有20年经验的成功交易员。
我不明白为什么你需要"所输入的货币对的收盘价和它们 的移动平均数 之间的差额"。
此外,你知道如何建立这些差异的移动平均线吗?- 太棒了!
你能简单地画出报价的移动平均线吗?- 也没有?
那么问题出在哪里呢?
这里有一个极其简化的代码,它有同样的问题--新的刻度线会破坏顺序输出的顺序号。
int test()
{
总数。
total = OrdersTotal();
log("total = " + total +"; " )。
for (int j = 0; j < total; j++)
{
log("j = " + j +"; " )。
}
return(0);
}
这个代码是有效的,通过类比来做。