新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 659

 
Roman Sharanov:

我还发现一个严重的缺点,对CopyClose()的调用 太多

你能告诉我如何在一个循环中复制货币对数组的报价吗?

这似乎是一个双数组,这就是为什么MQL不支持它,像%。

MQL4似乎适用于二维动态数组。 你可以用ArayResize()改变第一维,并将第二维传递给CopyClose()

或者是开发人员的通用解决方案,因为二维动态数组在MQL5中不工作,将一维数组包裹在一个结构中并创建一个这样的结构数组....。如果你开窍了,考虑到你几乎已经创建了一个类,而且是更理想的--一个带有加载数据并将其存储在类的属性(字段)的方法的类
 
Igor Makanu:

MQL4似乎适用于二维动态数组,使用ArayResize()来改变第一维,CopyClose() 来改变第二维。

或开发人员提供的通用解决方案,因为二维动态数组在MQL5中不工作,将一维数组包裹在一个结构中并创建一个这样的结构数组....。如果你掌握了这个方法,考虑到你几乎已经创建了一个类,而且是比较理想的--一个具有加载数据本身并将其存储在类的属性(字段)中的方法的类

谢谢你,我将尝试

 

关于指标的另一个问题,我不知道在这里还能做什么

我需要打印所输入货币对的收盘价与它们的移动平均线 之间的差额。

我不知道还能做什么。

#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);
  }
//+------------------------------------------------------------------+
 
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);
}

 
Андрей:
为什么我们甚至需要所有订单的信息,每一个刻度?引入顺序查看的限制不是更好吗,例如每隔一分钟、五分钟、...、一小时?

问题甚至不是我需要每个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
 
Artyom Trishkin:

你怎么知道的?它 没有。

在完成所有从tick的到来开始的计算之前,所有后续的tick都被跳过

就像我在上面写的那样,我也有同样的情况,只是我已经把它简化到了一定程度,得出的结论是,我不仅可以正常地不做任何计算,而只是一个一个地查看订单,在日志中打印它们的数字。

我也一直认为,"在所有以一个刻度线的到来开始的计算完成之前,所有后续的刻度线都被跳过"。我希望是这样,但除了新的虱子之外,我还找不到其他原因。

 
Artyom Trishkin:

没有密码,谁也不会知道。

这里是一个极其简化的代码,它有同样的问题--新的刻度线会丢掉连续输出的顺序号。

int test()
{
int total;
total =OrdersTotal();
log("total = " + total +"; " );

for (int j = 0; j <)total; j++)
{
log("j = " + j +" 。");
}
return(0);
}

 
Algotrader18:

这里有一个极其简化的代码,它有同样的问题--新的刻度线会丢掉顺序输出的序号。

int test()
{
总数。
total = OrdersTotal();
log("total = " + total +"; " )。

for (int j = 0; j < total; j++)
{
log("j = " + j +"; " )。
}
return(0);
}

这段代码的编译真的没有错误吗?我不相信...
 
Roman Sharanov:

关于指标的另一个问题,我不知道在这里还能做什么

我需要打印所输入货币对的收盘价与它们的移动平均线 之间的差额。

最后,它只是显示了没有MA的差异,问题是什么?

这真是太酷了!

罗曼!

例如,我是一个拥有20年经验的成功交易员。

我不明白为什么你需要"所输入的货币对的收盘价和它们移动平均数 之间的差额"。

此外,你知道如何建立这些差异的移动平均线吗?- 太棒了!

你能简单地画出报价的移动平均线吗?- 也没有?

那么问题出在哪里呢?

 
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);
  }