Algorithmic trading 在MQL4中,如何将两个移动平均值之间的差值绘制为H1时间帧上的直方图?
这是我尝试将两个移动平均线之间的差异绘制为H1时间范围上的直方图。问题是,当我改变一个时间框架时,它并没有改变,尤其是对于较低的时间框架。我是MQL4的初学者,没有任何经验或编程背景,请向我解释错误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
#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]
仍可能发生变化,因此,如果且仅当自定义指示器值以某种方式依赖于的实际(仍在变化)活动值时<