紧急求助,,获取AMA指标的值

 

各位,我用下面这种写法时,没有办法获取到AMA的值,各位有好的写法吗,还请各位相助,小弟在此万分感谢!!!

需求:获取到AMA在某几根K线上的值,如AMA[0] values:1756.76, AMA[1] values:1756.98 等等

当前我通过这种方式获取的AMA值是这样的

handle_iama=iAMA(symbol,timeframe,ama_period,fast_ma_period,slow_ma_period,0,appliedPrice) //传参是没有错的

 double         AmaBuffer[];

ArraySetAsSeries(AmaBuffer,true);

CopyBuffer(handle_iama,0,0,5,AmaBuffer);

PrintFormat("买入订单成功,当前AMA[1]的值是%d,当前AMA[2]的值是%d",AmaBuffer[1],AmaBuffer[2]);


out:

2021.03.25 08:55:40.270 Core 1 2021.03.23 22:51:15   当前AMA[1]的值是1247448995,当前AMA[2]的值是-970949503


 
有人吗?
 

两点:

1.指标句柄应该在OnInit创建。

2.调用CopyBuffer时应该检查拷贝到的数据个数。

 
Ziheng Zhuang:

两点:

1.指标句柄应该在OnInit创建。

2.调用CopyBuffer时应该检查拷贝到的数据个数。

我用同样的方式去调用布林带及K线指标获取的值都是没问题的,唯独ama指标没有获取到值。下文是布林带及k线的值

double         UpperBuffer[];

      double         LowerBuffer[];

      double         MiddleBuffer[];

      ArraySetAsSeries(MiddleBuffer,true);

      CopyBuffer(handle_iBands,0,0,5,MiddleBuffer);//

      ArraySetAsSeries(UpperBuffer,true);

      CopyBuffer(handle_iBands,1,0,5,UpperBuffer);

      ArraySetAsSeries(LowerBuffer,true);

      CopyBuffer(handle_iBands,2,0,5,LowerBuffer);//分别获取布林带上中下轨的值 ,

      

      MqlRates rates[];

      ArraySetAsSeries(rates,true); 

      CopyRates(symbol,0,0,5,rates); //获取最近的5根K线

      double         usl=NormalizeDouble(UpperBuffer[1],digits);

      double         lsl=NormalizeDouble(LowerBuffer[1],digits);//获取最近一根K线对应布林带的上轨和下轨值

 

你用不恰当的方式使用布林线获得了数据,不代表用在其他指标上不出问题。

一般来说,2个要点:

1.指标句柄应该在OnInit创建。

2.调用CopyBuffer时应该检查拷贝到的数据个数。

照这么做,基本上不会有问题。

 
jianqing30:
有人吗?

MQL5引用指标值确实比MQL4麻烦。

引用指标句柄必须在OnInit()创建,并通过全局变量传递。

 int  AMA;

OnInit()

{

………………

 AMA=iAMA(…………;

}

void OnTick()
 {

double ama[];

double ama1,ama2,ama3 ………………

ArraySetAsSeries(ama,true);

CopyBuffer(AMA,0,0,20,ama);     //取数不能过小,否则数据传递有可能出错,特别是像AMA自适应均线这种特殊算法的指标。

ama1=ama[1];
ama2=ama[2];
ama3=ama[3];

……………………

}

 
Nianfu Li:

MQL5引用指标值确实比MQL4麻烦。

引用指标句柄必须在OnInit()创建,并通过全局变量传递。

 int  AMA;

OnInit()

{

………………

 AMA=iAMA(…………;

}

void OnTick()
 {

double ama[];

double ama1,ama2,ama3 ………………

ArraySetAsSeries(ama,true);

CopyBuffer(AMA,0,0,20,ama);     //取数不能过小,否则数据传递有可能出错,特别是像AMA自适应均线这种特殊算法的指标。

ama1=ama[1];
ama2=ama[2];
ama3=ama[3];

……………………

}

回复:

这是我的结构

int                        handle_iama;

datetime                   oldtime;

datetime                   opentime;

double                     AmaBuffer[];


//以上为全局变量

//以下定义开仓函数

void CheckForOpen()

{

   ArraySetAsSeries(AmaBuffer,true);

      CopyBuffer(handle_iama,0,0,26,AmaBuffer);//

      PrintFormat("当前AMA[1]的值是%d,当前AMA[2]的值是%d",AmaBuffer[1],AmaBuffer[2]);


int OnInit()

  {

//---

//---获取指标句柄

      handle_iama=iAMA(symbol,timeframe,ama_period,fast_ma_period,slow_ma_period,0,appliedPrice);//添加ama指标

      handle_iBands=iBands(symbol,timeframe,iBands_Period,0,BB_dev,appliedPrice);//添加布林带指标

     

   if(handle_iBands==INVALID_HANDLE && handle_iama==INVALID_HANDLE )

      return(INIT_FAILED);

   else

    printf("初始化成功");

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---

   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//---

   CheckForOpen();

   ModifyStopLoss();

   CheckForClose();

  }


 
jianqing30:

部分地方忽略了括号,输出还是以下内容:

2021.03.26 19:38:31.835 Core 1 2021.03.23 22:54:49   当前AMA[1]的值是1247448995,当前AMA[2]的值是-970949503


 
jianqing30:

部分地方忽略了括号,输出还是以下内容:

2021.03.26 19:38:31.835 Core 1 2021.03.23 22:54:49   当前AMA[1]的值是1247448995,当前AMA[2]的值是-970949503


try this...

input int ama_period=9;
input int fast_ma_period=2;
input int slow_ma_period=30;
input ENUM_APPLIED_PRICE appliedPrice=PRICE_CLOSE;

int amaHandle=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   amaHandle=iAMA(Symbol(),Period(),ama_period,fast_ma_period,slow_ma_period,0,appliedPrice);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(amaHandle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int indC=5;
   double amaBuf[];
   ArraySetAsSeries(amaBuf,true);
   ArrayResize(amaBuf,indC);
   CopyBuffer(amaHandle,0,0,indC,amaBuf);
   Print("bar1: ",amaBuf[1]," bar2: ",amaBuf[2]);
   //example output 
   //bar1: 1.17912625413231 bar2: 1.179040216251522
  }
 
Tsungche Kuo:

try this...

谢谢,用你这个方法,确实可以获得正常的值
 
Tsungche Kuo:

try this...

获取的值不对,请看这个帖子 https://www.mql5.com/zh/forum/365998
添加的AMA值与图表值不一致
添加的AMA值与图表值不一致
  • 2021.03.29
  • www.mql5.com
问题:我在EA里添加AMA指标时,相同参数的情况下,EA里的AMA值与图表里添加的AMA指标值不一致 EA源码: input int ama_period=9; input int fast_ma_period=2; input int slow_ma_period=26; input ENU...
原因: