Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 265

 
C-4:
Что Вы понимаете под словом "выровнять"? Нормализовать мантиссу по количеству знаков после запятой? - Для этого есть функция NormalizeDouble. Если что-то другое - опишите подробней.

На входе любой положительный дабл, на выходе округление до реальной цены, которая может быть на этом инструменте.

Если шаг цены 0,25, значит округление до 0,25. Ну типа этого:

double RoundPrice(const double price)
{
   if(price<=0) return(-1);
   double tick_size=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
   double p=round(price/tick_size);
   return(NormalizeDouble(p*tick_size,_Digits));
}

Но при этом, если есть офсет (вроде 0,13; 0,38; 0,63; 0,88), значит он учитывается. Тогда:

на входе 1,0 на выходе 1,13;

на входе 1,25 на выходе 1,38;

1,5 ---> 1,63...

На уровне API это можно было бы в пару команд ассемблера закодить и это однозначно базовая функция. Я думал она есть =/

 
как сделать update до нового билда через Live  update. Где он этот Live  update 
 
Newalligator:
как сделать update до нового билда через Live  update. Где он этот Live  update 
Нужно открыть демо-счёт на сервере MetaQuotes-Demo и периодически подключаться, для проверки обновлений, на этот счёт. Как открыть демо-счет на сервере MetaQuotes-Demo
 
Спасибо  за ответ на  торгую на реале и всегда МТ5 включена . Если программа сама укажет что нужно обновиться  это хорошо а если нет то где этот Live update?
 
Newalligator:
Спасибо  за ответ на  торгую на реале и всегда МТ5 включена . Если программа сама укажет что нужно обновиться  это хорошо а если нет то где этот Live update?
При подключении к торговому счёту на демо-сервере MetaQuotes-Demo терминал MetaTrader сам проверяет наличие обновлений. Если обновление в наличии, начнётся автоматическая закачка новой версии.
 

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

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
      
   // Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
   CopyBuffer(iRocHandleEURUSD, 0, 0, rates_total, aRocRatesEURUSD);

   for(int bar = first; bar < rates_total; bar++) {

Вот, в этом коде буфер индикатора Rate Of Changes (aRocRatesEURUSD) не доступен. Почему - не могу понять, как правильно подключить этот индикатор, помогите, пожалуйста, разобраться?

 
jommerbot:

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

Вот, в этом коде буфер индикатора Rate Of Changes (aRocRatesEURUSD) не доступен. Почему - не могу понять, как правильно подключить этот индикатор, помогите, пожалуйста, разобраться?

Хэндлы индикаторов следует объявлять в OnInit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
Иначе получается, что Вы каждый вызов OnCalculate() создаёте новый пользовательский индикатор.
 
barabashkakvn:

Хэндлы индикаторов следует объявлять в OnInit():

Так тоже не работает. Массив с буфером в итоге либо пустой, либо забит левыми значениями.
 
jommerbot:
Так тоже не работает. Массив с буфером в итоге либо пустой, либо забит левыми значениями.
Тем не менее объявлять хэндлы индикаторов в OnInit() - это правильно. Другое дело - зачем Вам каждый раз с приходом нового тика (функция OnCalculate()) записывать 
rates_total,      // размер входных таймсерий

в буфер

aRocRatesEURUSD

? Это ведь может очень тормозить терминал. И, к тому же, это очень глубокая история.

Думаю Вам будет интересно прочесть статью Принципы экономного пересчета индикаторов

А также прочесть справку по функции OnCalculate(). 

 

Ок, даже в самом простейшем случае не работает:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double ExtLineBuffer[];   
int iRocHandleEURUSD;  
int iPlotShift = 0;
int iPeriod = 6;
 
void OnInit() {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, iPlotShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, iPeriod - 1);
   
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");    
   if( iRocHandleEURUSD == INVALID_HANDLE )
   {
      Print("Не удалось получить хендл индикатора ROC EURUSD");  
   }
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   double aRocRatesEURUSD[]; 
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
   
   for(int bar = first; bar < rates_total; bar++) {
      CopyBuffer(iRocHandleEURUSD, 0, bar, 1, aRocRatesEURUSD);
      Print(aRocRatesEURUSD[ 0 ]);   
      ExtLineBuffer[ bar ] = NormalizeDouble(aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS);
   }
     
   return(rates_total);
}

 Не понимаю, где моя ошибка. Копирование буфера этого же индикатора в советнике и скрипте работает, а вот в индикаторе - нет. Хендл индикатора инициализируется без ошибки.

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