Discussão do artigo "Expert Advisor Multiplataforma: Stops" - página 2

 

Estou tentando alterar o stop loss para o stop principal... Como faço isso?

É isso que estou fazendo:

COrder *order=orders.At(i);

....

COrderStop *order_stop=order.MainStop();
double new_sl=...;
order_stop.StopLoss(new_sl);
order.MainStop(order_stop);
order.CheckStops();

Eu realmente quebrei minha cabeça tentando fazer isso...

Basic Principles - Trading Operations - MetaTrader 5 Help
Basic Principles - Trading Operations - MetaTrader 5 Help
  • www.metatrader5.com
Before you proceed to study the trade functions of the platform, you must have a clear understanding of the basic terms: order, deal and position...
 

Ele não está sendo atualizado por causa da verificação em COrderStopVirtualBase::Update

if(CheckPointer(m_objsl))
  {
   double sl_line=m_objsl.GetPrice();
   if(sl_line!=StopLoss())
      stoploss= sl_line;
  }

StopLoss() retorna um novo valor, mas sl_line ainda é antigo...

 
Enrico Lambino:
Oi Shep,

Obrigado por apontar isso. Eu não havia notado isso até agora. Atualizarei o código.

Sim, estou ciente disso. Isso ainda se deve às declarações de encaminhamento. O CStop requer instâncias de COrder e COrderStop em seus métodos. O mesmo acontece quando você tenta compilar o CStop. Todas essas classes que requerem umas às outras devem ser compiladas juntas. Haveria erros se cada uma fosse compilada isoladamente. Por exemplo:

Isso não será compilado. Você precisa fazer uma declaração forward para que o compilador reconheça o membro da classe m_object2 dentro da classe object1:

Isso é aceitável se Object1 e Object2 estiverem no mesmo arquivo. Se eles estiverem em dois arquivos separados, você precisará fazer uma declaração forward para Object2 no arquivo de classe de Object1 e para Object1 no arquivo de classe Object 2. Isso é verdade, até que você adicione métodos a uma das duas classes.

A versão atual do compilador reconhece as declarações de encaminhamento, mas não os métodos listados da classe declarada de forma encaminhada. É por isso que você não recebe mensagens de erro como "CStop - declaração sem tipo", mas recebe mensagens de erro do compilador para os métodos, como o que você postou acima. O compilador reconhece a classe, mas não os métodos da classe que foi declarada de forma avançada.


Olá, Enrico,

Obrigado pela resposta rápida. Você tem toda a razão sobre as declarações antecipadas. Eu estava preocupado que o problema fosse mais profundo do que isso. Faz sentido que o objeto que usa a classe declarada antecipadamente não tenha conhecimento dos membros dessa classe.

Eu uso um modelo diferente para meu mecanismo de execução que usa o padrão de estratégia. Tenho alguns problemas incômodos com ele e estava dando uma olhada na sua biblioteca quando me deparei com esses problemas.

Seu trabalho é realmente excelente, você tem habilidades sólidas de design e engenharia e obrigado por ter a gentileza de compartilhar.

Obrigado, Shep.

 
Shephard Mukachi:

Oi Enrico,

Obrigado pela resposta rápida. Você tem toda a razão sobre as declarações antecipadas. Eu estava preocupado que o problema fosse mais profundo do que isso. Faz sentido que o objeto que usa a classe declarada antecipadamente não tenha conhecimento dos membros dessa classe.

Eu uso um modelo diferente para meu mecanismo de execução que usa o padrão de estratégia. Tenho alguns problemas incômodos com ele e estava dando uma olhada na sua biblioteca quando me deparei com esses problemas.

Seu trabalho é realmente excelente, você tem habilidades sólidas de design e engenharia e obrigado por ter a gentileza de compartilhar.

Obrigado, Shep.

Oi, Shep,

De nada e obrigado por me informar. Lembro-me de que também fiquei um pouco confuso quando me deparei com esse problema com as declarações de avanço.

Fico feliz em saber que você achou os artigos úteis. Desejo a você tudo de bom em seus esforços para criar seu próprio mecanismo de EA.

