Скачать MetaTrader 5

Зачем из MQL убрали стандартные функции?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasiliy Smirnov
14048
Vasiliy Smirnov  
//   
double iCloseMQL4(string symbol,int tf,int index){
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
  
   if(CopyClose(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]);
   else {Print ("Ошибка Copy");return(-1);}
}
CloseD1=iCloseMQL4(_Symbol,1440,1);

Вопрос, на который так и не нашёл ответа. Что делать, если функция возвращает мне -1. Повторные обращения могут быть бесконечны, что в результате приводит к зацикливанию. Что мешает функции CopyClose исполняться?

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyClose - Документация по MQL5
Andrew Petras
5253
Andrew Petras  

В МТ5 использовал Bars и пример оттуда же для синхронизации, заработало.

Для МТ4, наверное, что то похоже надо делать.

Или на 4верошном форуме искать.

Vasiliy Smirnov
14048
Vasiliy Smirnov  
В каком месте использовать тут Bars? В MT4 проблем не было - запросил результат и получил его. Здесь же перед CopyClose нужно прописать наверно обновление графика данного таймфрейма, иначе результата возможно не будет. Вопрос заключается в том, как гарантированно получить значение цены с другого таймфрейма. 
Anatoli Kazharski
63493
Anatoli Kazharski  
zfs:
В каком месте использовать тут Bars? В MT4 проблем не было - запросил результат и получил его. Здесь же перед CopyClose нужно прописать наверно обновление графика данного таймфрейма, иначе результата возможно не будет. Вопрос заключается в том, как гарантированно получить значение цены с другого таймфрейма. 
Делайте несколько попыток в случае, если не получилось с первого раза. Не помню, чтобы была какая-то проблема в получении данных.
pako
3309
pako  
zfs:
В каком месте использовать тут Bars? В MT4 проблем не было - запросил результат и получил его. Здесь же перед CopyClose нужно прописать наверно обновление графика данного таймфрейма, иначе результата возможно не будет. Вопрос заключается в том, как гарантированно получить значение цены с другого таймфрейма. 
так попробуйте, для закрытия вчерашнего дня, для сегодня rates[1].close, но он еще не закрылся
MqlRates rates[3];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(Symbol(),PERIOD_D1,0,2,rates);
   CloseD1=rates[0].close;
Andrew Petras
5253
Andrew Petras  
zfs:
В каком месте использовать тут Bars? В MT4 проблем не было - запросил результат и получил его. Здесь же перед CopyClose нужно прописать наверно обновление графика данного таймфрейма, иначе результата возможно не будет. Вопрос заключается в том, как гарантированно получить значение цены с другого таймфрейма. 
До копирования получить кол-во баров с нужного тф, если 0, запускать синхронизацию.
Vasiliy Smirnov
14048
Vasiliy Smirnov  
tol64:
Делайте несколько попыток в случае, если не получилось с первого раза. Не помню, чтобы была какая-то проблема в получении данных.
приводит только к зацикливанию
Anatoli Kazharski
63493
Anatoli Kazharski  
zfs:
приводит только к зацикливанию
Данные удалось получить или нет? )) В MT4 может быть это всё было сделано внутри. А в MT5 можно всё контролировать. Установите, например 5 попыток.
Aleksey Sergan
30168
Aleksey Sergan  
tol64:
Данные удалось получить или нет? )) В MT4 может быть это всё было сделано внутри. А в MT5 можно всё контролировать. Установите, например 5 попыток.

Этого недостаточно.

этот вариант в большинстве случаев подойдет

//+------------------------------------------------------------------+
//| Аналог Bars(), не требует предварительной синхронизации истории  |
//| Вход  : symbol - символ в терминале                              |
//|         timeframe - таймфрейм                                    |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int BarsSinh( string symbol,ENUM_TIMEFRAMES  timeframe ){
  SynhronizeSeries( symbol,  timeframe );
  return( Bars( symbol, timeframe ));
}

//+------------------------------------------------------------------+
//| Произвести синхронизацию таймсерии с историей                    |
//| Вход  : symbol - символ в терминале                              |
//|         tf     - таймфрейм                                       |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
bool SynhronizeSeries( string symbol, ENUM_TIMEFRAMES tf ){
  int fail_cnt=0;
  if( Bars(symbol, tf ) > 0 )return(true);
  while(!IsStopped() && fail_cnt <  100 ){
  //--- wait for timeseries build
    int fail2_cnt = 0;
    while(!SeriesInfoInteger(symbol,tf,SERIES_SYNCHRONIZED
/*SERIES_SYNCRONIZED*/) && !IsStopped()){
      fail2_cnt++;
      Sleep(5);
      if( fail2_cnt>1000)break;
      
    }
      //--- ask for built bars
    datetime times[1];
    if( Bars(symbol, tf ) > 0 )return(true);
    int copied=CopyTime(symbol,tf,0,1,times);
    if( copied <= 0){         //--- no more than 100 failed attempts
      fail_cnt++;
      Sleep(10);
    }
  }
  //Print("Не удалось синхронизировать серии для "+symbol+" таймфрейм "+SPeriod(tf) + " число попыток "+IntegerToString( fail_cnt) );
  Print("Can not to sinhronize series for "+symbol+" timeframe "+SPeriod(tf) + " num of attemps "+IntegerToString( fail_cnt) );
  return(false);
}
pako
3309
pako  
//+------------------------------------------------------------------+
//|                                                        test1.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlRates rates[3];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(Symbol(),PERIOD_D1,0,2,rates);
   double CloseD1=rates[0].close;
   Comment("Закрытие дня   ",CloseD1);
   
  }
//+------------------------------------------------------------------+
Файлы:
test1.mq5 4 kb
pako
3309
pako  
или так
//+------------------------------------------------------------------+
//|                                                        test1.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    double CloseD1[2];
    CopyClose(_Symbol,PERIOD_D1,0,1,CloseD1);
    Comment("Закрытие дня   ",CloseD1[1]);
   
  }
//+------------------------------------------------------------------+
Файлы:
test1.mq5 3 kb
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий