两点:
1.指标句柄应该在OnInit创建。
2.调用CopyBuffer时应该检查拷贝到的数据个数。
两点:
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时应该检查拷贝到的数据个数。
照这么做,基本上不会有问题。
有人吗?
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];
……………………
}
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();
}
部分地方忽略了括号,输出还是以下内容:
2021.03.26 19:38:31.835 Core 1 2021.03.23 22:54:49 当前AMA[1]的值是1247448995,当前AMA[2]的值是-970949503
部分地方忽略了括号,输出还是以下内容:
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 }
try this...
try this...

- 2021.03.29
- www.mql5.com
各位,我用下面这种写法时,没有办法获取到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