Discussão do artigo "Assistente MQL5: Como Criar um Módulo de Rastreamento de Posições Abertas" - página 2

 

Obrigado por seu excelente e útil artigo,

Por favor, gostaria de lhe pedir um exemplo de como usar essa classe para escrever um expert adviser. O que quero dizer é que usar essa classe no modelo EA não gera EA.

Mais uma vez, obrigado.

 

Boa tarde. O módulo não está funcionando.

O registro mostra que o nível de lucro limite deve ser maior que o nível de definição de ordens.

No construtor, inicializo variáveis que não estão vazias e não são iguais a zero. Por que estou recebendo um erro?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh
//| Copyright 2009-2013, MetaQuotes Software Corp.
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// início da descrição do assistente
//+----------------------------------------------------------------------+
//| Descrição da classe|
//| Título=Trailing com Stop Loss flutuante (Fox104)
//| Type=Trailing|
//| Name=FixedPips|
//| Class=CTrailingFixedPips|
//| Page=|
//| Parâmetro=StopLevel,int,30,Nível de stop loss trailing (em pontos)
//| Parâmetro=ProfitLevel,int,50,Nível de trailing do Take Profit (em pontos)
//+----------------------------------------------------------------------+
// descrição do assistente fim
//+------------------------------------------------------------------+
//| Classe CTrailingFixedPips.|
//| Finalidade: Classe de trailing stops com nível de stop fixo em pips. Finalidade: Classe de trailing stops com nível de stop fixo em pips.
//| Deriva da classe CExpertTrailing.|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- parâmetros de entrada
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- métodos de inicialização de dados protegidos
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| Destruidor|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//|| Configurações de validação de dados protegidos.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- verificações de dados iniciais
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+": o nível de lucro limiar deve ser maior que o nível de configuração da ordem");
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Verificação de trailing stop e/ou lucro para posição longa.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- verificação
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- verificação de parâmetros 
   if(m_profit_level==0.0)  return(false);
//--- já está no ponto de equilíbrio?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- verificação de lucro
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Verificação de trailing stop e/ou lucro para posição vendida.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- verificação
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- verificação de parâmetros
   if(m_profit_level==0.0)  return(false);
//--- já está no ponto de equilíbrio?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- verificação de lucro
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

Boa tarde. O módulo não está funcionando.

O registro mostra que o nível de lucro limite deve ser maior que o nível de definição de ordens.

No construtor, inicializo variáveis que não estão vazias e não são iguais a zero. Por que estou recebendo um erro?

Formate o código em sua mensagem corretamente: Insira o código corretamente no fórum. (Sua mensagem já foi corrigida).
 
Andy:

Ao usar o módulo especificado no artigo, são gerados erros no registro do Expert Advisor ao carregar o Expert Advisor no gráfico:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: erro ao inicializar indicadores

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: mudança de série temporal é proibida

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: alteração da série temporal é proibida

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: parâmetros de configuração não são verificados

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: erro na inicialização dos indicadores do objeto final

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: erro ao inicializar indicadores

Talvez esteja desatualizado, onde obter um novo ou o que consertar nisso?

Faça uma alteração no módulo de rastreamento "sampleTrailing.mqh":

//+------------------------------------------------------------------+
//| Verificar os parâmetros de configuração.|
//| INPUT: não.|
//| OUTPUT: verdadeiro se as configurações estiverem corretas, caso contrário, falso. || OUTPUT: verdadeiro se as configurações estiverem corretas, caso contrário, falso.
//| OBSERVAÇÃO: Não.|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- caso o método Init não tenha sido chamado
   if(m_symbol==NULL) return(false);
//--- verificação de parâmetros
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": o nível de lucro limiar deve ser maior do que o nível de configuração da ordem");
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

Ao usar o módulo especificado no artigo, são gerados erros no registro do Expert Advisor ao carregar o Expert Advisor em um gráfico:


Talvez ele esteja desatualizado, onde obter um novo ou o que consertar nesse caso?

Obrigado pela mensagem, o artigo foi corrigido

 
Andy:

Ao abrir uma posição vendida e definir o stop loss normal (não o trailing) como 0 nos parâmetros, o trailing stop não é definido como ponto de equilíbrio, mas se você mover um pouco o stop normal e defini-lo com pelo menos -1 pip, tudo funcionará. No longing, tudo funciona normalmente. Ao verificar a condição de que já existe um ponto de equilíbrio (o stop é menor do que o preço), inicialmente 0 no valor do stop e ele não o deixa ir além.


É isso mesmo. É o Stop Loss especificado que é o gatilho para que ESTE módulo trailing funcione no ponto de equilíbrio. Ou seja, supõe-se que a posição DEVE ter um stop loss inicialmente.


Acrescentado:

O objetivo de qualquer artigo é mostrar e familiarizar-se com abordagens para resolver algum problema. Em seguida, o próprio usuário deve desenvolver seu próprio código com base no conhecimento adquirido.

 
Andy:

Ele deve ser complementado para que, se não houver stop, o trailing também seja - preencha a variável com pelo menos o valor de abertura.

(Recebi uma notificação push para duas de suas mensagens, mas uma delas está faltando - excluída)?


Se você precisar alterar algo, esse não é o problema deste artigo. Aqui você pode fazer isso sozinho, com base no conhecimento que adquiriu. Ou seja, se você quiser redigir um trabalho técnico e achar que o artigo será reescrito de acordo com ele, não será assim.

Como vejo suas ações: reescrever o módulo (uma pequena alteração) e usar.


Acréscimo: Pela última vez, use o botão "responder". Caso contrário, não responderei.

 
Andy:

Ok, eu mesmo escreverei. Você excluiu uma de suas postagens (diga-me se excluiu, para que eu não tenha que procurá-la)?


Você pode abrir um novo tópico, algo como"Módulo de manutenção de posições abertas até o ponto de equilíbrio" - acho que esse tópico será útil.

Então, sim, eu estava editando minha postagem e cliquei em "excluir" por engano - ou seja, na verdade, escrevi DUAS postagens e excluí uma. Portanto, o push chegou corretamente.