Помощь в создании скринера

 
Здравствуйте друзья


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



 

https://www.mql5.com/ru/docs/marketinformation/symbolstotal

https://www.mql5.com/ru/docs/marketinformation/symbolname

https://www.mql5.com/ru/docs/indicators/ima

https://www.mql5.com/ru/docs/series/copybuffer

https://www.mql5.com/ru/docs/series/indicatorrelease

В цикле перебирать символы из обзора рынка, загрузить индикаторы, скопировать его данные, сравнивать, выгрузить индикаторы и т.д.
 

Я близок к своей цели, но не знаю, как запустить индикатор для нескольких активов одновременно.


input group              "Configurações dos Ativos Monitorados"
input string             Ativos_bens_consumo ="PETR4,MGL3"; //Bens de Consumo
input string             Ativos_energia      ="PETR4,MGL3"; //Energia
input string             Ativos_fiis         ="PETR4,MGL3"; //Fundos imobiliários
input string             Ativos_financeiros  ="PETR4,MGL3"; //Financeiros
input string             Ativos_imobiliario  ="PETR4,MGL3"; //Imobiliário
input string             Ativos_mat_Basico   ="PETR4,MGL3"; //Material Básico
input string             Ativos_util_Publica ="PETR4,MGL3"; //Utilidade Pública


input group              "Configurações do IFR"
input int                Periodo        = 2;           // Período
input ENUM_APPLIED_PRICE Preco          = PRICE_CLOSE; // Preço Aplicado
input double             LimiteSup      = 70;          // Limite Superior
input double             LimiteInf      = 25;          // Limite Inferior

string sep=",";
ushort u_sep;
string Lista01_Ativos_bens_consumo[];
string Lista02_Ativos_energia[];
string Lista03_Ativos_fiis[];
string Lista04_Ativos_financeiros[];
string Lista05_Ativos_imobiliario[];
string Lista06_Ativos_mat_basico[];
string Lista07_Ativos_util_publica[];

int handle, Lista01, Lista02, Lista03, Lista04, Lista05, Lista06, Lista07;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   u_sep=StringGetCharacter(sep,0);
   Lista01=StringSplit(Ativos_bens_consumo,u_sep,Lista01_Ativos_bens_consumo);
   Lista02=StringSplit(Ativos_energia,u_sep,Lista02_Ativos_energia);
   Lista03=StringSplit(Ativos_fiis,u_sep,Lista03_Ativos_fiis);
   Lista04=StringSplit(Ativos_financeiros,u_sep,Lista04_Ativos_financeiros);
   Lista05=StringSplit(Ativos_imobiliario,u_sep,Lista05_Ativos_imobiliario);
   Lista06=StringSplit(Ativos_mat_Basico,u_sep,Lista06_Ativos_mat_basico);
   Lista07=StringSplit(Ativos_util_Publica,u_sep,Lista07_Ativos_util_publica);
     
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=0; i<Lista01; i++)
     {

      string ativo = Lista01_Ativos_bens_consumo[i];
      int resultado = Sinal();
      handle = iRSI(ativo, _Period, Periodo, Preco);
      string rfi_info = "";

      if(resultado == 1)
        {
         rfi_info = "Buy";
         Print("Symbol: ",ativo,", Signal IFR: ", rfi_info);
        }
      if(resultado == -1)
        {
         rfi_info = "Sell";
         Print("Symbol: ",ativo,", Signal IFR: ", rfi_info);
        }
        
        IndicatorRelease(handle);

     }
   Sleep(_Period*60000);
  }

//+------------------------------------------------------------------+
int Sinal()
  {

   double ifr[];

   ArraySetAsSeries(ifr, true);
   CopyBuffer(handle, 0, 1, 2, ifr);

   if(ifr[1] >= LimiteInf  && ifr[0] < LimiteInf)
      return 1;
   if(ifr[1] < LimiteSup && ifr[0] > LimiteSup)
      return -1;

   return 0;
  }
//+------------------------------------------------------------------+
 
diegotfcastro:

Я близок к своей цели, но не знаю, как запустить индикатор для нескольких активов одновременно.


handle сначала создается, а потом используется. У Вас же все наоборот - используете handle, который еще не создан. 

Да и непонятно, зачем постоянно создавать handle и сразу же освобождать его. Создайте массив handle в OnInit() и освободите его уже в OnDeinit().

 
Ihor Herasko:

Создайте массив handle в OnInit() и освободите его уже в OnDeinit().

Предполагаю, что такой скринер может прикончить машину. Не пробовал такое с индикаторами.

 
fxsaber:

Предполагаю, что такой скринер может прикончить машину. Не пробовал такое с индикаторами.

Пробовал мтс/мтф панель по пяти индикаторам, создавая массивы хендлов.

Жутчайше подвисает при загрузке если символов более 20-ти и всего три ТФ, при этом логирование показывает что ОнИнит со всем созданием хендлов выполняется максимум за 2 сек. А отвисает потом более минуты.

Не знал уже на что грешить. Неужели как-то может быть связано с создаваемыми хендлами?

 
fxsaber:

Предполагаю, что такой скринер может прикончить машину. Не пробовал такое с индикаторами.

Aleksey Mavrin:

Пробовал мтс/мтф панель по пяти индикаторам, создавая массивы хендлов.

Жутчайше подвисает при загрузке если символов более 20-ти и всего три ТФ, при этом логирование показывает что ОнИнит со всем созданием хендлов выполняется максимум за 2 сек. А отвисает потом более минуты.

Не знал уже на что грешить. Неужели как-то может быть связано с создаваемыми хендлами?

1000 инструментов x 3 тайм-фрейма x 3 индикатора = 9000 хендлов (только индикаторных):

клик для проигрывания видео 

(клик для проигрывания видео)

 

Как раз делаю мультисоветник по индюку. 

Во внешних переменных список инструментов:

input string workPairs = "EURUSD, GBPUSD, EURJPY, USDCAD, USDJPY, GBPJPY, EURGBP, AUDCHF, USDCHF, AUDUSD, AUDJPY, CHFJPY, EURAUD, EURCAD, EURCHF, GBPAUD, GBPCHF, NZDUSD, AUDCAD, AUDNZD";//Work Pairs

Потом этот список загоняю в объявленный динамический массив arrayPairMud   (в OnInit):

int OnInit()
  {
   Comment("");
   ResetLastError();
//--- выделим память для массива
   ArrayResize(arrayPair,300);

   k = StringSplit(workPairs,StringGetCharacter(znak,0),arrayPairMud);
   u_sep = StringGetCharacter(znak,0);
   int ind = 0;
   string pairs="";

   int c = 0;
   for(int i=0; i<k; i++)
     {
      string find=" ";
      string replacemen="";
      StringReplace(arrayPairMud[i],find,replacemen);//удаляем пробелы в именах символов

      string thisPair = arrayPairMud[i];
      StringReplace(thisPair," ","");

      if(SymbolInfoDouble(thisPair,SYMBOL_BID) <= 0 || thisPair == "")  // проверка на существование символа
        {
         Print(thisPair, " symbol does not exist or is not in the Market Watch.");
         continue;
        }

      arrayPair[ind] = thisPair;   //в этот массив заносим очищенные от пробелов и существующие имена символов
      ind++;
     }
   ArrayResize(arrayPair,ind);

   ArrayResize(TMA_handle,ArraySize(arrayPair));
   for(int i = 0; i<ArraySize(arrayPair); i++) // В массив TMA_handle заносим хендлы индикатора TMA
     {
      Print(i, ": ", arrayPair[i]);
      TMA_handle[i]=iCustom(arrayPair[i],workTF,"::Indicators\\Extreme_TMA_line_indicator.ex5",InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw);
      //--- если произошла ошибка при создании объекта, то выводим сообщение
      if(TMA_handle[i]<0)
        {
         Print("Object not created: ", i, ". ERROR: = ",GetLastError());
         //--- принудительное завершение программы
         return(-1);
        }
     }
   return(INIT_SUCCEEDED);
  }

Получаем массив хэндлов, где индекс хендла в массиве соотносится  с индексом торгового инструмента, для которого собственно потом вытаскваем данные индикатора.

В OnTick() потом уже заполняем массивы данными индикатора. Привожу рыбу:

 for(int i=0; i<ArraySize(arrayPair); i++)
     {
      string thisPair = arrayPair[i];

      if(SymbolInfoDouble(thisPair,SYMBOL_BID) <= 0 || thisPair == "")
         continue;  // проверка на существование символа

      if(!CopyBufferAsSeries(TMA_handle[i],0,0,InpPeriodATR+1,true,Middle))
        {
         Print("Write error MiddleGray. ERROR: ", GetLastError());
         continue;
        }

      if(!CopyBufferAsSeries(TMA_handle[i],2,0,InpPeriodATR+1,true,Upline))
        {
         Print("Write error Upline. ERROR: ", GetLastError());
         continue;
        }

      if(!CopyBufferAsSeries(TMA_handle[i],3,0,InpPeriodATR+1,true,Dwline))
        {
         Print("Write error Dwline. ERROR: ", GetLastError());
         continue;
        }
}

На стадии тестирования все работает. Конечно, медленно, особенно на всех тиках, но что поделать.

 
Andrey Khatimlianskii:

1000 инструментов x 3 тайм-фрейма x 3 индикатора = 9000 хендлов (только индикаторных):

Мне сложно архитектурно представить, как это может не тормозить.

 
Не обязательно делать это в индикаторе, можно в эксперте и не будет виснуть.
 
Andrey Khatimlianskii:

1000 instrumentos x 3 intervalos de tempo x 3 indicadores = 9000 alças (apenas indicador):

(clique para reproduzir o vídeo)

Без сомнения, продукт, который вы разработали, лучший на рынке, он очень быстрый. Очень круто, это самое лучшее! Но у меня нет денег, чтобы его купить, и я просто хочу часть этого решения, поэтому я пытаюсь создать его. Но пока что я делал очень медленно, очень плохо.