在创建EA时遇到有线移动平均线问题。
我做错了什么?
这里有一张负责移动平均线的部分代码的截图。我把所有的变量都换成了数值,所以你可以看到设置。另一张截图显示了在图表上绘制MA和MA指标的区别(或者说所有4种类型)。
浅蓝色实际上是平滑的,与测试器中生成的MA相差甚远。
与生成的MA最接近的是 "简单",但它并不匹配。
这到底是怎么回事呢?
你得到的是什么值?我在哪里都没有看到。
比较一下这两个窗口。左边的一个是策略测试器生成的MA,它正好在交易之间。右边有所有类型的MA370(SMA、EMA、SSMA和LWMA),但没有一个与左边的MA370相匹配。SSMA是浅蓝色的,与回测中生成的MA相差甚远。
附上另一张屏幕照片,其中添加了当前 "MA "变量值的调试警报线(在日志中显示最后的MA值,右边是图表上 "抛出 "的浅蓝色平滑370MA的最后值)
我注意到图表上的MA指的是收盘价,而代码中的MA指的是开盘价,但是当我改变图表上的移动平均线时,它们在视觉上没有任何明显的变化。它们看起来仍然与所附的屏幕照片上的一样。
我把这个问题隔离到一个单独的EA。
#property copyright "Grzegorz Korycki" #property version "1.0" #property description "MA TEST" #include <Trade/Trade.mqh> #define MAGICMA 20131002 double Bid; double Ask; double OnTester() { double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT); return (custommax); } CTrade trade; void OnTick() { MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) { Bid = last_tick.bid; Ask = last_tick.ask; } start(); } int OnInit() { trade.SetExpertMagicNumber(MAGICMA); int deviation=99; trade.SetDeviationInPoints(deviation); trade.SetAsyncMode(false); return(0); } void trend1() { int ma_temp; double ma_buffer[20]; double ma; ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN); CopyBuffer(ma_temp,0,0,1,ma_buffer); ma=ma_buffer[0]; Alert("ma=", ma); } void start() { trend1(); }测试对是英镑/新西兰元。
这个问题越来越奇怪了。当我在2012年测试上述EA时,它给出的MA结果(在日志中你可以看到实际值)与我在2013年测试它时略有不同。它们都不接近图表上的370个SSMA。
也许是我的初始化有问题,导致EA出现这种情况?
包括屏幕截图。注意,在比较两张屏幕截图时,所画的线 处于不同的水平,而这是同一个EA。
当我添加它时,我得到。
cannot be used for static allocated array ma_test.mq5 50 4
但我只用了这个数组中的一帧,这重要吗?为什么会有这样的警告?
添加这一行后,没有任何变化(警告和回测都表明添加这一行没有任何效果)。
文档中说,它应该只用于常量。
[...] const datetime &time[], [...] ArraySetAsSeries(time,true);
而我的ma_buffer是一个变量数组。
double ma_buffer[20];
当我添加它时,我得到。
但我只用了这个数组中的一帧,这重要吗?为什么会出现警告?
在添加这一行后,没有任何变化(警告和回测都表明添加这一行没有任何影响)。
如果你只复制了一帧,你是对的,这不是根本原因(你对ma_buffer[20]的声明转移了我对这个事实的注意)。
但是我建议你把下面一行移到Init(),把句柄移到全局,因为这确实是问题的根源(做完后请再次测试)。
ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
如果你只复制了一帧,你是对的,这不是根本原因(你对ma_buffer[20]的声明转移了我对这个事实的注意)。
但是我建议你把下面的行移到Init(),把句柄移到全局,因为这确实是问题的根源(做完后请再次测试)。
我已经根据你的指导修改了脚本,但问题仍然存在:(
现在看起来是这样的。
#property copyright "Grzegorz Korycki" #property version "1.0" #property description "MA TEST" #include <Trade/Trade.mqh> #define MAGICMA 20131002 double Bid; double Ask; int ma_temp; double ma_buffer[20]; double OnTester() { double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT); return (custommax); } CTrade trade; void OnTick() { MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) { Bid = last_tick.bid; Ask = last_tick.ask; } start(); } int OnInit() { trade.SetExpertMagicNumber(MAGICMA); int deviation=99; trade.SetDeviationInPoints(deviation); trade.SetAsyncMode(false); ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN); return(0); } void trend1() { double ma; CopyBuffer(ma_temp,0,0,1,ma_buffer); ma=ma_buffer[0]; Alert("ma=", ma); } void start() { trend1(); }
也许有人可以创建EA草案,他将如何创建这样的MA值生成器,我可以比较两者--测试它并隔离错误。(如果有人有几分钟的时间)
我马上就会检查 并回复,如果这个问题在其他货币对上是一样的,还是只有这一个货币对,因为这非常奇怪。
我做错了什么?
这里有一张负责移动平均线 的部分代码的截图。我把所有的变量都换成了数值,所以你可以看到设置。另一张截图显示了在图表上绘制MA和MA指标的区别(或者说所有4种类型)。
浅蓝色实际上是平滑的,与测试器中生成的MA相差甚远。
与生成的MA最接近的是 "简单",但它并不匹配。
这到底是怎么回事?