Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 1288
- Avaliação:
- Publicado:
- 2017.08.24 13:14
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
Um dos principais problemas com MQL5 é a remoção de funções internas para trabalhar com TimeSeries. A pesar de que esta abordagem expandiu as possibilidades de desenvolvimento, também desacelerou o trabalho por causa das etapas obrigatórias para criar e excluir novos locais de memória cada vez que você quiser acessar os dados de séries temporais.
... if(CopyTime(symbol,timeframe,time,1,checkcandle)==1) { ...
Consideremos o popular algoritmo iBarShift. Para retornar o índice da barra segundo a data e tempo, primeiro devemos chamar a função ::CopyTime(...), que cria uma matriz dinâmica, altera seu tamanho, copia dados, e, em seguida, remove tudo da memória. Isso não é um problema para algumas chamadas individuais, mas, como as funções de séries temporais geralmente são chamadas mais do que algumas vezes em timeframes diferentes, a essa sobrecarga de memória pode somar-se, portanto, uma desaceleração significativa do programa. Imagine por um momento todos os potenciais recursos desperdiçados para a alocação de novos locais de memória, cada vez que o programa chama esse tipo de métodos usando dados do TimeSeries.
Para acelerar as coisas, a biblioteca apresentada implementa as classes da biblioteca padrão CObject e CArrayObj, a fim de copiar a matriz de dados uma vez, e, a seguir, novamente acessá-las desde todas as chamadas de TimeSeries para esse símbolo e período específicos. No entanto, esta é uma faca de dois gumes, porque a fase de inicialização dura mais do que uma implementação convencional. Todas as chamadas subsequentes podem acessar dados em cerca de 1/100 do tempo. No exemplo iBarShift(), este novo algoritmo é mais rápido criando uma matriz int[], que armazena a variável, isto é, o índice da barra e, em seguida, chama-o usando o time (para o tipo int) como endereço da matriz. Em outras palavras, você carrega o time como um endereço direto para acessar os dados.
Duas advertências importantes:
A maior parte do tempo é consumido durante a fase de inicialização.. Se você não planeja acessar os dados de séries temporais mais de alguns milhares vezes por barra, você deve considerar um método alternativo.
Os objetos da classe CiTimeSeries estão configurados para atualizar automaticamente os dados armazenados quando uma nova barra é formada. Definir este parâmetro como "false" colocará o objeto no modo de alto desempenho, que permite executar rapidamente chamadas com importantes "pontos quentes", porém, no ciclo posterior manutenção requer uma atualização manual.
Exemplo:
#include <itimeseries_nicholishen.mqh> //--- declaração global do objeto iTimeSeries CiTimeSeries iBar; int OnInit() { //--- fase de inicialização iBar.Init( NULL, PERIOD_CURRENT, false // atualização automática ); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(hot_path_operations) { // пример index = iBar.Shift(time); } else if(maintenance_path_operations) { iBar.Refresh(); } }
Além disso, você pode chamar diretamente funções globais (como em MQL4), sem criação da instância CiTimeSeries, mas, inicialmente, o acesso será lento, porque é necessário inicializar o objeto global no trabalho "em segundo plano" do programa. Usando a biblioteca, essa maneira pode ser mais lenta se você chamar apenas uma função do TimeSeries várias vezes. No entanto, existe uma vantagem quanto a desempenho quando seu algoritmo precisa chamar mais do que alguns milhares de iterações de dados da série temporal do mesmo símbolo e período definido.
O desenvolvedor do mais algoritmo popular atualmente, isto é, o iBarShift, realizou um teste comparativo para ele, que você pode encontrar aqui https://www.mql5.com/en/code/1864.
Uma vez que este era o método mais preciso e mais rápido (no momento desta publicação), eu decidi usá-lo como referência para testes.
O tempo de computação de 100 000 chamadas de função diretas (globais) é 50 vezes mais rápido do que o método mais rápido atualmente disponível, ao chamar o método público após a inicialização no "modo de desempenho" é 100 mais rápido.
Métodos publicamente disponíveis e funções globais:
Nota: as funções globais são as mesmas que no MetaTrader 4 , ou seja, iBarShift, iTime, etc.
//--- inicializa um símbolo e período; definir Auto-refresh como false para o modo de desempenho bool Init(string symbol=NULL, ENUM_TIMEFRAMES period = PERIOD_CURRENT, const bool autoRefresh = true ); //--- inicializa um símbolo e período da matriz ENUM_TIMEFRAMES; definir Auto-refresh como false para o modo de desempenho bool Init(string symbol, ENUM_TIMEFRAMES &period[], const bool autoRefresh = true );
//--- inicializa todos os períodos bool InitAllPeriods ( string symbol = NULL, const bool autoRefresh=true);
//--- definir auto-refresh como false para controlar dados manualmente void AutoRefresh(const bool ref) { m_autoRefresh=ref; } bool AutoRefresh() const { return m_autoRefresh; }
//--- chamada de atualização manualmente; atualiza os dados de todos os períodos inicializados bool Refresh();
CRatesArray *GetArrayObjPointer(string symbol, ENUM_TIMEFRAMES period);
- .Open = iOpen https://docs.mql4.com/series/iopen
- .High = iHigh https://docs.mql4.com/series/ihigh
- .Low = iLow https://docs.mql4.com/series/ilow
- .Close = iClose https://docs.mql4.com/series/iclose
- .Highest = iHighest https://docs.mql4.com/series/ihighest
- .Lowest = iLowest https://docs.mql4.com/series/ilowest
- .Volume = iVolume https://docs.mql4.com/series/ivolume
- .BarsTotal = iBars https://docs.mql4.com/series/ibars
- .Time = iTime https://docs.mql4.com/series/itime
- .Shift = iBarShift https://docs.mql4.com/series/ibarshift
Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/18305

Esperamos que TP ou SL se executem, e, após isto, abrimos uma posição na direção oposta. Verifica se há fundos suficientes antes da abertura de posição. OnTradeTransaction.

Tamanho da barra. O tamanho da vela é calculado pela fórmula: "minuendo" menos "subtraendo".

Dois histogramas - numa janela - que mostram os desvios médios máximos (do preço em relação ao valor inicial) medidos em pontos.

Indicador TotalPowerIndicatorX com possibilidade de alterar o timeframe do indicador nos parâmetros de entrada.