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

 
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() должна видеть все орде за всю историю, а уж фильтровать по датам и периодам должен программист.

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

 
Aleksey Vyazmikin:

 

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

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



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

Может я что-то делаю не так?

 

К сожалению, вы все делаете не так.

Вместо того, чтобы написать родной и эффективный MQL5 код, вы используете страшно неэффективный эмулятор MQL4 кода, который тормозит работу в десятки раз.

Плохо то, что вы даже не понимаете, что делаете, раз заявляете вопросы про скорость.
 
Aleksey Vyazmikin:

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

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • голосов: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

 

Спасибо - я видел эту библиотеку - в описании смутило


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

У меня советник работает только по открытию бара - думаете есть смысл опробывать?
 
Renat Fatkhullin:

К сожалению, вы все делаете не так.

Вместо того, чтобы написать родной и эффективный MQL5 код, вы используете страшно неэффективный эмулятор MQL4 кода, который тормозит работу в десятки раз.

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

 Я конечно искал решение - как заменить функции MQL4 на MQL5, в частности обращение к тайм сериям, и увидел, что это одна из проблем с которой сталкивается большинство людей, переходящих на MQL5.

Соответственно, решение я нашел на этом же сайте, где в одной из статей рекомендовался примененный мной метод.

Лично я, не понимаю, какой смысл изымать хорошие и удобные функции из языка.

Поэтому, к Вам вопрос, как же надо правильно было организовать получение информации, что б почувствовать преимущество языка MQL5?