Ошибки, баги, вопросы - страница 1935

 
Aleksey Vyazmikin:

Так что не уверен, что дело в торговых функциях...

Там ветка - это пример конструктивных заявлений, который каждый может воспроизвести.
 
fxsaber:
Там ветка - это пример конструктивных заявлений, который каждый может воспроизвести.

Понимаю - я бы выложил код, но в нём используется класс для торговых функций, за который я ещё не заплатил...

При визуализации наблюдаю постепенное замедление работы - чуть ли не пару секунд на бар при максимальной скорости - есть идеи, что это может быть?

Антивирус не проверяет, винт SSD, место на нем есть...

 
Aleksey Vyazmikin:

Переписал советник с MT4 на MT5

История одна и та жа, тестирование по контрольным точкам на минутах.

MT5

2017.07.20 20:01:38.059 Core 1 Si-9.17,M1: 107509 ticks, 35385 bars generated. Environment synchronized in 0:00:00.078. Test passed in 0:03:52.707 (including ticks preprocessing 0:00:00.031).

MT4

2017.07.20 20:02:32.696 RUBRUR,M1: 225314 tick events (35701 bars, 231783 bar states) processed in 0:00:04.259 (total time 0:00:11.310)

И где хваленая скорость MT5?
Вы код обоих экспертов покажите. Там ведь у вас вместо родного MQL5 стоит ленивый эмулятор MQL4?
 
Renat Fatkhullin:
Вы код обоих экспертов покажите. Там ведь у вас вместо родного MQL5 стоит ленивый эмулятор MQL4?

 

Пока не готов показать код по причине

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Aleksey Vyazmikin, 2017.07.20 23:28


Понимаю - я бы выложил код, но в нём используется класс для торговых функций, за который я ещё не заплатил...

Но готов показать результаты профилирования из MT5 - как я понимаю о торговых функциях речи нет.



Для окружения OHLC использую такие функции

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
Может я что-то делаю не так?


 


 

 
Aleksey Vyazmikin:

 

Пока не готов показать код по причине

Но готов показать результаты профилирования из MT5 - как я понимаю о торговых функциях речи нет.

Для окружения OHLC использую такие функции

Может я что-то делаю не так?
double iOpen(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyOpen(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iClose(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyClose(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyHigh(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iLow(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyLow(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }
 

Вы копируете все доступные бары с истории, но вам реально нужен только один искомый index

CopyOpen(Symbol(),0,index,Bars(Symbol(),0)1,Open);
 
Vitaly Muzichenko:

Вы копируете все доступные бары с истории, но вам реально нужен только один искомый index

 

Поменял по Вашему рецепту и перестал советник открывать ордера... может опять накосячил?


//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,index,1,Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyHigh(symbol,timeframe,index,1,CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }
 
Aleksey Vyazmikin:

 

Поменял по Вашему рецепту и перестал советник открывать ордера... может опять накосячил?


double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,index,1,Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }

Close != High


PS. Пишите вот сюда, это не та тема

Прошу модераторов перенести посты в нужную тему, чтоб не хламить эту

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Vitaly Muzichenko:

Close != High

PS. Пишите вот сюда, это не та тема

Прошу модераторов перенести посты в нужную тему, чтоб не хламить эту

 Спасибо - исправил.

в итоге код такой

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

Время в тесторе выросло - устал уже ждать :)


 

 

Считаю лоты проторгованные в истории за текущий месяц.

   double lots=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
         if(TimeMonth(OrderCloseTime())==TimeMonth(TimeCurrent()))
            if(OrderType()<2)
               lots+=OrderLots();

Оказывается если я в истории терминала показал ордера за заданный период времени, например за последние три дня то OrdersHistoryTotal() видит только последние три дня.

Считаю это не правильным, OrdersHistoryTotal() должна видеть все орде за всю историю, а уж фильтровать по датам и периодам должен программист.

Иначе не верное скрытие истории пользователем может привести к проблемам....

Причина обращения: