EA加载到图表运行没问题,但是测试时却不断加载自定义指标。

 

自编了一个EA,运行起来没有问题,EA中有调用自定义指标。

但是策略测试时 却不断加载自定义指标。

附加的文件:
 

您好。

在讨论时请使用源码。

另外提醒您, 讨论代码时请使用代码表述功能。


【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能

https://www.mql5.com/zh/forum/448896

【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
  • 2023.06.13
  • Sky All
  • www.mql5.com
大家好,我是官网版主。 官网内部有机器人辅助管理,目的是自动下架一些有误导性的内容。 内容过长,或同一个IP多次注册,容易导致机器人误判,而被无辜删帖。 如果您被无故删帖,我们对这种体验感到万分抱歉。 为了防止机器人误判,请在讨论代码的时候使用代码表述功能...
 
Sky All #:

您好。

在讨论时请使用源码。

另外提醒您, 讨论代码时请使用代码表述功能。


【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能

https://www.mql5.com/zh/forum/448896


 你好版主,编程遇到问题了,求助

我编写了一个ea,加载到图表运行没有问题,但是在历史回测的时候总是不断的弹出附图指标窗口。指标是自定义指标,若换成系统自带指标则不会重复弹出附图窗口。仅仅自定义的时候会,这是为什么呢?

下边是源码


#property copyright "Copyright 2024, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

//+------------------------------------------------------------------+

input double  gammacs= 0.9; 

input ENUM_TIMEFRAMES   周期=PERIOD_M30;

input int      跟踪止损点数=500;

input double   手数=0.01;

input int      组号=69425;

//+------------------------------------------------------------------+

int kkk=0;

int ddd=0;

//+------------------------------------------------------------------+

int OnInit()

  {

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

  }

//+------------------------------------------------------------------+

void OnTick()

  {

   int bars=Bars(_Symbol,周期);

   int dds=ccdds(_Symbol,组号);

   int kds=cckds(_Symbol,组号);

   double laguesz[];

  

   laguezb(laguesz,4,_Symbol,周期,gammacs,150);


     if(dds==0 && ddd!=bars)

     if(laguesz[0]>0.5 && laguesz[1]<0.5)

       {

        kaidan(_Symbol,0,手数,0,跟踪止损点数,组号);

        ddd=bars;

       }

   if(kds==0 && kkk!=bars)

     if(laguesz[0]<0.5 && laguesz[1]>0.5)

       {

        kaidan(_Symbol,1,手数,0,跟踪止损点数,组号);

        kkk=bars;

       }

   if(dds+kds>0)

     {

      gzzs(_Symbol,组号,跟踪止损点数);

     }

  }

//+------------------------------------------------------------------+


int laguezb(double &lagus[],int 数量,string symbol,ENUM_TIMEFRAMES 图表周期,double  gammacs1,int CountBarscs1)

      {

         int h=iCustom(symbol,图表周期,"lague",gammacs1,CountBarscs1);

         ArraySetAsSeries(lagus,true);

         int a;

         a=CopyBuffer(h,0,0,数量,lagus);

         //IndicatorRelease(h);

         return(a);

      }


void kaidan(string 货币兑1,bool 开单方向,double 手数1,double 止盈,double 止损,int 组号1)//开单函数内设开单方向0--多1--空

     {

      MqlTradeRequest a= {};

      MqlTradeResult b= {};

      ZeroMemory(a);

      ZeroMemory(b);

      a.action=TRADE_ACTION_DEAL;

      a.magic=组号1;

      a.symbol=货币兑1;

      a.volume=手数1;

      if(止盈!=0)

        {

        a.tp=止盈;

        }

      if(止损!=0)

        {

        a.sl=止损;

        }

      a.deviation=100;

      a.type_filling=ORDER_FILLING_FOK;

      if(开单方向==0)

        {

         a.type=ORDER_TYPE_BUY;

         a.price=SymbolInfoDouble(货币兑1,SYMBOL_ASK);

        }

      if(开单方向==1)

        {

         a.type=ORDER_TYPE_SELL;

         a.price=SymbolInfoDouble(货币兑1,SYMBOL_BID);

        }

      if(!OrderSend(a,b))

         PrintFormat("OrderSend error %d",GetLastError());   // 如果不能发送请求,输出错误

     }


