подскажите код - страница 3

 
Karputov Vladimir:
Да. Утром.
буду ждать
 
Stells:
буду ждать

Вот код, к котором можно вводить количество лет. 

Замечания к коду: обратите внимание на время ограничивающие периоды: возможно имеет смысл рассчитывать время для 00-00 каждого дня. Также при отсутствии данных (нехватка истории из-за не подкаченных данных) скрипт просто вернёт ошибку и прекратит работы, без анализа причины ошибки.

//+------------------------------------------------------------------+
//|                                         CopyLow_ArrayMinimum.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.1"
#property description "Average behavior for N years"
#property script_show_inputs
//--- input parameter
input uchar years=2; // years used to calculate
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   datetime    yesterday;
   datetime    year_ago;
   double      array_high[];
   double      array_low[];
   MqlDateTime str1;
   int         index_max;
   int         index_min;
   double      average_behavior[];
   ArrayResize(average_behavior,(int)years);

   TimeToStruct(TimeLocal(),str1);
   for(int i=0;i<(int)years;i++)
     {
      str1.day--;
      yesterday=StructToTime(str1);
      Print("yesterday ",yesterday);
      str1.year--;
      year_ago=StructToTime(str1);
      Print("year_ago ",year_ago);

      ResetLastError();
      int rezult_high=CopyHigh(Symbol(),Period(),yesterday,year_ago,array_high);
      if(rezult_high==-1)
        {
         Print("Error CopyLow ",GetLastError());
         return;
        }
      index_max=ArrayMaximum(array_high,0,WHOLE_ARRAY);
      Print("High = ",array_high[index_max]);

      ResetLastError();
      int rezult_low=CopyLow(Symbol(),Period(),yesterday,year_ago,array_low);
      if(rezult_low==-1)
        {
         Print("Error CopyLow ",GetLastError());
         return;
        }
      index_min=ArrayMinimum(array_low,0,WHOLE_ARRAY);
      Print("Low = ",array_low[index_min]);

      average_behavior[i]=(array_high[index_max]-array_low[index_min]);

      ArrayFree(array_low);
      ArrayFree(array_high);
     }
   int size=ArraySize(average_behavior);
   double summ=0;
   for(int i=0;i<size;i++)
     {
      summ+=average_behavior[i]/Point();
     }
   Print("Average behavior for ",years," years = ",DoubleToString(summ/size,0));
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Вот код, к котором можно вводить количество лет. 

Замечания к коду: обратите внимание на время ограничивающие периоды: возможно имеет смысл рассчитывать время для 00-00 каждого дня. Также при отсутствии данных (нехватка истории из-за не подкаченных данных) скрипт просто вернёт ошибку и прекратит работы, без анализа причины ошибки.

по поводу 0:00 каждого дня, на что это влияет ? мне большая точность в пунктах не важна, просто нужно знать примерный ход цены
 
Stells:
по поводу 0:00 каждого дня, на что это влияет ? мне большая точность в пунктах не важна, просто нужно знать примерный ход цены
Если примерно, то лучше оставить так, как сейчас.
 
Karputov Vladimir:
Если примерно, то лучше оставить так, как сейчас.
большое спасибо. буду пробовать, тестировать.
 
Karputov Vladimir:
Если примерно, то лучше оставить так, как сейчас.

Владимир, здравствуйте.

скажите ещё: этот скрипт к определенному таймфрэйму не привязан ?

ему история по любому ТФ подойдет и запускать можно на любом ?

 
Stells:

Владимир, здравствуйте.

скажите ещё: этот скрипт к определенному таймфрэйму не привязан ?

ему история по любому ТФ подойдет и запускать можно на любом ?

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

подскажите код

Karputov Vladimir, 2015.09.26 09:04

Вот код, к котором можно вводить количество лет. 

Замечания к коду: ... Также при отсутствии данных (нехватка истории из-за не подкаченных данных) скрипт просто вернёт ошибку и прекратит работы, без анализа причины ошибки.

Это специфика работы функция вида CopyHigh. Лучший вариант - прочтите предыдущую ссылку, в ней есть интересный кусок:

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

и проверьте на разных тафмреймах. Ещё лучше для понимания процесса подготовки данных провести такой эксперимент: удалить историю по символу, открыть график по этому символу на таймрейме, например H1, и накинуть скрипт.


 

на основании вашего кода сделал ещё подсчет за последние месяцы и добавил функцию ProverkaIstorii, по вашей ссылке на статью

посмотрите пожалуйста, будет работать ?

//+------------------------------------------------------------------+
//|                                         CopyLow_ArrayMinimum.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.1"
#property description "Average behavior for N years"
#property script_show_inputs
//--- input parameter
input uchar years=2; // years used to calculate
input uchar mons=2; // mons used to calculate
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   datetime    yesterday;
   datetime    year_ago;
   double      array_high[];
   double      array_low[];
   MqlDateTime str1;
   int         index_max;
   int         index_min;
   double      average_behavior[];
   ArrayResize(average_behavior,(int)years);

   TimeToStruct(TimeLocal(),str1);
   for(int i=0;i<(int)years;i++)
     {
      str1.day--;
      yesterday=StructToTime(str1);
      Print("yesterday ",yesterday);
      str1.year--;
      year_ago=StructToTime(str1);
      Print("year_ago ",year_ago);
      
      ProverkaIstorii(Symbol(), Period(), year_ago); // Проверка доступной истории
      
      ResetLastError();
      int rezult_high=CopyHigh(Symbol(),Period(),yesterday,year_ago,array_high);
      if(rezult_high==-1)
        {
         Print("Error CopyLow ",GetLastError());
         return;
        }
      index_max=ArrayMaximum(array_high,0,WHOLE_ARRAY);
      Print("High = ",array_high[index_max]);

      ResetLastError();
      int rezult_low=CopyLow(Symbol(),Period(),yesterday,year_ago,array_low);
      if(rezult_low==-1)
        {
         Print("Error CopyLow ",GetLastError());
         return;
        }
      index_min=ArrayMinimum(array_low,0,WHOLE_ARRAY);
      Print("Low = ",array_low[index_min]);

      average_behavior[i]=(array_high[index_max]-array_low[index_min]);

      ArrayFree(array_low);
      ArrayFree(array_high);
     }
   int size=ArraySize(average_behavior);
   double summ=0;
   for(int i=0;i<size;i++)
     {
      summ+=average_behavior[i]/Point();
     }
   Print("Average behavior for ",years," years = ",DoubleToString(summ/size,0));
   

   datetime    mon_ago;
   ArrayResize(average_behavior,(int)mons);

   TimeToStruct(TimeLocal(),str1);
   for(int i=0;i<(int)mons;i++)
     {
      str1.day--;
      yesterday=StructToTime(str1);
      Print("yesterday ",yesterday);
      str1.mon--;
      mon_ago=StructToTime(str1);
      Print("mon_ago ",mon_ago);
      
      ProverkaIstorii(Symbol(), Period(), mon_ago); // Проверка доступной истории
      
      ResetLastError();
      int rezult_high=CopyHigh(Symbol(),Period(),yesterday,mon_ago,array_high);
      if(rezult_high==-1)
        {
         Print("Error CopyLow ",GetLastError());
         return;
        }
      index_max=ArrayMaximum(array_high,0,WHOLE_ARRAY);
      Print("High = ",array_high[index_max]);

      ResetLastError();
      int rezult_low=CopyLow(Symbol(),Period(),yesterday,mon_ago,array_low);
      if(rezult_low==-1)
        {
         Print("Error CopyLow ",GetLastError());
         return;
        }
      index_min=ArrayMinimum(array_low,0,WHOLE_ARRAY);
      Print("Low = ",array_low[index_min]);

      average_behavior[i]=(array_high[index_max]-array_low[index_min]);

      ArrayFree(array_low);
      ArrayFree(array_high);
     }
   size=ArraySize(average_behavior);
   summ=0;
   for(int i=0;i<size;i++)
     {
      summ+=average_behavior[i]/Point();
     }
   Print("Average behavior for ",mons," mons = ",DoubleToString(summ/size,0));
  }
//+------------------------------------------------------------------+

