Изучаем и пишем вместе на MQL5 - страница 10

 

Не знаю по теме ли вопрос.

Можно ли совместить отладку и тестер? Т.е. если запускаю по F5, то тестер, естественно, не запускается. А если стартую экспрта в тестере, то точки останова игнорируются. Или что-то не так делаю? 

 
Lunatic:

Не знаю по теме ли вопрос.

Можно ли совместить отладку и тестер?

На данный момент - нет.
 
alexvd:
На данный момент - нет.

Значит только в реальном времени на демке? А как же отладка на интересных ситуациях?

Я поначалу так обрадовался отладчику, а скатываюсь обратно к отладочным печатям. Другие технологии отладки не просматриваются. - Огорчительно. 

 

Изучаю советник, поставляемый в качестве примера, MovingAverage. Все в нем красиво. Вопрос по тестеру.

В этом советнике анализируется свеча только на первом тике. Обратил внимание, что некоторые ситуации проскакивают без обработки. Оказывается редкая свеча рождается с первого тика. Это эффект связи, мой глюк или тестера?

Видимо, чтобы обрабатывать свечу только при рождении, т.е. один раз, нужно последнюю обработанную свечу хранить в статической переменной?  

P/S/ Только начинаю изучать язык, поэтому такие нудные вопросы. 

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

Здравствуйте, пишу советник, может успею к чемпионату. Написал вроде простой код, там используется 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:

В этом советнике анализируется свеча только на первом тике. Обратил внимание, что некоторые ситуации проскакивают без обработки. Оказывается редкая свеча рождается с первого тика. Это эффект связи, мой глюк или тестера?

Видимо, чтобы обрабатывать свечу только при рождении, т.е. один раз, нужно последнюю обработанную свечу хранить в статической переменной?  

Появление нового бара лучше отслеживать при помощи изменения времени бара, предварительно сохранив его в статической переменной.

Примеры можно найти в IsNewBar, и статье Ограничения и проверки в экспертах.

 
Automated-Trading:

Появление нового бара лучше отслеживать при помощи изменения времени бара, предварительно сохранив его в статической переменной.

Примеры можно найти в IsNewBar, и статье Ограничения и проверки в экспертах.

 

Спасибо, с этим ясно.

 Но вот что мне непонятно, так как отлаживать советники. Понятно, что на тестере, не систему, которую делаем, а именно баги в программе. Вот, например, непонятно почему не заходит программа в определённую ветку - почему? Нужно ставить разные отладочные  печати, потом выискивать их в журнале, потом ставить другие печати, ждать определенное время пока программа отработает и снова искать в журнале ?

Как лучше организовать поиск ошибок программы? 

 
m_a_sim:

Здравствуйте, пишу советник, может успею к чемпионату. Написал вроде простой код, там используется 2 пользовательских индикатора, но значения этих индикаторов равны 0, по-этому сделка не совершается, посмотрите пожалуйсто, что я не так сделал или может проблема в самих индикатора?

 

Чтобы отладить ваш код заменил пользовательские индикаторы на МА:

   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:

Чтобы отладить ваш код заменил пользовательские индикаторы на МА:

И поправил копирование значений в массив:

Сейчас есть значения индикаторов:

 

получается, что все дело в индикаторах? тестер мне пишет ошибку

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Array out of range in 'trend_v3.mq5' (71,9)
2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Array out of range in 'trend_v3_5.mq5' (83,9)

 

 

To m_a_sim

Думается мне, что корректней перед копированием информации с индюков проверять на инвалидность хендлов. Еще бы проверку на доступность этих самых данных организовать....

MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);
Причина обращения: