任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 545

 
GSB:

采取什么方式?你可以用完全不同的参数来调用同一个指标



如果在指标本身
extern int       periodAMA=10;
在EA中
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

指标代码如何识别传输的参数和它们的名称是不同的?

但一切都如你所说。我又用脚本检查了一下)

 
Forexman77:
如果在专家顾问的指标本身中

指标代码如何识别传输的参数和名称的不同?

但一切都如你所说。又用脚本检查了一下)


调用程序中的变量可以随意命名,其名称与指标中的变量名称没有关系,它们是不同的变量,而且是从不同的终端线程中调用。

该指标根据其名称被调用,在每次调用时,从第4位开始为其传递参数,然后是iCustom()参数。

如果声明了变量 per1=9;,并且iCustom()在位置4上,那么指标将以9为周期进行计算,如果你设置了另一个变量,其值将在计算过程中使用。将被传递的变量(其引用)作为指标的第一个参数--在第二个参数的第四位iCustom(),以此类推。



 
GSB:

调用程序中的变量可以随意命名,其名称与指标中的变量名称没有关系,它们是不同的变量,而且是从不同的终端线程中调用。

该指标通过其名称被调用,参数在每次调用时从第4位传给它,然后是iCustom()参数。

如果声明了变量per1=9,并且iCustom()的位置是4,那么指标将以9为周期进行计算;如果你设置了另一个变量,它的值将在计算过程中使用,这适用于指标的所有参数,主要是按正确的顺序设置,就像在指标本身一样。将被传递的变量(其引用)作为指标的第一个参数--第二个指标的第四个iCustom(),以此类推。



我知道了。在教科书中,它似乎被称为转移引用的价值。
 

我想我不应该在论坛上乱扔垃圾,而应该有一个单独的主题,但我真的希望对我的问题有一个建设性的反馈,没有它我就无法继续前进:(。
我试着写了各种指标,一切似乎都很好,现在我用iCustom()函数把所有东西都导入到我的EA。专家顾问中的代码。

double ma=iCustom(NULL,0,"TestMA",0,1);

指标本身(我为测试而写)。

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    int counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

接下来,测试时EMPTY_VALUE 的事情。

也就是说,当我们开始测试时,我们有EA的开始日期,在该日期之前的一切iCustom都会给出正确的指标值,之后的一切都会直接测试 - EMPTY_VALUE。:(
我已经厌倦了谷歌和论坛,他们写到 "不要展望未来",但我在代码中没有看到这一点。我哪里是傻瓜?)

 
Semionn:

我想我不应该在论坛上乱扔垃圾,而应该有一个单独的主题,但我真的希望对我的问题有一个建设性的反馈,没有它我就无法前进:(。
我试着写了各种指标,一切似乎都很好,现在我用iCustom()函数把所有东西都导入到我的EA。专家顾问中的代码。

指标本身(我为测试而写)。

接下来,测试时EMPTY_VALUE的事情。

也就是说,当我们开始测试时,我们有EA的开始日期,在该日期之前的一切iCustom都会给出正确的指标值,之后的一切都会直接测试 - EMPTY_VALUE。:(
我已经厌倦了谷歌和论坛,他们写到 "不要展望未来",但我在代码中没有看到这一点。我哪里是傻瓜?)

错误似乎是在专家顾问的代码中,你为什么不使用调试器?设置检查点,查看变量值,并查看指标是否被调用,你的日期前后有什么变化
 
GSB:
错误似乎是在专家顾问的代码中,你为什么不使用调试器?设置检查点,查看变量值,并查看指标是否被调用,在你的日期前后是什么。

调试器只能在模拟账户模式下使用,不能在测试中使用,除了我写的--指标被调用,工作并返回数值,甚至是正确的,但只有在指定的日期(测试的开始日期)之前。我在EA中输出变量的值,这就是为什么我说一开始一切正常,然后EMPTY_VALUE
 
Semionn:

调试器只能在模拟账户模式下使用,不能在测试中使用,除了我写的--指标被调用,工作并返回数值,甚至是正确的,但只到指定日期(测试开始日期)。我在EA中输出变量的值,这就是为什么我说一开始一切正常,然后EMPTY_VALUE


你有没有仔细阅读过如何在自定义指标 中跟踪新条形?

[QUOTE]第一个 rates_total 参数包含指标可用于计算的条数,并与图表中的可用条数相对应。

注意OnCalculate()返回的值和第二个输入参数prev_calculated之间的联系。函数调用中的prev_calculated参数包含了上一次调用时OnCalculate()返回的值。这允许在计算自定义指标时采用经济的算法,以避免对那些自上次调用此函数以来没有变化的条形图进行重复计算。

为此,通常只需返回rate_total参数的值即可,该参数包含当前函数调用中的条数。如果自从上次调用OnCalculate()后,价格数据发生了变化(更深的历史被抽出或历史空白被填补),那么输入参数prev_calculated的值将被终端设置为零。[/QUOTE]

 

你需要找到20天内一天的平均数,然后再找到5天内20天的平均数。

找到20天平均线并不是问题。但 不知道如何从这个平均值中 得到五天 的平均值。

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

你需要找到20天内一天的平均数,然后再找到5天内20天的平均数。

找到20天平均线并不是问题。但 不知道如何从这个平均值中 得到五天 的平均值。



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

帮助

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

计时器不工作,返回犯规和错误4051

还是说它在测试器中不应该工作?