Вопрос с массивами.

 

Приветствую всех.


Использую следующий скрипт для закачки истории.

//+------------------------------------------------------------------+
//|                                              Download_Symbol.mq4 |
//|                                         Copyright 2008, HIDDEN ™ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2008, HIDDEN ™"
#include <WinUser32.mqh>
#include <stdlib.mqh>


string Currencies[] = { "AED", "AUD", "BHD", "BRL", "CAD", "CHF", "CNY", 
                        "CYP", "CZK", "DKK", "DZD", "EEK", "EGP", "EUR",
                        "GBP", "HKD", "HRK", "HUF", "IDR", "ILS", "INR",
                        "IQD", "IRR", "ISK", "JOD", "JPY", "KRW", "KWD",
                        "LBP", "LTL", "LVL", "LYD", "MAD", "MXN", "MYR",
                        "NOK", "NZD", "OMR", "PHP", "PLN", "QAR", "RON",
                        "RUB", "SAR", "SEK", "SGD", "SKK", "SYP", "THB",
                        "TND", "TRY", "TWD", "USD", "VEB", "XAG", "XAU",
                        "YER", "ZAR", "ALL", "ARS", "BWP", "CCK", "CLP",
                        "CNY", "COP", "CVE", "DOP", "GEL", "GIP", "HKD",
                        "LBR", "LSL", "MTL", "NPR", "PKR", "RUR", "UAH",
                        "XOF", "ZMK" };
                                                                                                                                                                                                                                                
string list[];
int    SymbolCount = 0; 

int init(){
   CreateSymbolList();
}


int CreateSymbolList()
  {
   int CurrencyCount = ArrayRange(Currencies, 0);
   int Loop, SubLoop;
   string TempSymbol;
   for(Loop = 0; Loop < CurrencyCount; Loop++)
       for(SubLoop = 0; SubLoop < CurrencyCount; SubLoop++)
         {
           TempSymbol = Currencies[Loop] + Currencies[SubLoop];
           if(MarketInfo(TempSymbol, MODE_BID) > 0)
             {
               ArrayResize(list, SymbolCount + 1);
               list[SymbolCount] = TempSymbol;
               SymbolCount++;
             }
         }
   return(0);
  }

void start()
{
   double x;
                  
   int period[] = { PERIOD_M1, 
                    PERIOD_M5 , 
                    PERIOD_M15,
                    PERIOD_M30,
                    PERIOD_H1 ,
                    PERIOD_H4 ,
                    PERIOD_D1 ,
                    PERIOD_W1 ,
                    PERIOD_MN1};
                    
   string str_per[] = { "PERIOD_M1", 
                        "PERIOD_M5" , 
                        "PERIOD_M15",
                        "PERIOD_M30",
                        "PERIOD_H1" ,
                        "PERIOD_H4" ,
                        "PERIOD_D1" ,
                        "PERIOD_W1" ,
                        "PERIOD_MN1"};

   double close[];

   for (int i = 0; i < ArraySize(list); i++){
      Print("Закачивание котировок инструмента "+list[i]);
      for (int j = 0; j < ArraySize(period); j++){
         Comment("Завершено: " + (((i+1)*ArraySize(period) - ArraySize(period) + j + 1) * 100) / (ArraySize(list) * ArraySize(period))+ "%");

         x = iClose(list[i], period[j], 0);
         Print(list[i] + " Период: "+str_per[j]);

         while (true){
            ArrayCopySeries(close, MODE_CLOSE, list[i], period[j]);
            int error = GetLastError();
            if (error == 0) break;
            if(error==4066){
               for(int ii=0;ii<2; ii++){
                  Sleep(10000);
                  ArrayCopySeries(close, MODE_CLOSE, list[i], period[j]);
                  datetime last_day=close[0];
                  if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day)) break;
               }
            }            
            if (IsStopped() == true) return(0);
            Sleep(10000);
         }
         Sleep(1000);
      }
   }
   Print("Котировки закачены");
}

int deinit() { Comment(""); }
// End


Когда на машине оперативки много, то проблем не возникает. Но тут поставил терминал на более слабую машину с меньшим количеством оперативки и вылезла проблема, то что оперативки не хватает. Исторические данные закачиваются в память, растёт файл подкачки. Подскажите как справится с решением данной задачи, что-бы скрипт работал без проблем с памятью.

 

Теперь есть более надёжное решение.

Скоро обновлённый скрипт выложу.


 
Zhunko писал(а) >>

Теперь есть более надёжное решение.

Скоро обновлённый скрипт выложу.


Чем оно надежнее?

//+---------------------------------------------------------------------------------------------------------+
//| !!! ВО ВРЕМЯ РАБОТЫ СКРИПТА НЕ ПРОИЗВОДИТЬ ДЕЙСТВИЙ В ТЕРМИНАЛЕ!!! |
//+---------------------------------------------------------------------------------------------------------+

Вышепредставленный срипт висит у меня в виде индикатора, и никаких проблем.

Автоматизация это хорошо, но не следует в автоматизации доходить до маразма - http://www.lenta.ru/news/2008/11/08/submarine/ "по неизвестным причинам сработала система пожаротушения", в первых репортажах говорили "от случайного срабатывания автоматиеской системы пожаротушения (фреоном)". Инженеру-разработчику при запуске этой системы в эксплуатацию наверно бурно аплодировали...

 
Zhunko >>:

Теперь есть более надёжное решение.

Скоро обновлённый скрипт выложу.


Отличное решение. Спасибо. Проблема отпала и походу на очень долго.

 
Integer >>:

Чем оно надежнее?

Вышепредставленный срипт висит у меня в виде индикатора, и никаких проблем.

Автоматизация это хорошо, но не следует в автоматизации доходить до маразма - http://www.lenta.ru/news/2008/11/08/submarine/ "по неизвестным причинам сработала система пожаротушения", в первых репортажах говорили "от случайного срабатывания автоматиеской системы пожаротушения (фреоном)". Инженеру-разработчику при запуске этой системы в эксплуатацию наверно бурно аплодировали...

Надёжность этого скрипта заключается в надёжной закачке истории.

Простое обращение к истории инструмента не всегда приводит к закачке его истории. Есть такая проблема при общении со сервером.

А открытие графика и его двукратное обновление вынуждает сервер отдать котировки.