在创建EA时遇到有线移动平均线问题。

 

我做错了什么?

这里有一张负责移动平均线 的部分代码的截图。我把所有的变量都换成了数值,所以你可以看到设置。另一张截图显示了在图表上绘制MA和MA指标的区别(或者说所有4种类型)。

浅蓝色实际上是平滑的,与测试器中生成的MA相差甚远。
与生成的MA最接近的是 "简单",但它并不匹配。

这到底是怎么回事?

附加的文件:
ma_problem1.png  154 kb
ma_problem2.png  80 kb
 
angreeee:

我做错了什么?

这里有一张负责移动平均线的部分代码的截图。我把所有的变量都换成了数值,所以你可以看到设置。另一张截图显示了在图表上绘制MA和MA指标的区别(或者说所有4种类型)。

浅蓝色实际上是平滑的,与测试器中生成的MA相差甚远。
与生成的MA最接近的是 "简单",但它并不匹配。

这到底是怎么回事呢?

你得到的是什么值?我到处都看不到。
 
angevoyageur:
你得到的是什么值?我在哪里都没有看到。

比较一下这两个窗口。左边的一个是策略测试器生成的MA,它正好在交易之间。右边有所有类型的MA370(SMA、EMA、SSMA和LWMA),但没有一个与左边的MA370相匹配。SSMA是浅蓝色的,与回测中生成的MA相差甚远。

附上另一张屏幕照片,其中添加了当前 "MA "变量值的调试警报线(在日志中显示最后的MA值,右边是图表上 "抛出 "的浅蓝色平滑370MA的最后值)

我注意到图表上的MA指的是收盘价,而代码中的MA指的是开盘价,但是当我改变图表上的移动平均线时,它们在视觉上没有任何明显的变化。它们看起来仍然与所附的屏幕照片上的一样。

附加的文件:
ma_problem3.png  142 kb
 
不是EA不工作,它工作得很好,但当我调试它时,我注意到生成的MA与它应该有的完全不同。我知道我做错了什么,但我仍然不知道是什么。我附上另一张浅蓝色平滑化EA的设置截图,这样你就有了完整的图片。
附加的文件:
ma_problem4.png  66 kb
 
我发现最相似的MA是平滑MA220,截图附后。这没有任何意义,:(但也许它是某种线索。
附加的文件:
ma_problem5.png  57 kb
 

我把这个问题隔离到一个单独的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();
}

测试对是英镑/新西兰元。
附加的文件:
ma_test.mq5  2 kb
 

这个问题越来越奇怪了。当我在2012年测试上述EA时,它给出的MA结果(在日志中你可以看到实际值)与我在2013年测试它时略有不同。它们都不接近图表上的370个SSMA。

也许是我的初始化有问题,导致EA出现这种情况?

包括屏幕截图。注意,在比较两张屏幕截图时,所画的线 处于不同的水平,而这是同一个EA。

附加的文件:
 

看起来是一个基本的错误:元素没有像时间序列中那样被索引(相反的顺序)。

要解决这个问题,你需要调用这个函数...

ArraySetAsSeries(ma_buffer,true);
 
figurelli:

看起来是一个基本的错误:元素没有像时间序列中那样被索引(相反的顺序)。

要解决这个问题,你需要调用这个函数...

当我添加它时,我得到。

cannot be used for static allocated array       ma_test.mq5     50      4

但我只用了这个数组中的一帧,这重要吗?为什么会有这样的警告?

添加这一行后,没有任何变化(警告和回测都表明添加这一行没有任何效果)。

文档中说,它应该只用于常量。

[...]

const datetime &time[],

[...]

ArraySetAsSeries(time,true); 

而我的ma_buffer是一个变量数组。

 double ma_buffer[20];
 
angreeee:

当我添加它时,我得到。

但我只用了这个数组中的一帧,这重要吗?为什么会出现警告?

在添加这一行后,没有任何变化(警告和回测都表明添加这一行没有任何影响)。

如果你只复制了一帧,你是对的,这不是根本原因(你对ma_buffer[20]的声明转移了我对这个事实的注意)。

但是我建议你把下面一行移到Init(),把句柄移到全局,因为这确实是问题的根源(做完后请再次测试)。

ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
 
figurelli:

如果你只复制了一帧,你是对的,这不是根本原因(你对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值生成器,我可以比较两者--测试它并隔离错误。(如果有人有几分钟的时间)

我马上就会检查 并回复,如果这个问题在其他货币对上是一样的,还是只有这一个货币对,因为这非常奇怪。