Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Telegram!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

Biblioteca de alto desempenho iTimeSeries - biblioteca para MetaTrader 5

Visualizações:
1166
Avaliação:
(34)
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.

AV Benchmark

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.

New Benchmark

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);

Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/18305

cheduecoglioni cheduecoglioni

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.

Size of candles (text) Size of candles (text)

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

CandleRange CandleRange

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

TotalPowerIndicatorX_HTF TotalPowerIndicatorX_HTF

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