在MQL5中一起学习和写作 - 页 10

 

我不知道这是否是正确的问题。

有可能把调试和测试员结合起来吗?也就是说,如果我用F5启动,测试器当然不会启动。而如果我在测试器中启动exprrt,断点 就会被忽略。还是我做错了什么?

 
Lunatic:

我不知道这是否是正确的问题。

有可能把调试和测试人员结合起来吗?

目前没有。
 
alexvd:
目前没有。

那么,只有在演示中才是实时的?在有趣的情况下如何进行调试?

一开始我对调试器很兴奋,但我又滑向了调试打印输出。没有看到其他调试技术。- 令人沮丧的是。

 

以提供的专家顾问MovingAverage为例进行研究,它的一切都很美。关于测试器的问题。

这个EA只在第一个tick上分析蜡烛图。 我注意到有些情况没有处理就滑落了。事实证明,一个罕见的烛台是由第一个刻度线诞生的。这是一个连接效应,是我的故障还是测试人员的故障?

显然,为了只在出生时处理一个蜡烛,即一次,最后处理的蜡烛应该被存储在一个静态变量 中?

P/S/刚开始学习语言,因此有这么多乏味的问题。

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

你好,我正在写一个EA,看看我是否能及时赶到冠军赛。我写了一些简单的代码,它使用了2个自定义指标,但是这些指标的值是0,所以交易没有完成。

//+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

input int period =48;
input int period1 =30;
input int sl=200;
input double lot=0.1;
input long magicBUY1=102;
input int magicSELL1=202;
input string sim="eur";

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   hind1=iCustom("EURUSD",PERIOD_H1,"trend_v3_5",period);
   hind2=iCustom("EURUSD",PERIOD_H1,"trend_v3",4);



   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
IndicatorRelease(hind1);
IndicatorRelease(hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick()
  {
  
 int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
 MqlTradeResult mresult;
   MqlTick latest_price;   
 


ArraySetAsSeries(ind1,true);
ArraySetAsSeries(ind2,true);
MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

SymbolInfoTick(_Symbol,latest_price);
//BUY


   if (PositionSelect(_Symbol)==1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){jj=1;} //определяет если позиция BUY
   if (jj==0 ){
if ( ind2[1]>ind1[1]){ // условие на покупку
Print("индикатор=",ind2[1]," ",ind1[1]);
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - sl*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(0,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

GlobalVariableSet( "k11"+sim,Bars2);
GlobalVariableSet( "bar11"+sim,Bars("EURUSD",NULL));
}}
   
  
  }
//+------------------------------------------------------------------+
 

Lunatic:

这个EA只在第一个tick上分析一个蜡烛。 我注意到有些情况没有处理就溜走了。事实证明,一个罕见的烛台是由第一个刻度线诞生的。这是一个连接效应,是我的故障还是测试人员的故障?

显然,要想只在出生时处理一个蜡烛图,即一次,最后处理的蜡烛图应该存储在一个静态变量 中?

最好是通过改变条形图的时间来跟踪新条形图的出现,之前将其存储在一个静态变量中。

例子可以在IsNewBarEA中的限制和检查 一文中找到。

 
Automated-Trading:

通过改变条形图的时间,可以更好地跟踪新条形图的出现,此前已将其保存在一个静态变量中。

例子可以在IsNewBarEA中的限制和检查 一文中找到。

谢谢你,这很清楚。

但我不明白的是:如何对EA进行调试。很明显,被测试的不是系统,而是程序中的错误。例如,不清楚为什么程序不进入某个分支--为什么?我是否需要盖上不同的调试印章,然后在日志中寻找它们,再盖上其他印章,等待一段时间,直到程序正常工作,然后再在日志中寻找?

搜索程序错误的最佳方法是什么?

 
m_a_sim:

你好,我正在写一个EA,看看我是否能及时赶到冠军赛。我写了一些简单的代码,它使用了2个自定义指标,但是这些指标的值是0,所以交易没有完成。

为了调试你的代码,我已经用MA替换了自定义指标。

   hind1=iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE);
   hind2=iMA("EURUSD",PERIOD_H1,40,0,MODE_SMA,PRICE_CLOSE);

并纠正了将数值复制到数组中的做法。

MAX=CopyBuffer(hind1,0,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

现在有了指标值。

//+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

input int period =48;
input int period1 =30;
input int sl=200;
input double lot=0.1;
input long magicBUY1=102;
input int magicSELL1=202;
input string sim="eur";

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   hind1=iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE);
   hind2=iMA("EURUSD",PERIOD_H1,40,0,MODE_SMA,PRICE_CLOSE);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
IndicatorRelease(hind1);
IndicatorRelease(hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick()
  {
  
int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
MqlTradeResult mresult;
   MqlTick latest_price;  



ArraySetAsSeries(ind1,true);
ArraySetAsSeries(ind2,true);
MAX=CopyBuffer(hind1,0,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

SymbolInfoTick(_Symbol,latest_price);
//BUY


   if (PositionSelect(_Symbol)==1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){jj=1;} //определяет если позиция BUY
   if (jj==0 ){
if ( ind2[1]>ind1[1]){ // условие на покупку
Print("индикатор=",ind2[1]," ",ind1[1]);
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - sl*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(0,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

}}
  
  
  }
//+------------------------------------------------------------------+
 
AM2:

为了调试你的代码,我用MA替换了自定义指标

并纠正了将数值复制到数组中的做法。

现在有了指标值。

所以都是指标的问题? 测试员给了我一个错误

2010.09.01 19:44:36 核心 1 2010.06.01 00:00:01 在'trend_v3.mq5'中阵列超出范围 (71,9)
2010.09.01 19:44:36 核心 1 2010.06.01 00:00:01 在'trend_v3_5.mq5'中阵列超出范围 (83,9)

 

m_a_sim

我认为在复制指数的信息之前,检查手柄的残缺性是比较正确的。最好还能检查一下这些数据的可用性 ....

MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);