Atenciosamente, Enrico

 
mbjen:

Ele não está sendo atualizado por causa da verificação em COrderStopVirtualBase::Update

StopLoss() retorna um novo valor, mas sl_line ainda é antigo...

A finalidade de COrderStopVirtualBase::Update é, na verdade, o oposto do que você pretende. Ele se destina a ajustar o valor de sl/tp quando sua própria linha de parada é atualizada, geralmente de fora do EA (arrastando no gráfico ou alterando diretamente o valor na janela de propriedades do objeto ). Em vez disso, use os métodos MoveStopLoss() e MoveTakeProfit() para os stops virtuais.

Isso deve ficar para o próximo artigo, mas se você estiver ansioso, talvez queira dar uma olhada no método CheckTrailing() do COrderStopBase. Ele modifica o stop da ordem quando qualificado para trailing. O método se aplica a todos os três tipos:

bool COrderStopBase::CheckTrailing(void)
  {
   if(!CheckPointer(m_stop) || m_order.IsClosed() || m_order.IsSuspended() || 
      (m_stoploss_closed && m_takeprofit_closed))
      return false;
   double stoploss=0,takeprofit=0;
   string symbol=m_order.Symbol();
   ENUM_ORDER_TYPE type=m_order.OrderType();
   double price=m_order.Price();
   double sl = StopLoss();
   double tp = TakeProfit();
   if(!m_stoploss_closed)
      stoploss=m_stop.CheckTrailing(symbol,type,price,sl,TRAIL_TARGET_STOPLOSS);
   if(!m_takeprofit_closed)
      takeprofit=m_stop.CheckTrailing(symbol,type,price,tp,TRAIL_TARGET_TAKEPROFIT);
   if(!IsStopLossValid(stoploss))
      stoploss=0;
   if(!IsTakeProfitValid(takeprofit))
      takeprofit=0;
   return Modify(stoploss,takeprofit); //<---- this
  }

Como alternativa, a classe CTrail também pode ser usada para alterar os níveis de sl/tp sem precisar recuperar uma instância de um stop de ordem (não apenas para trailing ou breakeven).

 

Quão longe da prática e da conveniência está a abordagem de plataforma cruzada proposta. Como sua própria bicicleta incômoda, tudo bem. Mas por que publicá-la? É mais fácil escrever tudo completamente por conta própria, mesmo para um iniciante, do que estudar e dominar esse monstro. Não estou entendendo.

O SB no MT5 é um exemplo de elegância comparado a esse ciclo de artigos. E ele também foi portado para o MT4.

Готовые советники из Мастера MQL5 работают в MetaTrader 4
Готовые советники из Мастера MQL5 работают в MetaTrader 4
  • 2017.03.09
  • Stanislav Korotky
  • www.mql5.com
Клиентские терминалы MetaTrader 4 и MetaTrader 5 предоставляют своим пользователям возможность легко создавать прототипы программ на языке MQL с помощью встроенного Мастера (MQL Wizard). Мастера обоих версий терминалов очень похожи, но все же имеют одно важное отличие. В Мастере MetaTrader 5 есть пункт генерации готовых советников, а в...
 

Gostei muito do artigo, ele abriu meus olhos. Por favor, escreva um artigo de acompanhamento. Estou realmente interessado em saber como você abordaria o escalpelamento com essa ferramenta.

Muito obrigado por este e todos os seus outros trabalhos.

 
fxsaber:

Quão longe da prática e da conveniência está a abordagem de plataforma cruzada proposta. Como sua própria bicicleta incômoda, tudo bem. Mas por que publicá-la? É mais fácil escrever tudo completamente por conta própria, mesmo para um iniciante, do que estudar e dominar esse monstro. Não estou entendendo.

O SB no MT5 é um exemplo de elegância comparado a esse ciclo de artigos. E ele foi portado para o MT4.

Concordo plenamente. Mesmo estando muito familiarizado com OOP, a abordagem desse autor é muito pervertida. Há muitos excessos e o código não é de fato um código, mas um "monstro". .....