Код платформы многовалютного многотаймфреймового советника - страница 2

 

RefreshRates() бы добавить. Да и неплохо было бы контроль ошибки 4066 сделать

 
Vinin писал(а) >>

RefreshRates() бы добавить. Да и неплохо было бы контроль ошибки 4066 сделать

RefreshRates(), обязательно!

Но эту функцию лучше ставить в процедурах анализа

ProcSP();

ProcSymbolPeriod(i,j);

ProcSymbolPeriodS(i);

ProcSymbolSPeriodS();

Да?

А как и где ставить ошибки 4066 ? Пример кода?

 
alexfx писал(а) >>

Самый верхний модуль:

int init() { return(0); }
int deinit() { return(0); }

//=========================================================================================================================
int start()
{
startustanovki(); // начальные установки
while(!IsStopped()) // До тех пор, пока пользователь не прекратит исполнение программы
{
kontrol(); // контрольные функции
SymbolPeriod(); // фиксация появления нового бара по любой валютной паре и на любом таймфрейме
if (analiz1>60)
{
Print("======================================================");
Print("Превышение допустимого (60сек) времени обработки !!! ",analiz1,"сек Перезапуск цикла обработки.");
Print("======================================================");
break;
}

//====================== ежечасный перезапуск цикла ========
string text = TimeToStr(TimeCurrent(),TIME_MINUTES);
int index = StringFind(text, ":49", 0); // разрешение на очередной ежечастный однократный перезапуск эксперта (цикла)
if (index==2) {bool perezapusk=true;}
index = StringFind(text, ":50", 0); // профилактический перезапуск цикла делаю за 10 минут до начала нового часа ========
if ((index==2)&&(perezapusk==true))
{
Print("======================================================");
Print(" Профилактический, перезапуск цикла обработки ",TimeToStr(TimeCurrent(),TIME_MINUTES));
Print("======================================================"); perezapusk=false; break;
}
//====================== ежечасный перезапуск цикла ========

ProcSP(); // оперативная циклическая обработка
Sleep(100); // притормози! (замедлитель цикла обработки)
}
return(0); // Управление возвращается терминалу
}
//=========================================================================================================================

//===============================================   Д В И Ж О К   ===================================================================
//===================================================================================================================================

int init()   { return(0); }
int deinit() { return(0); }

//=========================================================================================================================
int start()
   {
      startustanovki();      // начальные установки
      while(!IsStopped())    // До тех пор, пока пользователь не прекратит исполнение программы       
         {
            kontrol();       // контрольные функции                
            SymbolPeriod();  // фиксация появления нового бара по любой валютной паре и на любом таймфрейме
            if (analiz1>60)
               {
                  Print("======================================================");
                  Print("Превышение допустимого (60сек) времени обработки !!!  ",analiz1,"сек       Перезапуск цикла обработки.");
                  Print("======================================================");
                  break;
               }   

            //====================== ежечасный перезапуск цикла ========  
            string text   = TimeToStr(TimeCurrent(),TIME_MINUTES);            
            int    index = StringFind(text, ":49", 0);   // разрешение на очередной ежечастный однократный перезапуск эксперта (цикла)
            if     (index==2) {bool perezapusk=true;}       
                   index = StringFind(text, ":50", 0);   // профилактический перезапуск цикла делаю за 10 минут до начала нового часа ========  
            if     ((index==2)&&(perezapusk==true))
               {
                  Print("======================================================");
                  Print(" Профилактический, перезапуск цикла обработки ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Print("======================================================");   perezapusk=false;  break;
               }   
            //====================== ежечасный перезапуск цикла ========  
            
            ProcSP();        // оперативная циклическая обработка  
            Sleep(100);      // притормози! (замедлитель цикла обработки)  
         }      
      return(0);             // Управление возвращается терминалу
   }
//=========================================================================================================================

 

RefreshRates() нужен при любом обращении к другим инструментам. А в твоем варианте эксперт зацикленный. И данные так просто обновляться не будут

Ошибка 4066

ERR_HISTORY_WILL_UPDATED 4066 Запрошенные исторические данные в состоянии обновления

означает что идет загрузка истории. Пока она не закончилась результаты нельзя принимать во внимание. Я обычно добавляю функцию контроля истории, которая просто запрашивает Клоуз всех инструментов. Если идет постоянное обращение, то ошибка 4066 не возникает. Только при первом запуске и после разрыва связи.
 
Vinin писал(а) >>

RefreshRates() нужен при любом обращении к другим инструментам. А в твоем варианте эксперт зацикленный. И данные так просто обновляться не будут

Ошибка 4066

ERR_HISTORY_WILL_UPDATED 4066 Запрошенные исторические данные в состоянии обновления

означает что идет загрузка истории. Пока она не закончилась результаты нельзя принимать во внимание. Я обычно добавляю функцию контроля истории, которая просто запрашивает Клоуз всех инструментов. Если идет постоянное обращение, то ошибка 4066 не возникает. Только при первом запуске и после разрыва связи.

Т.е. RefreshRates() ставлю перед kontrol();

 
alexfx писал(а) >>

Т.е. RefreshRates() ставлю перед kontrol();

А в процедурах ставить уже нет смысла?

ProcSP();

ProcSymbolPeriod(i,j);

ProcSymbolPeriodS(i);

ProcSymbolSPeriodS();

Да?

 
alexfx писал(а) >>

А в процедурах ставить уже нет смысла?

ProcSP();

ProcSymbolPeriod(i,j);

ProcSymbolPeriodS(i);

ProcSymbolSPeriodS();

Да?

И дополнительно при работе с ордерами. Там должны быть самые свежие данные. Открытие, закрытие, модификация.

 
Vinin писал(а) >>

И дополнительно при работе с ордерами. Там должны быть самые свежие данные. Открытие, закрытие, модификация.

так вот там все и стоит. Поэтому мне и не понятно зачем это делать в начале цикла?

 
Vinin писал(а) >>

RefreshRates() нужен при любом обращении к другим инструментам. А в твоем варианте эксперт зацикленный. И данные так просто обновляться не будут

Ошибка 4066

ERR_HISTORY_WILL_UPDATED 4066 Запрошенные исторические данные в состоянии обновления

означает что идет загрузка истории. Пока она не закончилась результаты нельзя принимать во внимание. Я обычно добавляю функцию контроля истории, которая просто запрашивает Клоуз всех инструментов. Если идет постоянное обращение, то ошибка 4066 не возникает. Только при первом запуске и после разрыва связи.

Vinin, можете сообщить код функции контроля истории?

 
bool CheckHistory(string lSymbol, int lTimeFrame){
  int err=GetLastEror();  
  double tmp=iClose(lSymbol,lTimeFrame,0);
  err=GetLastEror();  
  if (error=4066) return(false);
  return(true);
}
Что-то примерно так.
Причина обращения: