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.
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 entradaint m_stop_level;
int m_profit_level;
public:
CTrailingFixedPips(void);
~CTrailingFixedPips(void);
//--- métodos de inicialização de dados protegidosvoid StopLevel(int stop_level) { m_stop_level=stop_level; }
void ProfitLevel(int profit_level) { m_profit_level=profit_level; }
virtualbool ValidationSettings(void);
//---virtualbool CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
virtualbool 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 iniciaisif((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);
}
//--- okreturn(true);
}
//+------------------------------------------------------------------+//| Verificação de trailing stop e/ou lucro para posição longa.//+------------------------------------------------------------------+bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
{
//--- verificaçãoif(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çãoif(position==NULL)
return(false);
if(m_stop_level==0)
return(false);
//--- verificação de parâmetrosif(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);
}
//+------------------------------------------------------------------+
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 nomó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 chamadoif(m_symbol==NULL) return(false);
//--- verificação de parâmetrosif((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);
}
//--- okreturn(true);
}
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.
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.
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.
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?
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?
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
Faça uma alteração no módulo de rastreamento "sampleTrailing.mqh":
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:
Obrigado pela mensagem, o artigo foi corrigido
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.
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.
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.