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

 
Igor Zakharov:

只是不是日历上的那些。30天酒吧倒退(周日、周六)。

从没有移位参数的函数来看,你是在5中做的,而你在4中问了这个问题:)

是的,如果从昨天算起,30条是21个工作日。(24.02.2019 - 25.01.2019)

我有

本月的平均蜡烛尺寸:598

一周的平均蜡烛尺寸:519

而iATR()给出的是十位数的数字...

所以我还不明白如何使用它。

 
Alexander Layzerevich:

而iATR()输出十位数的数字...

通常情况下,小数点后的分数(即像价格一样。 要转换为点数,需要除以_点)。

请看插图:截至今天,欧元/美元 - 本月每日560点。


 
Igor Zakharov:

通常情况下,小数点后的分数(即像价格一样。 要转换为点数,要除以_点)。

请看插图:截至今天,欧元/美元 - 一个月内每天560点。


我在MQL4中检查了它。

iATR

 
Igor Zakharov:

通常情况下,小数点后的分数(即像价格一样。 要转换为点数,要除以_点)。

请看插图:截至今天,欧元/美元 - 一个月内每天560点。


我在MQL5中检查了它。我写了以下代码来检查它。

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

这就是它所显示的。

iATR

也就是说,它显示一个数值,但又显示一个不同的数值...

 
Alexander Layzerevich:

在MQL5中进行了检查。写了这个代码来检查它。

这就是它的输出。

也就是说,它显示一个值,但又显示一个不同的值...

在MQL5中,这样的指标工作结构并不适合

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

首先你必须创建一个句柄,你已经做到了,只有在这之后你才能从CopyBuffer 中获取数值

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

在MQL5中,这样的指标工作结构并不适合

首先你必须创建一个句柄,这就是你现在所做的,之后你可以从CopyBuffer 中获取数值

谢谢,我将考虑到这一点并重写代码。

我只是在MT4中编写,使用#include <MT4Orders.mqh>在MT5中测试。

也许图书馆不支持指标。

 
Alexander Layzerevich:

谢谢,我将考虑到这一点并重写代码。

我只是在MT4中编写,并使用#include <MT4Orders.mqh>在MT5中测试。

也许该库不支持指标。

是的,只有贸易功能

 
Alexander Layzerevich:

谢谢,我将考虑到这一点并重写代码。

我只是在MT4中编写,并使用#include <MT4Orders.mqh>在MT5中测试。

也许该库不支持指标。

这是一个非常快速的结合两个平台的方法,它很有效,但最好不要在mql5中这样做

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

并以与mql4中相同的方式应用该指标

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

这是一个非常快速的结合两个平台的选项,它可以工作,但最好不要在mql5中这样做

并以与mql4中相同的方式应用该指标

非常感谢您提供的代码。

它已经成功了。

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

现在我在EA启动之初就有了平均数据。而这个数据在我每次访问这个函数时都会重新计算。

我明白,为了限制调用,我需要用计算出的数据做一个缓冲记录。

因此,我们需要设置重新计算的条件。在 "星期一",如果缓冲区内没有任何东西。

例如,声明变量buferStep = -1;在OnTick(),如果 buferStep <0或 "Monday",则重新计算。

这里我又被卡住了,机器人怎么能宣布今天是 "星期一 "呢?

 
Alexander Layzerevich:

非常感谢您提供的代码。

它的结果是这样的。

我现在有了EA开始时的平均数据。而这个数据在每次调用该函数时都会重新计算。

我明白,为了限制调用,我需要用计算出的数据做一个缓冲记录。

因此,我们需要设置重新计算的条件。在 "星期一",如果缓冲区内没有任何东西。

例如,声明变量buferStep = -1;在OnTick(),如果 buferStep <0或 "Monday",则重新计算。

在这里我又遇到了一个难题,机器人怎么能宣布今天是 "星期一"?

我不想用星期一,我只想用几天前的数字。我将在每一个新的条形图上得到它,以避免在每一个刻度 上加载专家顾问的计算。