Discussão do artigo "LifeHack para traders: preparemos "fast-food" de indicadores"

 

Novo artigo LifeHack para traders: preparemos "fast-food" de indicadores foi publicado:

Se você estiver mudando para MQL5 agora, você vai precisar deste artigo, porque, por um lado, o acesso aos dados dos indicadores e às séries é realizado na nossa conhecida linguagem MQL4, por outro lado, toda a realização é escrita em MQL5. Todas as funções são o mais claras quanto possível e são perfeitamente adequadas para a depuração passo a passo.

Eu inseri "Comment" exclusivamente para verificação. No testador, pode-se confrontar o trabalho iniciando "MACD MQL4 style EA short.mq5", em modo visual, e colocando o cursor na barra com o índice #1:

"MACD MQL4 style EA short.mh5" in tester

Fig. 1. "MACD MQL4 style EA short.mh5" in tester

Autor: Vladimir Karputov

 

Ótimo...

 

O artigo é um pequeno extrato de outro. Nada foi feito para que ele funcione de forma eficiente. Não há armazenamento em cache de indicadores e séries temporais. Não há High[i], Low[i], etc. Nada de iCustom.

Esperava-se ver algo completamente diferente. Além disso, qual é o objetivo do fast food nos Expert Advisors, se ele nem sequer está nos códigos-fonte?

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // seleciona a posição por índice para acesso posterior às suas propriedades
         if(m_position.Symbol()==m_symbol.Name())
           {
            //--- a posição longa é aberta
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- ela deve ser fechada?
               if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
                  MacdCurrent>(MACDCloseLevel*m_adjusted_point))
                 {
                  //--- fechar a posição e sair
                  if(!m_trade.PositionClose(m_position.Ticket()))
                     Print("PositionClose error ",m_trade.ResultRetcodeDescription());
                  return;
                 }
               //--- verificar o trailing stop
               if(TrailingStop>0)
                 {
                  if(m_position.PriceCurrent()-m_position.PriceOpen()>m_adjusted_point*TrailingStop)
                    {
                     if(m_position.StopLoss()<m_symbol.Bid()-m_adjusted_point*TrailingStop)
                       {
                        //--- modificar a posição e sair
                        if(!m_trade.PositionModify(m_position.Ticket(),
                           m_symbol.NormalizePrice(m_position.PriceCurrent()-m_adjusted_point*TrailingStop),
                           m_position.TakeProfit()))
                           Print("PositionModify error ",m_trade.ResultRetcodeDescription());
                        return;
                       }
                    }
                 }
              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- ela deve ser fechada?
               if(MacdCurrent<0 && MacdCurrent>SignalCurrent && 
                  MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*m_adjusted_point))
                 {
                  //--- fechar a posição e sair
                  if(!m_trade.PositionClose(m_position.Ticket()))
                     Print("PositionClose error ",m_trade.ResultRetcodeDescription());
                  return;
                 }
               //--- verificar o trailing stop
               if(TrailingStop>0)
                 {
                  if((m_position.PriceOpen()-m_position.PriceCurrent())>(m_adjusted_point*TrailingStop))
                    {
                     if((m_position.StopLoss()>(m_symbol.Ask()+m_adjusted_point*TrailingStop)) || (m_position.StopLoss()==0.0))
                       {
                        //--- modificar a posição e sair
                        if(!m_trade.PositionModify(m_position.Ticket(),
                           m_symbol.NormalizePrice(m_symbol.Ask()+m_adjusted_point*TrailingStop),
                           m_position.TakeProfit()))
                           Print("PositionModify error ",m_trade.ResultRetcodeDescription());
                        return;
                       }
                    }
                 }
              }
           }
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
fxsaber:

O artigo é um pequeno extrato de outro. Nada foi feito para que ele funcione de forma eficiente. Não há armazenamento em cache de indicadores e séries temporais. Não há High[i], Low[i], etc. Nada de iCustom.

Esperava-se ver algo completamente diferente. Além disso, qual é o objetivo do fast food nos Expert Advisors, se ele nem sequer tem cheiro nas fontes?


Aqui está um exemplo de um típico MQL4-ca - sem ler ou olhar o código, você vai direto para o pódio com bandeiras :) .

 
Vladimir Karputov:

Aqui está um exemplo de um típico MQL4-ca - sem ler, sem olhar o código, direto para o pódio com bandeiras :) .

Antes de comentar, li não apenas o texto do artigo, mas também todas as fontes anexas (incluindo a análise de IndicatorsMQL4.mqh VS IndicatorsMQL5.mqh).

 
fxsaber:

Antes de comentar, você leu não apenas o texto do artigo, mas também todas as fontes anexas (incluindo a análise de IndicatorsMQL4.mqh VS IndicatorsMQL5.mqh).


Você deve ter dado uma olhada (perdida) no arquivo MQL5\Include\SimpleCall\Series.mqh.

Sobre o armazenamento em cache - essas são suas suposições pessoais (expectativas).

Este artigo não tem a intenção de enganar os usuários de MQL4 com "conecte meu arquivo e você pode continuar a trabalhar sem pensar no estilo de MQL4", ele mostra como transferir a abordagem antiga na abordagem de indicadores para MQL5.

 
Vladimir Karputov:

Você deve ter esquecido o arquivo MQL5\Include\SimpleCall\Series.mqh.

Leia-o com atenção. Onde está High[i], etc.?

Sobre o armazenamento em cache - essas são suas suposições pessoais (expectativas).

Este artigo não tem a intenção de enganar os usuários de MQL4 com "conecte meu arquivo e você pode continuar a trabalhar sem pensar no estilo de MQL4", ele mostra como transferir a abordagem antiga na abordagem de indicadores para MQL5.

Onde está o iCustom? Você, sem pensar, quase copiou e colou uma parte de outro artigo e obteve uma falha no desempenho. Na verdade, enganando os usuários de que esse é o custo do estilo MQL4, não da sua implementação.

Aqui você tem medições de desempenho que mostram que o estilo MQL4 não é inferior ao MQL5 em alguns aspectos. Você poderia fazer o mesmo com os indicadores.

Aqui está uma das realizações de séries temporais. Você pode ver que o autor fez um esforço, enfatizando o desempenho e se afastando do estilo MQL4 (você pode refinar a ideia, se quiser).

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • votos: 25
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Одной из основных проблем с MQL5 до сих пор было удаление встроенных функций для работы с таймсериями. Несмотря на то, что такой подход расширил для программистов возможности разработки, он также замедлил работу из-за обязательного шага по созданию и удалению новых ячеек памяти каждый раз, когда требуется доступ к данным таймсерии.  Рассмотрим...
 
fxsaber:

Leia com atenção. Onde está o High[i], etc.?

Onde está o iCustom? Sem pensar, você quase copiou e colou uma parte de outro artigo e obteve uma falha no desempenho. Na verdade, enganando os usuários de que esse é o custo do estilo MQL4, não da sua implementação.

Aqui você tem medições de desempenho que mostram que o estilo MQL4 não é inferior ao MQL5 em alguns aspectos. Você poderia fazer o mesmo com os indicadores.

Aqui está uma das realizações de séries temporais. Você pode ver que o autor tentou enfatizar o desempenho e se afastou um pouco (é mais conveniente para ele) do estilo MQL4 (você pode refinar a ideia se quiser).


Para se acostumar com a MQL5 mais rapidamente, apenas as funções iXXXX de séries foram deixadas, pois elas têm parâmetros mais completos (símbolo, período de tempo, deslocamento), que substituirão facilmente as funções High[], etc., mais altamente especializadas. O objetivo não é que o usuário continue a usar a MQL4 sem pensar, mas que comece a reescrever lentamente seu código MQL4.

O iCustom nem sequer estava nos planos - apenas os indicadores padrão foram considerados.

Sobre o armazenamento em cache - isso definitivamente não está no artigo para o público em geral.


Adicionado: a propósito, o feedback dos usuários deixará claro se High[] e funções semelhantes são necessárias ou se podemos dispensar a série iXXXX.

 
Vladimir Karputov:

O objetivo não é que o usuário continue a usar a MQL4 sem pensar, mas que comece a reescrever lentamente seu código MQL4.

O estilo MQL4 é MQL5 puro. Não é pior do que SB. Não lute com moinhos de vento em sua imaginação. Você não está brigando com o estilo da StandardLibrary.

O iCustom nem sequer estava nos planos - apenas os indicadores padrão foram considerados.

Sobre o armazenamento em cache - definitivamente não está no artigo para o público em geral.

Nos tópicos sobre indicadores do MT4 vs MT5, os indicadores padrão foram os menos discutidos. Quase todo mundo falou sobre os indicadores personalizados. Os indicadores padrão foram escritos há décadas e estão irrevogavelmente desatualizados. Trabalhar em MQL5 avançada com indicadores antigos parece estranho.

O armazenamento em cache não deveria ter sido explicado no artigo, mas deveria ter sido feito, já que você tirou a objetividade de suas conclusões em relação ao estilo MQL4.

Uma queda na velocidade de teste com acesso simultâneo a mais de um indicador;

 
Vladimir Karputov:

Adicionado: a propósito, o feedback do usuário mostrará se High[] e recursos semelhantes são necessários ou se a série iXXXX pode ser dispensada.

Faça uma enquete e veja o resultado sem dizer nada na forma de comentários. O mesmo se aplica até mesmo a coisas simples como as variáveis Bid/Ask.

 

O artigo deveria se chamar "como você não pode escrever código tentando salvar a representação MQL4".

Um horror difícil com alças vazadas (por que fechar a alça do indicador?) e uma sobrecarga incrível (tentar recriar o indicador, caindo dentro do gerenciador de indicadores). E muitas pessoas o copiarão sem olhar e sem entender.

Além disso, a extração ineficiente de um valor do indicador.

Eu li o artigo por completo e examinei os códigos o suficiente.