Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithmic trading 在MQL4中,如何将两个移动平均值之间的差值绘制为H1时间帧上的直方图?_Algorithmic Trading_Mql4_Metatrader4 - Fatal编程技术网

Algorithmic trading 在MQL4中,如何将两个移动平均值之间的差值绘制为H1时间帧上的直方图?

Algorithmic trading 在MQL4中,如何将两个移动平均值之间的差值绘制为H1时间帧上的直方图?,algorithmic-trading,mql4,metatrader4,Algorithmic Trading,Mql4,Metatrader4,这是我尝试将两个移动平均线之间的差异绘制为H1时间范围上的直方图。问题是,当我改变一个时间框架时,它并没有改变,尤其是对于较低的时间框架。我是MQL4的初学者,没有任何经验或编程背景,请向我解释错误 #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Gray #property indicator_width1 2 extern int maperiod1

这是我尝试将两个移动平均线之间的差异绘制为H1时间范围上的直方图。问题是,当我改变一个时间框架时,它并没有改变,尤其是对于较低的时间框架。我是MQL4的初学者,没有任何经验或编程背景,请向我解释错误

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  Gray
#property indicator_width1  2

extern int maperiod1 = 25;
extern int maperiod2 = 55;
extern int timefr    = 60;

double mainbuffer[];

int init(){
    SetIndexBuffer( 0, mainbuffer );
    SetIndexStyle(  0, DRAW_HISTOGRAM );
    return(0);
}

int start(){
    int  counted_bars = IndicatorCounted();

    if ( counted_bars < 0) return(-1);
    if ( counted_bars > 0) return( 0);

    int  limit        = ( Bars - counted_bars );

    for ( int    i     = limit; i >= 0; i-- ){
          int    shift = iBarShift( NULL, timefr, Time[i] );
          double maB   = iMA(       NULL, timefr, maperiod1, 0, MODE_EMA, 0, shift );
          double maR   = iMA(       NULL, timefr, maperiod2, 0, MODE_EMA, 0, shift );
          mainbuffer[shift]= ( maB - maR );
    }
    return(0);
}
#属性指示器_单独_窗口
#属性指示符\u缓冲区1
#属性指示器\u颜色1灰色
#属性指示器\u宽度1 2
外部内部映射周期1=25;
外部内部映射周期2=55;
外部时间=60;
双主缓冲区[];
int init(){
SetIndexBuffer(0,主缓冲区);
SetIndexStyle(0,绘制直方图);
返回(0);
}
int start(){
int counted_bar=指示器计数();
如果(计数的_条<0)返回(-1);
如果(计数条>0)返回(0);
int limit=(条-计数的_条);
对于(int i=limit;i>=0;i--){
int shift=iBarShift(NULL,timer,Time[i]);
双maB=iMA(空,时间,映射周期1,0,模式\ EMA,0,移位);
double maR=iMA(NULL,timer,maperiod2,0,MODE_EMA,0,shift);
主缓冲区[shift]=(maB-maR);
}
返回(0);
}

在您的代码中,您计算的是H1时间段的MA,这就是为什么在较小的时间段上发生的事情没有区别-它只检查H1

if(计数条>0)返回(0)

-据我所知,如果计数的条数为正,则需要将其减少1,以便重新计算以前已知的条:
if(counted_bars>0)counted_bars--

在您的代码中,您计算的是H1时间段的MA,这就是为什么在较小的时间段上发生的事情没有区别-它只检查H1

if(计数条>0)返回(0)
-据我所知,如果计数的条数为正,则需要将其减少1,以便重新计算以前已知的条:
if(counted_bars>0)counted_bars--

除了对任何时间段选择的“豁免”之外,代码不提供与时间同步更新的方法 正如Daniel在上文中已经指出的,与预先选择的时间框架(技术上应该设计为一些枚举)的“刚性”硬编码关系:

enum ENUM_GUI_SELECT_TFRAME {
                              M1 = PERIOD_M1,
                              M5 = PERIOD_M5,
                              ...
                              ..
                              .
                              H1 = PERIOD_H1,
                              H4 = PERIOD_H4,
                              ...
                              ..
                              .
                              MN = PERIOD_MN
     };
  //   ++++------------------------------------------ MAKES SURE,
  //   ||||                                           ALWAYS ONLY
  //   ||||                                           PROPER VALUES GET
  //   vvvv                                           EVER SELECTED
extern ENUM_GUI_SELECT_TFRAME timefr = PERIOD_H1;
)代码激活/执行障碍还有一些需要解决的问题

是什么阻止了代码的正确更新? 这一系列条件:

if ( counted_bars < 0) return(-1);
if ( counted_bars > 0) return( 0);
if(计数条<0)返回(-1);
如果(计数条>0)返回(0);
当且仅当
指示符counted()==0
时,才满足

IndicatorCounted()
~该函数返回上次启动指示器后未更改的条数

因此,自定义指示符在第一次调用中起着魔鬼般的作用,在第一次调用中,自上次调用(不存在)以来,所有的条都已“更改”。在此之后,直到新创建的条形图出现之前,都会调用指示器,因为
IndicatorCounted()==0
,但尚未出现新条形图,这将使
IndicatorCounted()成为==1
并且自定义指示器的其余代码将不会执行——这似乎是非常镜像的逻辑,自定义指示器配备的目的是在没有创建新条时避免非生产性循环,而是在新条启动时立即更新

换句话说,即使在
指示器计数()==0
的情况下,最后一个(热)值
[0]
仍然会发生变化,因此,当且仅当自定义指示器值以某种方式依赖于
关闭[0]
的实际(仍在变化)活动值时,更新
mainbuffer[]
[0]
单元格是合理的

如果它不依赖于
关闭[0]
,则运行代码没有意义,因为它不会更新任何内容。

除了对任何时间段选择的“豁免”之外,
代码不提供与时间[]同步的方法 正如Daniel在上文中已经指出的,与预先选择的时间框架(技术上应该设计为一些枚举)的“刚性”硬编码关系:

enum ENUM_GUI_SELECT_TFRAME {
                              M1 = PERIOD_M1,
                              M5 = PERIOD_M5,
                              ...
                              ..
                              .
                              H1 = PERIOD_H1,
                              H4 = PERIOD_H4,
                              ...
                              ..
                              .
                              MN = PERIOD_MN
     };
  //   ++++------------------------------------------ MAKES SURE,
  //   ||||                                           ALWAYS ONLY
  //   ||||                                           PROPER VALUES GET
  //   vvvv                                           EVER SELECTED
extern ENUM_GUI_SELECT_TFRAME timefr = PERIOD_H1;
)代码激活/执行障碍还有一些需要解决的问题

是什么阻止了代码的正确更新? 这一系列条件:

if ( counted_bars < 0) return(-1);
if ( counted_bars > 0) return( 0);
if(计数条<0)返回(-1);
如果(计数条>0)返回(0);
当且仅当
指示符counted()==0
时,才满足

IndicatorCounted()
~该函数返回上次启动指示器后未更改的条数

因此,自定义指示符在第一次调用中起着魔鬼般的作用,在第一次调用中,自上次调用(不存在)以来,所有的条都已“更改”。在此之后,直到新创建的条形图出现之前,都会调用指示器,因为
IndicatorCounted()==0
,但尚未出现新条形图,这将使
IndicatorCounted()成为==1
并且自定义指示器的其余代码将不会执行——这似乎是非常镜像的逻辑,自定义指示器配备的目的是在没有创建新条时避免非生产性循环,而是在新条启动时立即更新

换句话说,即使在
指示器计数()==0
的情况下,最后一个(热)值
[0]
仍可能发生变化,因此,如果且仅当自定义指示器值以某种方式依赖于的实际(仍在变化)活动值时<