Mql4 EA创建自定义指示器的多个实例
当我使用自定义指示器时,它显示如下图形: 当我将专家顾问与自定义指示器一起使用时,它显示以下内容: 当我做回溯测试时,它还重复打开了很多自定义指示器 我应该如何更改EA以使Mql4 EA创建自定义指示器的多个实例,mql4,Mql4,当我使用自定义指示器时,它显示如下图形: 当我将专家顾问与自定义指示器一起使用时,它显示以下内容: 当我做回溯测试时,它还重复打开了很多自定义指示器 我应该如何更改EA以使 它只打开了一个自定义指示器 它绘制与自定义指示器相同的图形 下面是自定义指示器的代码(HitbolingerBand1.mq4) MQL4代码的EA类型不影响,所有CustomIndicator-s类型的MQL4-在GUI上绘制代码 也就是说,您可以使用iCustom()从EA端“读取”任何CustomIndicato
HitbolingerBand1.mq4
)
MQL4代码的EA类型不影响,
所有
CustomIndicator
-s类型的MQL4
-在GUI上绘制代码
也就是说,您可以使用iCustom()从EA端“读取”任何CustomIndicator缓冲区中的任何值。但这并不意味着GUI窗口上有任何线条
如果计划查看
在
自定义指示器中编程的所有行
,
-类型的MQL4
-代码
然后必须将自定义指示器“放置”到“GUI”窗口。手动或编程(使用启动时“概要文件”定义)
Q2:我应该如何更改EA,使其绘制与自定义指示器相同的图形
A2:在这种需要的情况下,我们将整个CustomIndicator
逻辑转换为EA,以便EA在自己的控制下执行所有GUI操作,而不依赖于图形的手动GUI设置。MQL4代码的EA类型
不会影响,
所有CustomIndicator
-s类型的MQL4
-code在GUI上绘制了什么
也就是说,您可以使用iCustom()从EA端“读取”任何CustomIndicator缓冲区中的任何值。但这并不意味着GUI窗口上有任何线条
如果计划查看
在自定义指示器中编程的所有行
,
-类型的MQL4
-代码
然后必须将自定义指示器“放置”到“GUI”窗口。手动或编程(使用启动时“概要文件”定义)
Q2:我应该如何更改EA,使其绘制与自定义指示器相同的图形
A2:在这种情况下,我们将整个CustomIndicator
逻辑转换为EA,以便EA在自己的控制下完成所有GUI操作,而不依赖于图形的手动GUI设置。谢谢,如何确保每次调用EA中的start()后,它只打开一个indicator实例,而不是打开大量indicator实例?我只需要得到定制指示器的返回值,而不需要将代码重写为EA。打开EA不会“打开”任何可视的东西。自动CustomIndicator缓冲区管理的内部机制&OnCalculate()批处理驱动的块更新+热端的进一步实时临时更新(反向索引一如既往[0])在负责内部更新的公共(共享…(!!!)线程下启动。只要调用iCustom(…)方法从某些(引用的)CustomIndicator缓冲区获取一个单元格值,屏幕上就不会显示任何内容。所以,如果您对很多值感到满意,那么可以通过iCustom()将它们输入EA,而不会在图形上绘制任何内容。谢谢,我如何确保每次调用EA中的start()后,它只打开一个indicator实例,而不是打开大量的indicator实例?我只需要得到定制指示器的返回值,而不需要将代码重写为EA。打开EA不会“打开”任何可视的东西。自动CustomIndicator缓冲区管理的内部机制&OnCalculate()批处理驱动的块更新+热端的进一步实时临时更新(反向索引一如既往[0])在负责内部更新的公共(共享…(!!!)线程下启动。只要调用iCustom(…)方法从某些(引用的)CustomIndicator缓冲区获取一个单元格值,屏幕上就不会显示任何内容。所以,若您对许多值感到满意,那个么通过iCustom()将它们输入EA,就不会在图形上绘制任何内容。
#property indicator_chart_window
#property indicator_buffers 2
sinput string s_ = " Bolinger Bands "; // ind#1
input int InpBandsPeriod = 20; //period
input double InpBandsDeviation = 2.0; //deviation
double CrossedUp[];
double CrossedDown[];
int limit, x;
double POINT;
int init()
{
SetIndexStyle(0, DRAW_ARROW, 1, 2,clrRed);
SetIndexBuffer(0,CrossedUp);
SetIndexStyle(1, DRAW_ARROW, 1, 2,clrRed);
SetIndexBuffer(1,CrossedDown);
POINT=0.0001;
return(0);
}
int start()
{
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(int i=limit; i>=0; i--) {
isHitBollingerBand(i);
}
return(0);
}
void isHitBollingerBand(int candleIdx){
int dir[]={1,-1};
bool setUp=false;
bool setDown=false;
for (int j=0;j<ArraySize(dir);j++){
double bands = iBands(_Symbol,0,InpBandsPeriod,InpBandsDeviation,0,PRICE_CLOSE,dir[j]<0?MODE_LOWER:MODE_UPPER,candleIdx);
double _peak = dir[j]<0 ? iLow(_Symbol,0,candleIdx): iHigh(_Symbol,0,candleIdx);
if(dir[j] * (_peak-NormalizeDouble(bands,Digits) ) >= 0){
double result=_peak+ dir[j]*3*POINT;
if(dir[j]==1)
CrossedUp[candleIdx]=result;
else
CrossedDown[candleIdx]=result;
}
}
}
int init()
{
start();
return(0);
}
sinput string s_ = " Bolinger Bands "; // ind#1
input int InpBandsPeriod = 20; //period
input double InpBandsDeviation = 2.0; //deviation
int start()
{
double HitBollingerBandUp=iCustom(NULL, 0, "HitBollingerBand1", InpBandsPeriod,InpBandsDeviation,0,1);
double HitBollingerBandDown=iCustom(NULL, 0, "HitBollingerBand1", InpBandsPeriod,InpBandsDeviation,1,1);
if(HitBollingerBandUp!=EMPTY_VALUE){
printf("%i%s [%s]",__LINE__,__FUNCTION__,TimeToStr(Time[1],TIME_DATE|TIME_MINUTES));
}
return(0);
}