Mql4 EA创建自定义指示器的多个实例

Mql4 EA创建自定义指示器的多个实例,mql4,Mql4,当我使用自定义指示器时,它显示如下图形: 当我将专家顾问与自定义指示器一起使用时,它显示以下内容: 当我做回溯测试时,它还重复打开了很多自定义指示器 我应该如何更改EA以使 它只打开了一个自定义指示器 它绘制与自定义指示器相同的图形 下面是自定义指示器的代码(HitbolingerBand1.mq4) MQL4代码的EA类型不影响,所有CustomIndicator-s类型的MQL4-在GUI上绘制代码 也就是说,您可以使用iCustom()从EA端“读取”任何CustomIndicato

当我使用自定义指示器时,它显示如下图形:

当我将专家顾问与自定义指示器一起使用时,它显示以下内容:

当我做回溯测试时,它还重复打开了很多自定义指示器

我应该如何更改EA以使

  • 它只打开了一个自定义指示器

  • 它绘制与自定义指示器相同的图形

  • 下面是自定义指示器的代码(
    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);
      }