//+------------------------------------------------------------------+

void gzzs(string symbol1,int 组号1,int 跟踪止损点数1)  //跟踪止损点数(以点数止损)

     {

      double ask=SymbolInfoDouble(symbol1,SYMBOL_ASK);

      double bid=SymbolInfoDouble(symbol1,SYMBOL_BID);

      int t=PositionsTotal();

      for(int i=t-1; i>=0; i--)

        {

         ulong ccbh=PositionGetTicket(i);

         if(PositionGetInteger(POSITION_MAGIC)==组号1&& PositionGetString(POSITION_SYMBOL)==symbol1)

           {

            double price=0;

            double sl=PositionGetDouble(POSITION_SL);

            long   typ=PositionGetInteger(POSITION_TYPE);

            double kop=PositionGetDouble(POSITION_PRICE_OPEN);

            double zzc=跟踪止损点数1*Point();

            if(sl!=0)

              {

               if(typ==POSITION_TYPE_SELL && (bid+zzc)<sl && kop>bid)

                 {

                  price=bid+zzc;

                 };

               if(typ==POSITION_TYPE_BUY && (ask-zzc)>sl && kop<ask)

                 {

                  price=ask-zzc;

                 }

              }

            else

              {

               if(typ==POSITION_TYPE_BUY)

                 {

                  price=kop-zzc;

                 };

               if(typ==POSITION_TYPE_SELL)

                 {

                  price=kop+zzc;

                 }

              };

            if(price!=0)

              {

               MqlTradeRequest a= {};

               MqlTradeResult  b= {};

               ZeroMemory(a);

               ZeroMemory(b);  

               a.action=TRADE_ACTION_SLTP;                                 // 交易操作类型

               a.symbol=PositionGetString(POSITION_SYMBOL);                // 交易品种

               a.position =ccbh;

               a.symbol=symbol1;

               a.sl=price;

               a.magic=组号1;

               if(!OrderSend(a,b))

                  PrintFormat("OrderSend error %d",GetLastError());        // 如果不能发送请求,输出错误   

              }

           }

        }

     };

//+------------------------------------------------------------------+


int  ccdds(string symbol1,int 组号1)//总持仓多单数量

     {

      int zongdanshu=0;

      int t=PositionsTotal();

      for(int i=t-1; i>=0; i--)

         {

          ulong ccbh=PositionGetTicket(i);

          if(PositionGetInteger(POSITION_MAGIC)==组号1 && PositionGetString(POSITION_SYMBOL)==symbol1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)

            {

             zongdanshu++;

            }

         }

      return(zongdanshu);

     }


int  cckds(string symbol1,int 组号1)//总持仓空单数量

     {

      int zongdanshu=0;

      int t=PositionsTotal();

      for(int i=t-1; i>=0; i--)

         {

          ulong ccbh=PositionGetTicket(i);

          if(PositionGetInteger(POSITION_MAGIC)==组号1 && PositionGetString(POSITION_SYMBOL)==symbol1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)

            {

             zongdanshu++;

            }

         }

      return(zongdanshu);

     }


double  getclose(string 品种,ENUM_TIMEFRAMES 周期1,int 第几根)                       //获得 close

        {

         return(iClose(品种,周期1,第几根));

        }

   

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2024.04.23
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

把自訂義指標宣告修改放在init宣告一次就可以了

你的宣告放在自訂義函數裡面 一直重複宣告調用 所以會重複加載

 
Hung Wen Lin #:

把自訂義指標宣告修改放在init宣告一次就可以了

你的宣告放在自訂義函數裡面 一直重複宣告調用 所以會重複加載

哥们,你好!见到有人能够回复我,真是太高兴了,能不能麻烦你帮我修改下,我是初学的编程技术。拜托!
原因: