Erros, bugs, perguntas - página 1936

 
Aleksey Vyazmikin:

Ainda não está pronto para mostrar o código devido a

Mas pronto para mostrar os resultados de perfis do MT5 - como entendo as funções de negociação estão fora de questão.



Para ambiente OHLC utilizo as seguintes funções

Talvez eu esteja a fazer algo de errado?

Infelizmente, está a fazer tudo mal.

Em vez de escrever um código MQL5 nativo e eficiente, usa-se um emulador MQL4 terrivelmente ineficiente que abranda a operação dezenas de vezes.

O mau é que nem sequer se sabe o que se está a fazer, uma vez que se está a fazer perguntas sobre velocidade.
 
Aleksey Vyazmikin:

o resultado é o seguinte código

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • votos: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

Obrigado - já vi esta biblioteca - a descrição era confusa


A maior parte do tempo é gasto na fase de inicialização. A menos que pretenda aceder aos dados das séries cronológicas várias vezes - mais de alguns milhares de vezes durante a formação dos bares - deverá considerar métodos alternativos.

O meu Expert Advisor só trabalha na abertura de bares - acha que faz sentido experimentá-lo?
 
Renat Fatkhullin:

Infelizmente, está a fazer tudo mal.

Em vez de escrever um código MQL5 nativo e eficiente, usa-se um emulador MQL4 terrivelmente ineficiente, o que abranda a operação dezenas de vezes.

O mau é que nem sequer compreende o que está a fazer, uma vez que está a fazer perguntas sobre velocidade.

É claro que estava à procura de uma solução - como substituir as funções MQL4 por MQL5, particularmente no que respeita às séries cronológicas, e vi que este é um dos problemas encontrados pela maioria das pessoas que se mudam para MQL5.

Assim, encontrei a solução no mesmo website, onde um dos artigos recomendou o meu método.

Pessoalmente, não compreendo a razão para excluir uma boa e útil função da língua.

Então a minha pergunta é, qual é a forma correcta de receber informação, e como pode tirar vantagens da MQL5?

 
Aleksey Vyazmikin:

Assim, a minha pergunta é: como organizar correctamente a recepção de dados para sentir as vantagens da MQL5?

Utilizar as funções nativas, mais produtivas da MQL5, e não se agarrar ao código MQL4. Qualquer conversor/splitter MQL4 -> MQL5 tem um desempenho dezenas de vezes mais lento, uma vez que tenta imitar as microfunções de acesso directo da MQL4 através de operações a granel MQL5. E a emulação é feita completamente sem optimização e caching.

Na raiz da utilização de uma determinada função (um pouco de código, incluindo o código de outras pessoas), deve haver uma compreensão do que está exactamente a ser feito. Caso contrário, obtém-se "Acabei de usar o código de outra pessoa e a velocidade desceu! Não se pode obter um bom resultado sem compreender a ferramenta e o que se está a fazer com ela.


Para além de "como fazê-lo correctamente", devo esclarecer que a tarefa de "aprender a programar" é extremamente difícil, assim que se ultrapassa o nível mais básico de operar (nem sequer compreender, nomeadamente operar) com uma língua. Assim, não vejo outra forma de aprender a não ser lendo massas de artigos, documentação, código pronto na biblioteca e prática obrigatória durante vários anos.
 
Renat Fatkhullin:

Utilizar as funções nativas, mais produtivas, da linguagem MQL5 e não se agarrar ao código MQL4.

Na raiz da utilização de uma determinada função (um pedaço de código, incluindo o código de outras pessoas) deve estar uma compreensão do que está a ser feito. Caso contrário, obtém-se "Acabei de usar o código de outra pessoa, olha - a velocidade está baixa! Sem compreender a ferramenta e o que está a fazer com ela, não se pode obter um bom resultado.


Além de "como fazê-lo correctamente", devo esclarecer que a tarefa de "aprender a programar" é extremamente difícil, uma vez que se ultrapassa o nível mais básico de operar (nem sequer compreender, mas operar) com a língua. Assim, não vejo outra forma de aprender a não ser lendo artigos, documentação, código pronto na biblioteca e alguns anos de prática obrigatória.

Renat, já olhou para a base de códigos? Tenho algum código com funções adaptadas da MQL4.

Peço-lhe especificamente que escreva como obter a informação certa sobre o ambiente - a referência a livros abstractos não é produtiva e apenas reforça a minha (provavelmente errada) ideia de que esta é apenas uma desculpa que não pode verificar.

Dizer que sou tão burro que não compreendo o significado de uma função, que é copiar informação para uma matriz, é dizer que a documentação de acompanhamento de uma linguagem de programação é de um nível baixo. Não compreendo o benefício desta cópia de uma matriz para outra e porque é que uma função que obtém informação de uma matriz conforme necessário é um código terrível.

 
Aleksey Vyazmikin:

Claro que estava à procura de uma solução - como substituir as funções MQL4 por MQL5, referindo-me particularmente às séries cronológicas, e vi que este era um dos problemas encontrados pela maioria das pessoas que se mudam para MQL5.

Assim, encontrei a solução no mesmo website, onde um dos artigos recomendou o meu método.

Pessoalmente, não compreendo a razão para excluir uma boa e útil função da língua.

É por isso que lhe estou a perguntar, qual é a forma correcta de receber informação para eu sentir as vantagens da MQL5?

Talvez eu tenha procurado mal? Aqui tem tudo o que precisa, em vez de todo este código, numa só cópia

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Erros, Erros, Perguntas

Aleksey Vyazmikin, 2017.07.21 01:20

Obrigado - corrigiu-o.

Como resultado, o código é o seguinte

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

O tempo no testador aumentou - já cansado de esperar :)

Para poder utilizá-lo, basta compreender qual é a estrutura

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Talvez eu não estivesse a procurar o suficiente? Aqui, numa cópia, recebe tudo o que precisa em vez de todo este código

Para utilizar isto, tudo o que tem de fazer é compreender qual é a estrutura



Temos a mesma coisa - na verdade...

A variante que sugere fatos, ifle:

- O cálculo só tem lugar na abertura de um bar.

- Sabe com antecedência quantos bares são necessários

Tenho loops no meu código, o montante do cálculo pode ser desconhecido de antemão.

E, qual é o sentido em copiar informação para, digamos, 300 barras cada vez que a abrimos, se seria mais razoável simplesmente adicionar informação sobre uma nova barra - porque é que o promotor não foi por este caminho?

 
Lamento, mas não tenho absolutamente nenhum tempo para lidar com o ensino de programação a todos os principiantes. Especialmente quando se vê que a pessoa nem sequer passou pelos princípios básicos da compreensão da programação e pede coisas triviais.


Mas vou mostrar-vos a direcção:

  1. Documentação da MQL5
  2. Codebase
  3. Artigos
  4. Fórum (não no modo "escreva para mim, porque não me ensina e faz o meu trabalho")
  5. Freelance (podem escrevê-lo correctamente aqui)
  6. Trabalho independente com análise atenta de "porque é que este invólucro deveria abrandar e desperdiçar recursos, talvez reescrever de forma óptima"?
  7. Utilizando um profiler que mostra o consumo real de recursos em cada linha de código
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

Não tenho qualquer desejo de comunicar desta forma. Em vez de se tentar compreender o que está a ser dito, para se perceber o que vai acontecer, são rejeitadas algumas objecções incríveis.