O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 11

 
secret:
O pedido foi feito com antecedência. O preço o toca, mas é executado mais tarde, a um preço pior.

Não, se o limite tiver tido um desempenho pior, então, lixe o corretor ou lide com ele.

E se a parada, tudo bem, por assim dizer. 20-30 ms é bastante aceitável, se o pedido for feito em outro lugar e não apenas verificado por um plugin.

E quantos carrapatos existiam - não importa em nada.

 
Andrei Trukhanovich:

como ajuda se a comissão é contada em dólares a partir do volume em dólares?

Estranhamente, a moeda da conta é afetada. Aparentemente, não é a taxa de câmbio atual, mas uma taxa fixa. Mais arredondamento, se o lote for pequeno.

 

Eu tinha que descobrir algo por mim mesmo e nasceu um exemplo muito fácil de reproduzir, o que mostra como é fácil trabalhar com pedidos.


Então, imaginemos que executamos uma EA que funciona no modo clássico OnTick. Como o OnTick pode ocorrer a qualquer momento durante o estado do ambiente do terminal, será interessante ver o que a EA pode ver. Portanto, os estados que podem ser encontrados pelo Expert Advisor onTick são escolhidos como se segue.

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  static int i = 0;
  
  Print(i++);
  
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(PositionsTotal()) + TOSTRING(OrdersTotal()) + TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
        
  Print("----------------");
}

Este código simplesmente imprime quantas posições/ordens atuais e quantos negócios/ordens fechados existem.


Nós a executamos e apenas abrimos uma posição manualmente e a fechamos. Não há mais nada. Eu tenho a seguinte impressão (pode mudar de execução para execução).

        // Открываем позицию руками.

        0
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        5 // Открывающий позицию ордер исчез полностью - нет среди живых и мертвых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        6 // Открылась позиция, но нет соответствующей ей сделки.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 26 
        ----------------
        7
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------

        // Закрываем позицию руками.
        8 // Позиция и закрывающий ее ордер.
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        9
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        10
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        11
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        12 // Позиция закрыта, но закрывающий ее ордер продолжает висеть.
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        13 // Закрывающий позицию ордер полностью исчез - нет среди мертвых/живых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        14
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        15
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 27 
        ----------------

Assim, o Consultor Especialista OnTick pode encontrar qualquer uma destas 16 situações, algumas interessantes que comentei acima.

Eu não peguei um exemplo de propósito. Bastava executá-lo e afixar o resultado. Os lançamentos também podem dar outras variantes interessantes.


Pude comentar os resultados porque eu sabia exatamente o que estava fazendo (abri uma única posição e a fechei à mão).

Qual é a sensação de um Expert Advisor que não sabe disso? Imaginemos que existem vários Consultores Especialistas trabalhando em paralelo por conta disso. A facilidade de análise da bagunça resultante da simbiose das situações acima é, creio eu, óbvia.


Um código conciso é anexado, qualquer um pode reproduzi-lo.

 
fxsaber:

Eu tinha que descobrir algo por mim mesmo e nasceu um exemplo muito fácil de reproduzir, o que mostra como é fácil trabalhar com pedidos.


Então, imaginemos que executamos uma EA que funciona no modo clássico OnTick. Como o OnTick pode ocorrer a qualquer momento durante o estado do ambiente do terminal, será interessante ver o que a EA pode ver. Portanto, os estados que podem ser encontrados pelo Expert Advisor onTick são escolhidos como se segue.

Este código simplesmente imprime quantas posições/ordens atuais e quantos negócios/ordens fechados existem.


Nós a executamos e apenas abrimos uma posição manualmente e a fechamos. Não há mais nada. Eu tenho a seguinte impressão (pode mudar de execução para execução).

Assim, o Consultor Especialista OnTick pode encontrar qualquer uma destas 16 situações, algumas interessantes que comentei acima.

Eu não peguei um exemplo de propósito. Bastava executá-lo e afixar o resultado. Os lançamentos também podem dar outras variantes interessantes.


Pude comentar os resultados porque eu sabia exatamente o que estava fazendo (abri uma única posição e a fechei à mão).

Qual é a sensação de um Expert Advisor que não sabe disso? Imaginemos que existem vários Consultores Especialistas trabalhando em paralelo por conta disso. A facilidade de análise da bagunça resultante da simbiose das situações acima é, creio eu, óbvia.


O breve código está anexado, todos podem reproduzi-lo.

Você tem que entender quantas vezes a OnTradeTransaction é chamada e o que você pode obter em que momento.

TRADE_TRANSACTION_ORDER_ADD

Adição de uma nova ordem em aberto.

TRADE_TRANSACTION_ORDER_UPDATE

Modificação de uma ordem em aberto. Estas mudanças incluem não apenas mudanças explícitas no terminal do cliente ou no lado do servidor comercial, mas também mudanças no estado de colocação do pedido (por exemplo, de ORDER_STATE_STARTED para ORDER_STATE_PLACED ou de ORDER_STATE_PLACED para ORDER_STATE_PARTIAL etc.).

TRADE_TRANSACTION_ORDER_DELETE

Deleta o pedido da lista de pedidos em aberto. Uma ordem pode ser excluída da lista de ordens abertas como resultado de um pedido comercial ou como resultado da execução (preenchimento) e transferência para o histórico.

TRADE_TRANSACTION_DEALDEAL_ADD

Adicionando um ofício à história. Isto é realizado como resultado da execução da ordem ou como resultado das operações de saldo da conta.

TRADE_TRANSACTION_DEAL_UPDATE

A mudança de um acordo na história. São possíveis situações em que um negócio previamente executado é alterado no servidor. Por exemplo, a transação foi alterada no sistema comercial externo (câmbio), onde foi removida pelo corretor.

TRADE_TRANSACTION_DEAL_DELETE

Eliminação da transação do histórico. Pode haver situações em que uma negociação previamente executada é apagada no servidor. Por exemplo, o comércio foi eliminado no sistema comercial externo (bolsa) onde foi removido pelo corretor.

COMÉRCIO_TRANSAÇÃO_HISTÓRIA_ADD

Adicionando uma ordem ao histórico como resultado da execução ou cancelamento.

COMÉRCIO_TRANSAÇÃO_ATUALIZAÇÃO_DA_HISTÓRIA

Modificação de um pedido colocado no histórico do pedido. Este tipo é destinado a aumentar a funcionalidade do lado do servidor comercial.

TRADE_TRANSACTION_HISTORY_DELETE

Deleção de um pedido do histórico do pedido. Este tipo é destinado à expansão da funcionalidade no lado do servidor comercial.

POSIÇÃO_DE_TRANSAÇÃO_COMERCIAL

Mudança de uma posição não relacionada à execução comercial. Este tipo de transação indica que a posição foi alterada do lado do servidor comercial. O volume da posição, o preço de abertura e os níveis de Stop Loss e Take Profit podem ser alterados. Informações sobre mudanças são passadas à estrutura da MqlTradeTransaction através do manipulador da OnTradeTransaction. Uma mudança de posição (adição, modificação ou eliminação) como resultado de um comércio não causa a ocorrência da transação TRADE_TRANSACTION_POSITION.

TRADE_TRANSACTION_REQUEST

Uma notificação de que um pedido comercial foi processado pelo servidor e seu resultado foi recebido. Para transações deste tipo é necessário analisar apenas um campo - tipo (tipo de transação) na estrutura da MqlTradeTransaction. O segundo e terceiro parâmetros da função OnTradeTransaction (solicitação e resultado) devem ser analisados para obter informações adicionais.

 
Alexey Viktorov:

Você tem que descobrir quantas vezes a OnTradeTransaction é chamada e o que você pode obter em que momento.

Acho que deixei isso o mais claro possível.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

O grande e terrível MT4 para sempre (ou como construir uma estratégia de migração)

fxsaber, 2021.05.03 12:48

Portanto, a OnTick EA pode se deparar com qualquer uma dessas 16 situações, interessantes que comentei acima.

 
fxsaber:
Acho que deixei isso o mais claro possível.

O que a OnTick() tem a ver com isso se você lidar com tudo isso na OnTradeTransaction

Obtenha a razão de ligar para a OnTradeTransaction e processe o que está disponível nesta chamada de acordo.
 
Alexey Viktorov:

O que a OnTick() tem a ver com isso se você processar tudo na OnTradeTransaction

Obtenha a razão de ligar para a OnTradeTransaction e processe o que está disponível nesta chamada de acordo.

Talvez um dos membros do fórum possa explicar. Não funciona para mim.

 
Alexey Viktorov:

O que a OnTick() tem a ver com isso se você processar tudo na OnTradeTransaction

Obtenha a razão de ligar para a OnTradeTransaction e trate o que está disponível naquela chamada de acordo.

NaOnTick, absolutamente todas essas adversidades estão no lugar. É apenasdifícil fazer um exemplo facilmente reproduzível com o OnTick.A OnTradeTransaction foi escolhida como exemplo, mas isso não muda a essência.

 
traveller00:

A OnTick tem absolutamente todas estas peculiaridades no lugar. É apenasdifícil fazer um exemplo facilmente reproduzível com oOnTick.A OnTradeTransaction foi escolhida como exemplo, mas isso não muda a questão.

Continuem imitando Dom Quixote...

 
fxsaber:

нет среди живых и мертвых

Seria ótimo contornar este ponto a nível de MT4Orders.

Os pedidos de backups estão acontecendo agora, infelizmente. Muito provavelmente devido a isso.

Razão: