Бета-тестирование MetaTrader 5 началось! - страница 90

 
Interesting >>:

А где нынче 5 справку раздают?

Рашид для этого специальную тему создал.

 
betmen >>:

Я знаю что по логике вещей и в справке это int. Речь как раз и идет о том что некорректно работает команда...

В пятой версии справки тоже на этот счет ничего не менялось

На 87 странице я уже выкладывал пример получения информации о спреде.

 
Rosh >>:

На 87 странице я уже выкладывал пример получения информации о спреде.

Рашид здравствуйте!

Если не сложно скажите какими средствами можно запросить историю по инструменту, проконтролировать её получение и чем анализировать окончание расчета индикатора на инструменте.

Хочется самому поправить алгоритм. мультивалютного говоруна.


При компиляции Вашего кода тоже выдаются ошибки "conversion possible loss of data test.mq5"

на строки

Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);

Spread=(Ask-Bid)/Point();

 
betmen >>:

Рашид здравствуй!

Если не сложно скажи какими средствами можно запросить историю по инструменту, проконтролировать её получение и чем анализировать окончание расчета индикатора на инструменте.

Хочется самому поправить алгоритм. мультивалютного говоруна.

Пока можете воспользоваться этим примером для подкачки истории по инструменту, скоро добавим в справку более разевернутый вариант в раздел "Справочник MQL5 / Доступ к таймсериям и индикаторам "

//+------------------------------------------------------------------+
//|                                              TestLoadHistory.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string          InpLoadedSymbol="NZDUSD";   // Symbol to be load
input ENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_H1;  // Period to be load
input datetime        InpStartDate=D'2009.01.01'; // Start date
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Start load",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate);
//---
   int res=LoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
   switch(res)
     {
      case -1 : Print("Unknown symbol",InpLoadedSymbol);             break;
      case -2 : Print("Requested bars more than max bars in chart"); break;
      case -3 : Print("Program was stopped");                        break;
      case  0 : Print("Loaded OK");                                  break;
      case  1 : Print("Loaded previously");                          break;
      case  2 : Print("Loaded previously and built");                break;
      default : Print("Unknown result");
     }
//---
   datetime first_date;
   SeriesInfoInteger(InpLoadedSymbol,InpLoadedPeriod,SERIES_FIRSTDATE,first_date);
   int bars=Bars(InpLoadedSymbol,InpLoadedPeriod);
   Print("First date",first_date,"-",bars,"bars");
//---
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LoadHistory(const string symbol,ENUM_TIMEFRAMES period,datetime start_date)
  {
   datetime first_date=0;
//--- check if symbol is selected in the MarketWatch
   if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
     {
      if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
      SymbolSelect(symbol,true);
     }
//--- check if data is present
   SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
   if(first_date>0 && first_date<=start_date) return(1);
//--- second attempt
   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      if(first_date>0)
        {
         //--- force timeseries build
         datetime times[2];
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
         //--- check date
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(2);
        }
     }
//--- wait for load symbol history info
   while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_date))
      Sleep(5);
//--- fix start date for loading
   if(first_date>start_date) start_date=first_date;
   int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load data step by step
   while(!IsStopped())
     {
      //--- wait for timeseries build
      while(!SeriesInfoInteger(symbol,period,SERIES_SYNCRONIZED) && !IsStopped())
         Sleep(5);
      //--- ask for built bars
      int start=Bars(symbol,period);
      if(start>0)
        {
         if(start>=max_bars) return(-2);
         //--- ask for first date
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(0);
        }
      //--- copying of next part forces data loading
      datetime times[100];
      int copied=CopyTime(symbol,period,start,100,times);
      if(copied>0)
        {
         //--- check for data
         if(times[0]<=start_date)   return(0);
         if(start+copied>=max_bars) return(-2);
        }
     }
//--- stopped
   return(-3);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
  {
   string res;
//---
   if(period==PERIOD_CURRENT) period=Period();
   switch(period)
     {
      case PERIOD_M1:  res="M1";      break;
      case PERIOD_M2:  res="M2";      break;
      case PERIOD_M3:  res="M3";      break;
      case PERIOD_M4:  res="M4";      break;
      case PERIOD_M5:  res="M5";      break;
      case PERIOD_M6:  res="M6";      break;
      case PERIOD_M10: res="M10";     break;
      case PERIOD_M12: res="M12";     break;
      case PERIOD_M15: res="M15";     break;
      case PERIOD_M20: res="M20";     break;
      case PERIOD_M30: res="M30";     break;
      case PERIOD_H1:  res="H1";      break;
      case PERIOD_H2:  res="H2";      break;
      case PERIOD_H3:  res="H3";      break;
      case PERIOD_H4:  res="H4";      break;
      case PERIOD_H6:  res="H6";      break;
      case PERIOD_H8:  res="H8";      break;
      case PERIOD_H12: res="H12";     break;
      case PERIOD_D1:  res="Daily";   break;
      case PERIOD_W1:  res="Weekly";  break;
      case PERIOD_MN1: res="Monthly"; break;
      default : res="unknown period";
     }
//---
   return(res);
  }
//+------------------------------------------------------------------+
 
betmen >>:

При компиляции Вашего кода тоже выдаются ошибки "conversion possible loss of data test.mq5"

на строки

Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);

Spread=(Ask-Bid)/Point();

Вы можете избавиться от этих предупреждений компилятора, если сделаете приведение типов (цветом выделены измененные места)

//+------------------------------------------------------------------+
//|                                                   ShowSpread.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double Ask,Bid;
   long Spread;
   bool fixed_spread=true;
   Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
   Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(Spread==0) // спред плавающий
     {
      fixed_spread=false;
      Spread=(long)((Ask-Bid)/Point());
     }

   string comm,format;
   if(fixed_spread)
     {
      format=StringFormat("Fixed spread = %%d points, Point = %%.%df",_Digits);
      comm=StringFormat(format,Spread,Point());
     }
   else
     {
      format=StringFormat("Floating spread = %%d points, Point = %%.%df",_Digits);
      comm=StringFormat(format,Spread,Point());
     }
   Comment(comm);
  }
 
Interesting >>:

Только тут возникла небольшая неувязочка, заключающаяся в том, что вначале числовые значения соответствуют количеству секунд в тайфрейме (как это было в MQL4), а начиная с PERIOD_H1 такой порядок меняется и логика возвращаемого значения не ясна.


Хотелось бы привести возвращаемые числовые значения в соответствии со стандартом MQL4, т.е. возвращается именно количество секунд входящих в тот или иной ТФ.

Используйте функцию PeriodSeconds() в разделе "Справочник MQL5 / Общие функции / PeriodSeconds ":

PeriodSeconds

Возвращает количество секунд в периоде.

int PeriodSeconds(
ENUM_TIMEFRAMES period=PERIOD_CURRENT // период графика
);

Параметры

period=PERIOD_CURRENT

[in] Значение периода графика из перечисления ENUM_TIMEFRAMES. Если параметр не указан, то возвращается количество секунд текущего периода графика, на котором запущена программа.

Возвращаемое значение

Количество секунд в указанном периоде.

 
Rosh >>:

Пока можете воспользоваться этим примером для подкачки истории по инструменту, скоро добавим в справку более разевернутый вариант в раздел "Справочник MQL5 / Доступ к таймсериям и индикаторам "

Спасибо!

 
Rosh >>:

Вы можете избавиться от этих предупреждений компилятора, если сделаете приведение типов (цветом выделены измененные места)

тогда нужно в справке поправить

SYMBOL_DIGITS

Количество знаков после запятой

int

SYMBOL_SPREAD

Размер спреда в пунктах

int


int->long

Все равно Спасибо!

:-)

Скажите пожалуйста какой оператор выдает состояние расчета индикатора.

Внутри самого индикатора есть такие переменные как rates_total, и prev_calculated, но во время вызова индикатора к примеру

int iMA(

string symbol, // имя символа

ENUM_TIMEFRAMES period, // период

int ma_period, // период усреднения

int ma_shift, // смещение индикатора по горизонтали

ENUM_MA_METHOD ma_method, // тип сглаживания

ENUM_APPLIED_PRICE applied_price // тип цены или handle

);

нет доступа к этим переменным.

 
betmen >>:

тогда нужно в справке поправить

SYMBOL_DIGITS

Количество знаков после запятой

int

SYMBOL_SPREAD

Размер спреда в пунктах

int


int->long

Все равно Спасибо!

:-)

Скажите пожалуйста какой оператор выдает состояние расчета индикатора.

Внутри самого индикатора есть такие переменные как rates_total, и prev_calculated, но во время вызова индикатора к примеру



Если Вы встанете курсором на функцию OnCalculate() в редакторе и нажмете кнопку F1, то попадете на справку по этой функции, где явно написано:

Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и не превышает максимальное количество баров, доступных на графике. Это значение устанавливается в клиентском терминале в меню "Options" на закладке "Charts" - "Max bars in chart".

Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.

Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.

Примечание: если функция OnCalculate возвращает нулевое значение, то в окне DataWindow клиентского терминала значения индикатора не показываются.


Эти параметры просто передаются внутрь функции.

 
kombat писал(а) >>

Проблема возникает для "пятизнака". Благо эта дурь не так сильно распространена.

И это одно из первых с чем столкнулся при знакомстве с мт5...

Путь решения ещё не окончательный, но видимо крайний:

Поразительно, но мне пришла в голову точно такая же мысль и код я использую в точности такой же)))

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