Discussão do artigo "Expert Advisor Universal: O Modelo de Evento e o Protótipo da Estratégia de Negociação (Parte 2)" - página 4

 
Andrey Khatimlianskii:
No mínimo, analise o preço. Talvez você nem precise entrar.
Sim, existe esse mecanismo. E onde ele deve ser incorporado, se não na classe de ordens de negociação? E como formalizar esse mecanismo, que movimento brusco deve ser considerado crítico?
 
Гога:
Sim, existe esse mecanismo. E onde ele deve ser incorporado, se não na classe de ordens comerciais? E como formalizar esse mecanismo, qual movimento brusco deve ser considerado crítico?

Bem, essa é a questão! É por isso que ele não está incorporado ao mecanismo.

Para uma estratégia, um deslize de 20 pips não importa, e você deve entrar de qualquer maneira, enquanto para outra estratégia um deslize de 2 pips quebra todas as estatísticas, e você não deve entrar pior.

E o que um mecanismo de negociação universal deve fazer para essas duas estratégias? Certo, retornar o preço de recotação e deixar que a lógica de negociação tome uma decisão.

Bem, ou adicionar uma personalização. Mais precisamente, configurações para todos os casos da vida)

 
Este é um artigo muito bom. Aprendi muito. Boa contribuição, obrigado.
 
Alain Verleyen:

Na compilação 1241, o código está compilando bem, então tentei executar um backtest. Ele não faz nenhuma negociação.

Depois de pesquisar um pouco, descobri que isso se deve ao modo de preenchimento. O modo permitido na corretora/símbolo que estou usando é ORDER_FILLING_IOC. Sua classe TradeCustom define o modo de preenchimento por padrão como ORDER_FILLING_FOK. E eu não consigo entender como posso alterar esse modo de preenchimento para que o EA Agent.mq5 faça a negociação? Eu poderia pesquisar, mas isso me tomaria muito tempo.

Esse é o problema com essas ferramentas, muito semelhantes ao assistente MQL5 EA da Metaquotes, que é quase inutilizável para quem não conhece todos os detalhes das classes. Quando você se depara com um problema que não foi fornecido pelo autor, torna-se uma verdadeira dor de cabeça corrigi-lo ou modificá-lo/adicioná-lo. Não vejo nenhuma diferença real entre sua solução e a do Metaquotes (assistente).

De qualquer forma, parabéns pelo enorme trabalho. É um excelente trabalho de programação.

Há algumas classes na pasta include do MetaEditor5. Se alguém puder nos dar uma explicação detalhada das classes da pasta Expert, será muito útil, pois elas parecem muito complicadas. As pessoas gostam de escrever EA padrão com base em classes básicas formais e nem sempre recriam rodas.... De qualquer forma, esse artigo ajuda muito a não recriar as rodas.
 
Amy Liu:
Há algumas classes na pasta include do MetaEditor5. Se alguém puder nos dar uma explicação detalhada das classes da pasta Expert, será muito útil, pois elas parecem muito complicadas. As pessoas gostam de escrever EA padrão com base em classes básicas formais e nem sempre recriam rodas.... De qualquer forma, esse artigo ajuda muito a não recriar rodas.
Eu concordo. O problema é quando há um bug na estrutura. Antes de usar uma estrutura, devemos decidir aprendê-la profundamente ou ter certeza de que o autor oferece um bom suporte.
 
Alain Verleyen:
Eu concordo. O problema é quando há um bug na estrutura. Antes de usar uma estrutura, devemos decidir aprendê-la profundamente ou ter certeza de que o autor oferece um bom suporte.
É por isso que quero aprender as classes do MetaEditor5, pois elas são do "governo". ;)
 
Amy Liu:
É por isso que quero aprender as aulas no MetaEditor5, pois elas são do "governo" ;)
E com bugs e sem suporte :-D
 
Obrigado, artigo muito bom.
 

Mr.Vasily,

very nice code.. and useful to me..

in the mt5 news builds (1952), we got a "message" in the compiler, 


bool CBarDetector::IsNewBar(void)

  {

   datetime time[];

   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return false;

   if(time[0] == m_last_time)return false;

   return (m_last_time = time[0]);    //<=============HERE

  }

//+------------------------------------------------------------------+

///////////MESSAGE in THE METAEDITOR compiler///////////////
expression not boolean NewBarDetector.mqh 87 24


the correct should be this? please confirm

//+------------------------------------------------------------------+
//| Returns true if for the given symbol and timeframe there is      |
//| a new bar.                                                       |
//+------------------------------------------------------------------+
bool CBarDetector::IsNewBar(void)
  {
   datetime time[];
   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return (false);
   if(time[0] == m_last_time)return (false);
   return (m_last_time == time[0]);
  }
//+------------------------------------------------------------------+



 

Olá, Vasiliy,

Perdoe-me por fazer uma pergunta sobre seu artigo tão depois de tê-lo escrito. Só agora estou analisando os artigos corretamente em busca de alternativas para uma estrutura. Algo me pareceu estranho, muito provavelmente devido a um mal-entendido meu.

Com relação aos manipuladores de eventos New Tick e New Bar. Você percorre a lista de ticks adicionados e, em seguida, cria a estrutura de eventos, passando-a para os manipuladores de eventos Init e Support, por exemplo, o evento new tick abaixo:

//+------------------------------------------------------------------+
//| Detecta a chegada de novos ticks de multi-instrumentos.
//+------------------------------------------------------------------+
void CStrategy::NewTickDetect(void)
  {
   if(m_ticks_detectors.Total()==0)
      AddTickEvent(ExpertSymbol());
   for(int i=0; i<m_ticks_detectors.Total(); i++)
     {
      CTickDetector *tick=m_ticks_detectors.At(i);
      if(tick.IsNewTick())
        {
         m_event.period=PERIOD_CURRENT;
         m_event.type=MARKET_EVENT_TICK;
         m_event.symbol=tick.Symbol();
         CallSupport(m_event);
         CallInit(m_event);
        }
     }
  }

Em um de seus exemplos, por exemplo, o clipe de média móvel abaixo;

bool CMovingAverage::IsTrackEvents(const MarketEvent &event)
  {
//--- Tratamos apenas da abertura de uma nova barra no símbolo e no período de trabalho
   if(event.type != MARKET_EVENT_BAR_OPEN)return false;
   if(event.period != Timeframe())return false;
   if(event.symbol != ExpertSymbol())return false;
   return true;
  }

Essa função IsTrackEvents parece anular a finalidade da função NewTickDetect acima! Portanto, o exemplo da Média Móvel acima deveria ser capaz de negociar em vários instrumentos com base em sua capacidade de verificar vários símbolos, como em NewTickDetect, mas IsTrackEvents permite a negociação somente para o período de tempo e o símbolo da estratégia (o símbolo é fundamental aqui). Isso não significa que o loop NewTickDetect não é realmente necessário, já que a estratégia só pode negociar em seu símbolo? De fato, a detecção do novo tick deve verificar apenas se o tick recebido é do símbolo da estratégia, sem looping. O que, de fato, é semelhante a ter um objeto de estratégia para cada símbolo de interesse, sobre o qual o CStragyList faz um loop?

Espero que eu esteja fazendo sentido e que você possa me esclarecer.

Gosto muito de seu trabalho. Aprendi muito com seus artigos, portanto, muito obrigado.

Atenciosamente,

Shep