Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 763

 
Vitaly Muzichenko:

Parece que sim em ciclos, e pode prescindir da função

Obrigado.

No entanto, removida a função - os travões permanecem.... maldição.

 
Aleksey Vyazmikin:

Obrigado.

No entanto, removida a função - os travões permanecem.... Maldição.

Uma vez comecei a reescrever o programa de 4=>5, depois em 4, substituí todas as construções como Low[1], Time[0] e outras por outras modernas, ou seja,CopyLow,CopyTime, o programa tornou-se mais rápido mesmo em 4. Não utilizo agora construções antigas, apenas novas. Assim, o código é facilmente transportável para a plataforma 5ª, basta alterar as funções de negociação

 
Vitaly Muzichenko:

Assim que comecei a reescrever o programa de 4=>5 e depois substituí todas as construções como Low[1], Time[0] e outras por outras modernas, ou seja,CopyLow,CopyTime, o programa tornou-se mais rápido mesmo em 4. Não utilizo agora construções antigas, apenas novas. Assim, o código é facilmente transportável para a plataforma 5ª, basta alterar as funções de negociação

Opreenchimento da matriz em cada espirro não é um consumo de recursos?

Talvez faça sentido copiar a informação para a matriz na abertura do bar, e depois levá-la a partir daí à medida que o código se desdobra? Eu negoceio na abertura de bares.


 
Aleksey Vyazmikin:

Opreenchimento de uma matriz com cada espirro não consome recursos?

Talvez faça sentido copiar a informação para uma matriz quando uma barra abre e depois levá-la de lá à medida que o código avança? Eu negoceio na abertura de bares.

O conjunto pode ser preenchido numa nova barra, consumirá menos recursos. Se trabalhar com iLow[1] em vários locais, deve guardá-lo numa variável uma vez e lê-lo em vez da matriz.

Suponha que isto

// Инициализация TIME[0] TIME[1]
  ArraySetAsSeries(TM,true);
  if(CopyTime(dSymbol,Period(),0,2,TM)<0) return;
  TIME_0=TM[0];
  TIME_1=TM[1];
Depois trabalhamos com a variávelTIME_0 eTIME_1 em vez deTM[0] eTM[1].
 
Vitaly Muzichenko:

O Array pode ser enchido numa nova barra, serão necessários menos recursos. Se trabalhar com iLow[1] em vários locais, por exemplo, é desejável escrevê-lo uma vez numa variável, e ler a variável em vez da matriz.

Suponhamos que sim

Mas mesmo assim, o MT4 é muito mais rápido - estou desapontado.

 

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

Insectos, insectos, perguntas

Aleksey Vyazmikin, 2017.07.21 15:07

Porque estás a fantasiar? Compreendi a sua ideia, e confirmei que funciona, e terá efeito se o pedido for feito uma vez e se se souber quantas barras são necessárias para a EA funcionar.

Ou talvez tenha sugerido a utilização da estrutura de uma forma diferente? Então por favor explique, mas não se ofenda!


Sem fantasias. Se precisar de obter 2 ou mais parâmetros de um candelabro, então usando as funções das suas mensagens/perguntas teremos de chamar estas funções separadamente para cada parâmetro do candelabro. Ou seja, 2 ou mais vezes para produzir Copy***(), mas usando CopyRates() só é necessário uma chamada de Copy.

Quanto ao número a copiar, essa é outra questão. Talvez devêssemos primeiro calcular a barra que contém o valor do indicador requerido e depois copiá-la. Se bem me lembro, foi dito sobre uma quantidade desconhecida para copiar. De que tipo de fantasia estamos a falar?

Em casos extremos, podemos copiar, digamos, 10 barras e procurar entre elas. Se não for encontrado, copiamos outras 10 barras. A cópia é uma operação demorada, é mais barato copiar uma matriz.

Em geral, há muitas variações. Não se pode escrever tudo isso em documentação e não será mais documentação. Ensinam isto nas aulas de programação. Mas, infelizmente, nem todos os professores são capazes de o fazer e nem todos os alunos o querem compreender nas aulas. E o início é logo nas aulas de aritmética nos graus 2-5, quando o professor requer uma explicação detalhada do problema. Mas aqui os problemas são os mesmos.

 
Alexey Viktorov:

Nada de coisas extravagantes. Se precisar de obter 2 ou mais parâmetros de um candelabro, então utilizando as funções das suas mensagens/perguntas deve chamar estas funções separadamente para cada parâmetro de candelabro. Ou seja, 2 ou mais vezes para produzir Copy***(), mas utilizando CopyRates() precisará apenas de uma chamada de CopyRates().

Quanto ao número a copiar, essa é outra questão. Talvez devêssemos primeiro calcular em que barra está disponível o valor requerido do indicador, e depois copiá-lo. Se bem me lembro, foi dito sobre uma quantidade desconhecida para copiar. De que tipo de fantasia estamos a falar?

E, como último recurso, podemos copiar, digamos, 10 barras e pesquisar através delas e, se não o encontrarmos, copiamos outras 10 barras. A cópia é uma operação bastante dispendiosa; seria mais barato pesquisar através da matriz.

Há muitas variantes neste caso. Tudo isto não pode ser escrito na documentação; na verdade, não será mais documentação. Ensinam isto nas aulas de programação. Mas, infelizmente, nem todos os professores sabem como fazê-lo e nem todos os alunos o querem compreender nas aulas. E o início é logo nas aulas de aritmética nos graus 2-5, quando o professor requer uma explicação detalhada do problema. Mas aqui os problemas são os mesmos.

Sobre fantasia - foi uma resposta à sua afirmação "Em vez de tentar compreender o que foi dito, para descobrir o que se obtém, faz-se algumas objecções incríveis", e não ao facto de a versão que ofereceu ser do campo da fantasia.

Compreendo perfeitamente o seu conceito, e ele foi incorporado na resposta que lhe foi dada.

No entanto, não compreendo bem como se propõe trabalhar com uma quantidade desconhecida de dados - pode dar-me um exemplo sob a forma de código?


 

Por favor, ajude na auditoria e optimização do indicador usando este link https://www.mql5.com/ru/code/16805 - o problema é que o indicador começa a abrandar muito quando aparece um grande número de barras - ele aparece quando se testa.

Quero saber como fazê-lo funcionar para que não seja calculado em cada tick, mas apenas na abertura do bar? O método do Expert Advisor não é adequado - após o primeiro tique todos os valores desaparecem e aparecem apenas na barra seguinte...

Donchian Channel MTF
Donchian Channel MTF
  • votos: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin:

Sobre fantasia - foi uma resposta à sua afirmação "Em vez de tentar compreender o que foi dito, para descobrir o que funcionaria, são lançadas algumas objecções incríveis", e não que a opção que propôs seja do reino da fantasia.

Compreendo perfeitamente o seu conceito, e ele foi incorporado na resposta que lhe foi dada.

Contudo, não compreendo bem como se propõe lidar com uma quantidade desconhecida de dados - pode dar-me um exemplo sob a forma de código?


A resposta foi dada antes...

Alexey Viktorov:

Como último recurso, pode copiar, digamos, 10 barras de cada vez e procurá-la. Se não a encontrar, copia outras 10 barras de cada vez. A cópia é uma operação dispendiosa, é mais barato pesquisar através da matriz.

Mas é melhor não tentarmos obter o número máximo de barras da matriz, mas tentarmos fazer com uma cópia.

Não vou escrever uma amostra de código. Um programador normal só precisa de uma dica. Aqui está um algoritmo de amostra:

  1. Determinar o número aproximado de barras em que o canal é atravessado. Que seja 15.
  2. Copiar ambos os amortecedores do indicador.
  3. Copiar os valores das barras usando CopyRates()
  4. No laço, começamos a comparar os valores do limite superior do canal e as barras altas simultaneamente com a comparação das barras baixas com o limite inferior do canal. Se uma destas passagens for encontrada, o índice de barras é armazenado numa variável, e continuamos a procurar a segunda passagem. Saímos do laço quando ambas as variáveis das barras de intersecção têm valores.

Assim, é possível encontrar duas intersecções numa cópia e um ciclo, se necessário. Não há sequer necessidade no ArraySetAsSeries() porque ao encontrar a travessia é possível e, na minha opinião, é melhor lembrar a hora do bar e não o seu número. Embora, conhecendo a hora do bar, não haja dificuldade em determinar o seu número.

Pergunta: O que é mais rápido, um ciclo com cópia do buffer do indicador por 1 valor e cópia da barra alta por 1 e comparação desses valores ou uma única cópia de um determinado montante e comparação dos valores das duas matrizes um com o outro?

 

Escrevi isto ontem mesmo:

Tarefa:

em cada tick obter elementos "InpCountCopy" abertos, altos, baixos, fechados e tempo.

Implementação:

  1. loop de "0" a "InpCountCopy-1" - o loop recebe um aberto, alto, baixo, fechado e de cada vez.
  2. De uma vez, obtemos elementos "InpCountCopy" na estrutura MqlRates e depois fazemos um loop através da estrutura.

Características:

Pode escolher como verificar: em OnTick ou em OnTimer (1 segundo).

//+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameter
input int InpCountCopy=1000;
input bool OnTickOnTimer=false; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(OnTickOnTimer)
      EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start=GetMicrosecondCount();
   for(int i=0;i<InpCountCopy;i++) // in one operation we get one element.
     {
      double open=iOpen(i);
      double high=iHigh(i);
      double low=iLow(i);
      double close=iClose(i);
      datetime time=iTime(i);
     }
   ulong end=GetMicrosecondCount()-start;
   string text=(OnTickOnTimer)?"OnTimer":"OnTick";
   text=text+"\n"+"OHLC: "+IntegerToString(end);

//--- for one operation we get "InpCountCopy" elements.
   start=GetMicrosecondCount();
   MqlRates Rates[];
   if(!iRates(Rates,0,InpCountCopy))
      return;
   for(int i=0;i<InpCountCopy;i++)
     {
      double open=Rates[i].open;
      double high=Rates[i].high;
      double low=Rates[i].low;
      double close=Rates[i].close;
      datetime time=Rates[i].time;
     }
   end=GetMicrosecondCount()-start;
   text=text+"\n"+"Rates: "+IntegerToString(end);

   Comment(text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied==1)
      open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied==1)
      high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied==1)
      low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied==1)
      close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied==1)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates(MqlRates  &Rates[],const int index,int count,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   int copied=CopyRates(symbol,timeframe,index,count,Rates);
   if(copied!=count)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


Arquivos anexados: