Características da linguagem mql5, subtilezas e técnicas - página 155

 
Nikolai Semko:

Encontrámos um interessante estudo de há dois anos comparando a eficácia de diferentes línguas

https://greenlab.di.uminho.pt/wp-content/uploads/2017/09/paperSLE.pdf



Oh meu Deus!

Ada está realmente viva e em crescimento! Se não estou enganado, o primeiro OOP. Estudei-o no início da década de 80. Não tinha ouvido nada até agora, pensava que a língua estava tão morta como a Modula. Ambos são actualizações profundas de Pascal. Eu não tinha um compilador Ada, e tinha Modula - um 7-pass em DWK, se alguém se lembrar.

 

Para evitar erros de execução no testador, enviar ordens de mercado apropriadas no caso de um SL/TP pendente ou SL/TP dever ser colocado aopreço actual:

  • Coloque uma ordem pendente ao preço actual - adicione-a após a ordem de mercado OrderSend.
  • Colocar a posição SL/TP ao preço actual - adicionar após a posição OrderClose.
 
fxsaber:

Para evitar erros de execução no testador, enviar ordens de mercado apropriadas para o caso de uma ordem pendente ou SL/TP dever ser colocada ao preço actual:

  • Coloque uma ordem pendente ao preço actual - adicione-a após a ordem de mercado OrderSend.
  • Coloque a posição SL/TP ao preço actual - adicione-a após a posição OrderClose.

Podemos discutir isto em mais pormenor? Não é muito claro:

  • para colocar uma ordem pendente ao preço actual, algo deve ser acrescentado após o envio de um pedido para abrir uma posição (?????????)
  • para colocar uma ordem de paragem (a quê?) ao preço actual, algo deve ser acrescentado depois de enviar um pedido de encerramento de uma posição (?????????)
Estas são as perguntas que surgem depois de tentar decifrar o que se escreveu ...
 
Artyom Trishkin:

Poderia ser mais específico? Não é realmente claro:

  • para colocar uma ordem pendente ao preço actual, algo deve ser acrescentado após o envio de um pedido para abrir uma posição (?????????)
  • para colocar uma ordem de paragem (a quê?) ao preço actual, algo deve ser acrescentado depois de enviar um pedido de encerramento de uma posição (?????????)
Tais perguntas aparecem depois de tentar decifrar o que se escreveu ...

O problema é mostrado aqui. Solução.

// Делает более точными MT4/5-тестеры.
TICKET_TYPE MyOrderSend( const string Symb, int Type, const double dVolume, const double Price, const int SlipPage, const double SL, const double TP,
                         const string comment = NULL, const MAGIC_TYPE magic = 0, const datetime dExpiration = 0, color arrow_color = clrNONE )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  MqlTick Tick = {0};  
  
  bool Res = IsTester && SymbolInfoTick(Symb, Tick);
  
  if (Res && (Type > OP_SELL))
  {
    if ((Type == OP_BUYLIMIT) || (Type == OP_BUYSTOP))
    {
      if (Price == Tick.ask)
        Type = OP_BUY;
    }
    else if (Price == Tick.bid)
      Type = OP_SELL;
  }
  
  const TICKET_TYPE Ticket = OrderSend(Symb, Type, dVolume, Price, SlipPage, SL, TP, comment, magic, dExpiration, arrow_color);
  
  Res = Res && (Type <= OP_SELL) && (Ticket != -1) &&
        (Type ? (SL == Tick.ask) || (TP == Tick.ask) : (SL == Tick.bid) || (TP == Tick.bid)) &&
        OrderClose(Ticket, dVolume, Type ? Tick.ask : Tick.bid, SlipPage, arrow_color);
  
  return(Ticket);
}

// Делает более точными MT4/5-тестеры.
bool MyOrderModify( const long Ticket, const double Price, const double SL, const double TP, const datetime Expiration, const color Arrow_Color = clrNONE )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  
  bool Res = false;
  
  if (IsTester && OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
  {
    if (OrderType() <= OP_SELL)
    {
      Res = (OrderClosePrice() == SL) || (OrderClosePrice() == TP);
      Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color) && (!Res || OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0, Arrow_Color));
    }
    else if (OrderClosePrice())    
      Res = ((OrderClosePrice() == Price) &&
             (MyOrderSend(OrderSymbol(), OrderType() & 1, OrderLots(), Price, 0, SL, TP,
                          OrderComment(), OrderMagicNumber(), OrderExpiration(), Arrow_Color) != -1) && OrderDelete(Ticket)) ||
            OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);
    else
    {
      MqlTick Tick = {0};
      
      if (SymbolInfoTick(OrderSymbol(), Tick))
        Res = (((bool)(OrderType() & 1) ? (Price == Tick.bid) : (Price == Tick.ask)) &&
               (MyOrderSend(OrderSymbol(), OrderType() & 1, OrderLots(), Price, 0, SL, TP,
                            OrderComment(), OrderMagicNumber(), OrderExpiration(), Arrow_Color) != -1) && OrderDelete(Ticket)) ||
               OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);
      else
        Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);                     
    }
  }
  else
    Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color); 
  
  return(Res);
}

#define OrderSend MyOrderSend
#define  OrderModify MyOrderModify
 
fxsaber:

O problema é mostrado aqui. Solução.

Isto não torna mais claro para que serve ou o que fazer. Afinal, muitas pessoas precisam de compreender o que está escrito sobre a razão de escrever uma solução antes de começarem a ler o código para fazer a sua própria solução ou utilizar uma já pronta.

Pedi uma explicação mais detalhada sobre isto:

O fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Características da linguagem mql5, complexidades e técnicas

fxsaber, 2019.12.18 12:45

Para evitar erros de execução no Testador, envie ordens de mercado apropriadas caso necessite de colocar um SL/TP pendente ou SL/TP ao preço actual:

  • Colocar uma ordem pendente ao preço actual - adicionar após OrderSend market order.
  • Coloque a posição SL/TP ao preço actual - adicione-a após a posição OrderClose.

E mostrou um exemplo de como é visto por mim, ou talvez por outra pessoa:

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

Peculiaridades de mql5, dicas e truques

Artyom Trishkin, 2019.12.18 12:53 pm

É possível explicá-lo com mais detalhes? Não compreendo nada:

  • para colocar uma ordem pendente ao preço actual, é necessário acrescentar algo depois de enviar um pedido para abrir uma posição (?????????)
  • para colocar uma ordem de paragem (a quê?) ao preço actual, algo deve ser acrescentado depois de enviar um pedido de encerramento de uma posição (?????????)
Estas são as perguntas que aparecem depois de tentar decifrar o que escreveu ...

Seja como for...

 
Artyom Trishkin:

Pedi-vos que fossem mais específicos

A colocação de uma ordem pendente e SL/TP ao preço actual não aceita a execução no tick actual no MT5-Tester.

 

Olá a todos.

Pode aconselhar-nos quais as ferramentas disponíveis no MT5 para exibir gráficos de carrapatos?

Em MT4 havia uma opção "abrir offline". Foi conveniente trabalhar com carraças, criando os meus próprios arquivos hst da história.

Em MT5 não existe a opção "aberta e isolada". Mas as ferramentas de software para trabalhar com carraças são excelentes.

Não pode ser impossível que não haja a possibilidade de os mostrar num gráfico

 
fxsaber:

O problema é mostrado aqui. Solução.

  const TICKET_TYPE Ticket = OrderSend();
  ...
  OrderClose(Ticket, dVolume, Type ? Tick.ask : Tick.bid, SlipPage, arrow_color);

Que monte de porcaria! Porquê abrir com SL/TP ao preço actual?

Bem, o encerramento colocando SL/TP ao preço actual, se for o caso, é feito intencionalmente. Também não há necessidade de emular o gatilho.

 
Andrey Khatimlianskii:

Que monte de porcaria! Porquê abrir com SL/TP ao preço actual?

Bem, o encerramento colocando SL/TP ao preço actual, se for o caso, é feito intencionalmente. Não há necessidade de emular o gatilho.

Dessa forma, pode facilmente obter um gatilho em dezenas de minutos ou horas.

Imagine que precisa de fechar por TP que é de alguma forma calculado. E agora é igual ao preço actual.

 
fxsaber:

necessidade de fechar no TP, o que é de alguma forma calculado. E agora tornou-se igual ao preço actual.

Neste caso, eu verifico sempre se este TP não deveria já ter disparado (o preço já o atravessou), e fecho de acordo com o mercado.

Ou, se for necessário sair com um limite, puxo-o para trás do preço, até encher.

Razão: