https://www.mql5.com/ru/docs/marketinformation/symbolstotal
https://www.mql5.com/ru/docs/marketinformation/symbolname
https://www.mql5.com/ru/docs/indicators/ima
В цикле перебирать символы из обзора рынка, загрузить индикаторы, скопировать его данные, сравнивать, выгрузить индикаторы и т.д.Я близок к своей цели, но не знаю, как запустить индикатор для нескольких активов одновременно.
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; } //+------------------------------------------------------------------+
Я близок к своей цели, но не знаю, как запустить индикатор для нескольких активов одновременно.
handle сначала создается, а потом используется. У Вас же все наоборот - используете handle, который еще не создан.
Да и непонятно, зачем постоянно создавать handle и сразу же освобождать его. Создайте массив handle в OnInit() и освободите его уже в OnDeinit().
Создайте массив handle в OnInit() и освободите его уже в OnDeinit().
Предполагаю, что такой скринер может прикончить машину. Не пробовал такое с индикаторами.
Предполагаю, что такой скринер может прикончить машину. Не пробовал такое с индикаторами.
Пробовал мтс/мтф панель по пяти индикаторам, создавая массивы хендлов.
Жутчайше подвисает при загрузке если символов более 20-ти и всего три ТФ, при этом логирование показывает что ОнИнит со всем созданием хендлов выполняется максимум за 2 сек. А отвисает потом более минуты.
Не знал уже на что грешить. Неужели как-то может быть связано с создаваемыми хендлами?
Предполагаю, что такой скринер может прикончить машину. Не пробовал такое с индикаторами.
Пробовал мтс/мтф панель по пяти индикаторам, создавая массивы хендлов.
Жутчайше подвисает при загрузке если символов более 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; } }
На стадии тестирования все работает. Конечно, медленно, особенно на всех тиках, но что поделать.
1000 инструментов x 3 тайм-фрейма x 3 индикатора = 9000 хендлов (только индикаторных):
Мне сложно архитектурно представить, как это может не тормозить.
1000 instrumentos x 3 intervalos de tempo x 3 indicadores = 9000 alças (apenas indicador):
(clique para reproduzir o vídeo)
Без сомнения, продукт, который вы разработали, лучший на рынке, он очень быстрый. Очень круто, это самое лучшее! Но у меня нет денег, чтобы его купить, и я просто хочу часть этого решения, поэтому я пытаюсь создать его. Но пока что я делал очень медленно, очень плохо.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Мне нужна была помощь в создании скринера. Идея состоит в том, чтобы посмотреть на все товары на рынке и увидеть, у каких из них короткое среднее значение выше среднего длинного. Я не знаю, как выполнить эту проверку нескольких файлов