void ProverkaIstorii(string InpLoadedSymbol, ENUM_TIMEFRAMES InpLoadedPeriod, datetime InpStartDate)
  {
   Print("Start load",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate);
//---
   int res=CheckLoadHistory(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 -4 : Print("Indicator shouldn't load its own data ");      break;
      case -5 : Print("Load failed ");                                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 CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
  {
   datetime first_date=0;
   datetime times[100];
//--- check symbol & period
   if(symbol==NULL || symbol=="") symbol=Symbol();
   if(period==PERIOD_CURRENT)     period=Period();
//--- 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);
//--- don't ask for load of its own data if it is an indicator
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
      return(-4);
//--- second attempt
   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      //--- there is loaded data to build timeseries
      if(first_date>0)
        {
         //--- force timeseries build
         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);
        }
     }
//--- max bars in chart from terminal options
   int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info
   datetime first_server_date=0;
   while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
      Sleep(5);
//--- fix start date for loading
   if(first_server_date>start_date) start_date=first_server_date;
   if(first_date>0 && first_date<first_server_date)
      Print("Warning: first server date ",first_server_date," for ",symbol,
            " does not match to first series date ",first_date);
//--- load data step by step
   int fail_cnt=0;
   while(!IsStopped())
     {
      //--- wait for timeseries build
      while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
         Sleep(5);
      //--- ask for built bars
      int bars=Bars(symbol,period);
      if(bars>0)
        {
         if(bars>=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
      int copied=CopyTime(symbol,period,bars,100,times);
      if(copied>0)
        {
         //--- check for data
         if(times[0]<=start_date)  return(0);
         if(bars+copied>=max_bars) return(-2);
         fail_cnt=0;
        }
      else
        {
         //--- no more than 100 failed attempts
         fail_cnt++;
         if(fail_cnt>=100) return(-5);
         Sleep(10);
        }
     }
//--- stopped
   return(-3);
  }
//+------------------------------------------------------------------+
//| Возвращает строкое значение периода                              |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
  {
   if(period==PERIOD_CURRENT) period=Period();
//---
   switch(period)
     {
      case PERIOD_M1:  return("M1");
      case PERIOD_M2:  return("M2");
      case PERIOD_M3:  return("M3");
      case PERIOD_M4:  return("M4");
      case PERIOD_M5:  return("M5");
      case PERIOD_M6:  return("M6");
      case PERIOD_M10: return("M10");
      case PERIOD_M12: return("M12");
      case PERIOD_M15: return("M15");
      case PERIOD_M20: return("M20");
      case PERIOD_M30: return("M30");
      case PERIOD_H1:  return("H1");
      case PERIOD_H2:  return("H2");
      case PERIOD_H3:  return("H3");
      case PERIOD_H4:  return("H4");
      case PERIOD_H6:  return("H6");
      case PERIOD_H8:  return("H8");
      case PERIOD_H12: return("H12");
      case PERIOD_D1:  return("Daily");
      case PERIOD_W1:  return("Weekly");
      case PERIOD_MN1: return("Monthly");
     }
//---
   return("unknown period");
  }


 
Stells:

на основании вашего кода сделал ещё подсчет за последние месяцы и добавил функцию ProverkaIstorii, по вашей ссылке на статью

посмотрите пожалуйста, будет работать ?


Да, работает. И история недостающая подкачивается. Это видно по логам:

2015.09.27 11:38:21.701 test2 (EURUSD,H1)       yesterday 2015.09.26 11:38:21
2015.09.27 11:38:21.701 test2 (EURUSD,H1)       year_ago 2014.09.26 11:38:21
2015.09.27 11:38:21.701 test2 (EURUSD,H1)       Start loadEURUSD,H1from2014.09.26 11:38:21
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       Loaded OK 
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       First date 2014.09.11 00:00:00 - 6432 bars
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       High = 1.28868
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       Low = 1.04619
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       yesterday 2014.09.25 11:38:21
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       year_ago 2013.09.25 11:38:21
2015.09.27 11:38:26.533 test2 (EURUSD,H1)       Start loadEURUSD,H1from2013.09.25 11:38:21
2015.09.27 11:38:37.318 test2 (EURUSD,H1)       Loaded OK 
2015.09.27 11:38:37.318 test2 (EURUSD,H1)       First date 2013.08.28 00:00:00 - 12823 bars
2015.09.27 11:38:37.318 test2 (EURUSD,H1)       High = 1.39932
2015.09.27 11:38:37.318 test2 (EURUSD,H1)       Low = 1.26968
2015.09.27 11:38:37.318 test2 (EURUSD,H1)       Average behavior for 2 years = 18607
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       yesterday 2015.09.26 11:38:37
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       mon_ago 2015.08.26 11:38:37
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Start loadEURUSD,H1from2015.08.26 11:38:37
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Loaded previously 
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       First date 2013.08.28 00:00:00 - 12823 bars
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       High = 1.14798
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Low = 1.10869
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       yesterday 2015.08.25 11:38:37
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       mon_ago 2015.07.25 11:38:37
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Start loadEURUSD,H1from2015.07.25 11:38:37
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Loaded previously 
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       First date 2013.08.28 00:00:00 - 12823 bars
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       High = 1.17138
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Low = 1.08477
2015.09.27 11:38:37.319 test2 (EURUSD,H1)       Average behavior for 2 mons = 6295
 
Karputov Vladimir:

Да, работает. И история недостающая подкачивается. Это видно по логам:

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