Discussão do artigo "Guia Prático MQL5: Processamento do Evento BookEvent" - página 2

 
denkir:
É provável que você não precise de um tumbler, mas de um manipulador de transações de mercado.
Muito obrigado!
 
Li o artigo que você mencionou, que certamente também é útil, mas em minha pergunta eu me referia à possibilidade de ler as ações em ordens de outros participantes do mercado, não aquelas colocadas por um operador em seu terminal. Ou seja, o filtro sobre o qual escrevi deve ser aplicado às operações atuais do mercado. O MetaTrader fornece essas informações? Não vi essa possibilidade no manipulador de eventos da pilha.
Рецепты MQL5 - обработка события TradeTransaction
Рецепты MQL5 - обработка события TradeTransaction
  • 2014.09.08
  • Dennis Kirichenko
  • www.mql5.com
В статье описываются возможности языка MQL5 с точки зрения событийно-ориентированного программирования. Преимущество данного подхода состоит в том, что программа может получать информацию о поэтапном выполнении торговой операции. Приводится пример того, как с помощью обработчика события TradeTransaction можно получать и обрабатывать информацию о совершаемых торговых действиях. Думаю, что такой подход можно смело применять для целей копирования торговых сделок с терминала на терминал.
 
Rubick:
...mas em minha pergunta eu me referia à possibilidade de ler ações em ordens de outros participantes do mercado, não aquelas colocadas por um operador em seu terminal. Ou seja, o filtro sobre o qual escrevi deve ser aplicado às operações atuais do mercado. O MetaTrader fornece essas informações? Não vi essa possibilidade no manipulador de eventos da pilha.
A pilha mostra todas as ordens de limite atuais que estão no mercado no momento. O que você quer dizer com o termo "operações atuais de mercado"?
 
denkir:
A pilha mostra todas as ordens limitadas atuais que estão no mercado no momento. O que você quer dizer com o termo "operações de mercado atuais"?

Peço desculpas se não expliquei claramente. Vou tentar elaborar um pouco mais. Veja, em ENUM_BOOK_TYPE, há apenas quatro tipos de ordens listadas na pilha. Elas podem ser divididas em duas categorias: limitada e de mercado. Agora vou lhe dizer como entendo a negociação. Aviso que tenho dúvidas aqui, portanto, se eu entender algo errado, por favor, me corrija. Então, é o seguinte. Há dois grupos de possíveis variantes aqui.

  1. Quando uma ordem limitada encontra uma ordem de mercado e ocorre uma negociação - Tick. Ou duas ofertas de mercado se encontram e ocorre uma transação - Tick.
  2. Quando duas ofertas limitadas se encontram e a última delas leva a uma transação - Tick.

A tarefa que estou considerando é filtrar as negociações em duas categorias: 1ª - aquelas produzidas por lances de limite; 2ª - aquelas produzidas por lances de mercado. Por favor, deixe isso para mim em particular. Posso dizer que já vi a implementação de tal filtro, e por meio do 1C! Também fiquei muito surpreso quando o vi. Mas gostei da ideia. E agora, pelo que entendi, é necessário acoplar o manipulador OnTick ao manipulador OnBookEvent. Não tenho ideia de como fazer isso, por isso peço sua ajuda.

 
É possível criar um evento de livro para que o mercado forex veja as ordens pendentes? Naturalmente, para um único provedor de liquidez.
 
BlackBart:
É possível criar um evento de livro para que o mercado forex veja as ordens pendentes? Naturalmente, para um único provedor de liquidez.
Você precisa de uma corretora que forneça essas informações.
 

"É óbvio que, de todas as ordens de venda, a ordem nº 6 teve o maior volume, com o preço de 7.700 Rub e o volume de 1.011 lotes. A ordem nº 39 teve o maior volume de todas as ordens de compra, com o preço de 7653 Rub e o volume de 534 lotes."

Não se trata da ordem nº 6, nem da ordem nº 39. Esses são níveis, que podem ser acessados por

last_bookArray[6]

ou

last_bookArray[39]

MqlBookArrays são compostos de ofertas de venda de [0] a [ArraySize(bookArray)/2-1] e ofertas de compra de [ArraySize(bookArray)/2] a [ArraySize(bookArray)-1]. Até onde sei, os livros têm 2n níveis. E, se não me engano, os níveis começam com o índice 0 (zero), portanto, o índice do modo matemático (o volume mais alto, a oferta de venda mais frequente) é 5 (volume 1011, nível/preço 7700), enquanto o modo de oferta de compra é 38 (volume 534, nível/preço de 7653).

O modo de oferta de compra pode ser considerado como suporte. E o modo de oferta de venda pode ser considerado resistência.

Gostaria de saber como posso aumentar o número de níveis...

 
Olá, Denis;

Tentei usar seu indicador, o BookEventProcessor2.mq5, mas ao tentar compilá-lo dentro do meta editor mql5, ele me dá o seguinte erro, você poderia ter a gentileza de resolver esses pequenos problemas para ver como ele funciona nesses momentos. Poderia me dizer também se é possível incluir as ordens de limite de venda e compra ao mesmo tempo, mas com outra cor.

Atenciosamente,

Michael
Arquivos anexados:
 
mzapata6724:
Oi Denis;

Tentei usar seu indicador, o BookEventProcessor2.mq5, mas ao tentar compilá-lo dentro do meta editor mql5, ele me dá o seguinte erro, você poderia ter a gentileza de resolver esses pequenos problemas para ver como ele funciona nesses momentos. Poderia me dizer também se é possível incluir as ordens de limite de venda e compra ao mesmo tempo, mas com outra cor.

Atenciosamente ,

Michael

Michael, obrigado por suas perguntas. Em primeiro lugar, o BookEventProcessor2 não é um indicador - é um Expert Advisor. Tudo o que você precisa é colocar os arquivos de origem e de cabeçalho em uma pasta. Dê uma olhada nas imagens anexadas abaixo.


Se você quiser mudar as cores rapidamente, vá para o método CBookBarsPanel::Init() :

//+------------------------------------------------------------------+
//| Inicialização|
//+------------------------------------------------------------------+
bool CBookBarsPanel::Init(const uint _width,const uint _height)
  {
//--- tamanho do painel
   this.m_width=_width;
   this.m_height=_height;

//--- alocar memória
   if(this.m_obj_arr.Reserve(this.m_arr_size))
     {
      //--- o sinalizador de gerenciamento de memória 
      this.m_obj_arr.FreeMode(true);
      //--- rótulo do painel
      CChartObjectRectLabel *ptr_rect_label=new CChartObjectRectLabel;
      if(CheckPointer(ptr_rect_label)==POINTER_DYNAMIC)
         if(ptr_rect_label.Create(0,"Panel",0,15,15,this.m_width,this.m_height))
            if(ptr_rect_label.BorderType(BORDER_RAISED))
               if(this.m_obj_arr.Add(ptr_rect_label))
                 {
                  //--- rótulo da barra 
                  uint curr_x=this.m_width/5;
                  uint curr_y=35;
                  uint mid_idx=this.m_arr_size/2-1;
                  for(uint idx=0;idx<this.m_arr_size;idx++)
                    {
                     color rec_color=(idx<(mid_idx+1))?clrRed:clrGreen;
                     //---
                     CBookRecord *ptr_record=new CBookRecord;
                     if(CheckPointer(ptr_record)==POINTER_DYNAMIC)
                        if(ptr_record.Create(IntegerToString(idx+1),rec_color,curr_x+15,
                           curr_y,curr_x*3,10))
                           if(this.m_obj_arr.Add(ptr_record))
                              curr_y+=(idx==mid_idx)?24:13;
                    }
                 }
     }

//---
   return this.m_obj_arr.Total()==(this.m_arr_size+1);
  }

Ou você pode alterar ligeiramente os parâmetros do método da seguinte forma:

//+------------------------------------------------------------------+
//| Inicialização|
//+------------------------------------------------------------------+
bool CBookBarsPanel::Init(const uint _width,const uint _height, const color _buy_clr, const color _sell_clr)
  {
//--- tamanho do painel
   this.m_width=_width;
   this.m_height=_height;

//--- alocar memória
   if(this.m_obj_arr.Reserve(this.m_arr_size))
     {
      //--- o sinalizador de gerenciamento de memória 
      this.m_obj_arr.FreeMode(true);
      //--- rótulo do painel
      CChartObjectRectLabel *ptr_rect_label=new CChartObjectRectLabel;
      if(CheckPointer(ptr_rect_label)==POINTER_DYNAMIC)
         if(ptr_rect_label.Create(0,"Panel",0,15,15,this.m_width,this.m_height))
            if(ptr_rect_label.BorderType(BORDER_RAISED))
               if(this.m_obj_arr.Add(ptr_rect_label))
                 {
                  //--- rótulo da barra 
                  uint curr_x=this.m_width/5;
                  uint curr_y=35;
                  uint mid_idx=this.m_arr_size/2-1;
                  for(uint idx=0;idx<this.m_arr_size;idx++)
                    {
                     color rec_color=(idx<(mid_idx+1))?_sell_clr:_buy_clr;
                     //---
                     CBookRecord *ptr_record=new CBookRecord;
                     if(CheckPointer(ptr_record)==POINTER_DYNAMIC)
                        if(ptr_record.Create(IntegerToString(idx+1),rec_color,curr_x+15,
                           curr_y,curr_x*3,10))
                           if(this.m_obj_arr.Add(ptr_record))
                              curr_y+=(idx==mid_idx)?24:13;
                    }
                 }
     }

//---
   return this.m_obj_arr.Total()==(this.m_arr_size+1);
  }
Arquivos anexados:
 

Oi Dennis


Obrigado pela resposta rápida, o consultor especialista agora está funcionando muito bem. Mas eu estava tentando falar sobre essa referência:

Ao enviar uma solicitação de negociação usando a função OrderSend (), algumas operações exigem a indicação do tipo de ordem. O tipo de ordem é especificado no campo typeda estrutura especialMqlTradeRequest e pode aceitar valores da enumeração ENUM_ORDER_TYPE.

ENUM_ORDER_TYPE

Identificador

Descrição

ORDER_TYPE_BUY

Ordem de compra a mercado

ORDER_TYPE_SELL

Ordem de venda a mercado

TIPO_DE_ORDEM_BUY_LIMIT

Ordem pendente de limite de compra

TIPO_DE_ORDEM_SELL_LIMIT

Ordem pendente Sell Limit

TIPO_DE_ORDEM_BUY_STOP

Ordem pendente Buy Stop

TIPO_DE_ORDEM_SELL_STOP

Ordem pendente Sell Stop

TIPO_DE_ORDEM_BUY_STOP_LIMIT

Ao atingir o preço da ordem, uma ordem Buy Limit pendente é colocada ao preço StopLimit

ORDER_TYPE_SELL_STOP_LIMIT (TIPO DE ORDEM_SELL_STOP_LIMIT)

Ao atingir o preço do pedido, uma ordem pendente Sell Limit é colocada ao preço StopLimit

ORDER_TYPE_CLOSE_BY

Ordem para fechar uma posição por outra oposta


Eu posso ver no terminal do Mql5 que o consultor experiente mostra ORDER_TYPE_BUY E ORDER_TYPE_BUY, mas minha pergunta é: você pode mostrar a transação no bookevent e mudar essas cores, porque eu sei como ver a ordem de compra, mas onde o chefão está colocando seu dinheiro, com o Iceberg e abraçando a ordem pendente em determinado nível de preço.


isso é possível???


Com os melhores cumprimentos, Michael.

RDER_TYPE_SELL_LIMIT

Ordem pendente Sell Limit

ORDER_TYPE_BUY_STOP

Ordem pendente Buy Stop

Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Trade Request Structure - Data Structures - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5