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

 
Este tópico irá discutir formas não documentadas de trabalhar com a linguagem mql5, exemplos de resolução de certos problemas. Gostaria que este ramo estivesse mais próximo do conteúdo da FAQ, do que da discussão. Convido todos os programadores experientes a partilhar as suas soluções e técnicas de programação. A cobertura de características não descritas na ajuda é especialmente bem-vinda.
 
fxsaber:

quando umaposição é aberta com sucesso por uma ordem de mercado, obtém-se sempre um resultado.deal zero?

A partir da CBO
Não é garantido que o bilhete do negócio Resultado será preenchido. O seu preenchimento ou não depende do modo de execução do instrumento e das configurações de um determinado servidor.
Quem reservou um Resultado.deal não zero - tomar medidas.
 
Uma vez executada uma OrderSend, o endereçamento da ordem, posição ou negociação relevante nem sempre é bem sucedido. Há situações em que é necessário esperar várias dezenas de milissegundos para que as informações comerciais históricas ou atuais se tornem corretas.
 
fxsaber:
Uma vez que a OrderSend tenha sido executada, o endereçamento da ordem, posição ou negociação relevante nem sempre é bem sucedido. Há situações em que você precisa esperar algumas dezenas de milissegundos para que as informações comerciais históricas ou atuais se tornem corretas.
o mesmo no MT4, depende do servidor específico
 
Nem sempre é possível saber o preço da ordem que gerou o negócio
 
Nem sempre é possível descobrir os níveis de SL/TP de uma posição fechada.

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

TakeProfit (e StopLoss) de uma posição fechada

fxsaber, 2016.07.17 20:19

Antes da introdução das posições abertas de hedge TakeProfit não eram armazenadas na bolsa sob a forma de ordens limitadas, mas sim no servidor de negociação MT5. No momento da aceitação foram enviadas à bolsa não como ordens limitadas ao preço indicado, mas como ordens de mercado ao preço indicado.

Este recurso é muito bem visível no testador quando TP é acionado: a ordem de mercado apropriada (em vez de limite) aparece. Como o takeprofit é um tipo de ordem de câmbio inexistente (só existem ordens de mercado e de limite), este estado de coisas estava bem dentro da "negociabilidade".

Com a aparência de cobertura a situação não mudou - o takeprofit permaneceu virtual. A situação é diferente na MT4: ao longo dos anos de pontes MT4 tornou-se padrão utilizar ordens de limite como lucro takeprofit da MT4.

É por causa dessa virtualidade que algumas das características do MT5 estão se arrastando como uma trilha. Não só é melhor que o takeprofit não seja colocado no MT5, mas se você quiser uma contrapartida de limite, não há como passar pelo MQL5 você pode saber seus valores de takeprofit e stoploss depois de fechar a posição.

Isto não é uma acusação indiscriminada, mas o resultado de horas de tentativa de descobrir (sem HistorySelectByPosition e outras coisas ajudam) como tudo funciona. E eu fico feliz em pedir desculpas se estiver errado. Para não ser infundado, estou mostrando um Expert Advisor para o testador (é mais fácil de entender) no servidor RoboForexEU-MetaTrader 5, que abre uma posição, depois coloca os níveis SL e TP.

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

Neste EA, SL e TP de uma única posição fechada não podem ser definidos (em OnDeinit). É suposto fazer isso?


Da cotação também decorre que TP de uma posição na MT5 é sempre uma ordem de mercado. Não marque a contrapartida do limite - veja acima.
 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Bugs, bugs, perguntas

Slawa, 2017.02.14 13:46

Porquê? Uma única acção é suficiente.

Enquanto o símbolo for selecionado na revisão do mercado e o histórico do símbolo for mantido pelo Expert Advisor, ele é mantido em sincronia. Segurar pelo Expert Advisor significa que você acessará esse histórico pelo menos uma vez a cada 2 minutos, por exemplo, copiando uma barra. Se o histórico estiver sincronizado, não se gasta tempo a copiar uma barra - apenas alguns ciclos de processador. Ou, como acabou de ser dito aqui, peça o número de barras, também alguns ciclos de relógio.

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Bugs, bugs, perguntas

Alexey Kozitsyn, 2017.02.14 13:47

Os indicadores incluem um intervalo de 2 minutos?

Sim, e ao verificar o facto da sincronização, a sincronização também será realizada?

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Bugs, bugs, perguntas

Slawa, 2017.02.14 13:50

Isto também se aplica aos indicadores. Crie um timer de 1 minuto e peça o número de barras de todas as séries de tempo de interesse.

A verificação do momento não se aplica ao momento.

 
fxsaber:
Uma vez que a OrderSend é executada, a referência à ordem, posição ou negociação apropriada nem sempre é bem sucedida. Há situações em que você precisa esperar algumas dezenas de milissegundos para que as informações comerciais históricas ou atuais se tornem corretas.

Não tens de esperar alguns milissegundos.

A mensagem virá na OnTradeTransaction

ver código

Arquivos anexados:
 
prostotrader:

Não tens de esperar alguns milissegundos.

A mensagem virá na OnTradeTransaction

ver código.

Os guiões não o têm. É estúpido usar o EA+ExpertRemove em vez do script.

Além disso, a OrderSend trava por timeout se não houver resposta do servidor por 180 segundos. Isto sugere que a OnTradeTransaction pode acumular-se para sempre à espera de bilhetes. E a opção de apenas um order_ticket para a OnTradeTransaction, como no seu script, é ruim. Após o envio assíncrono, há um trabalho com listas de encomendas. É por isso que é assíncrono - para trabalhar com lotes. E se não há trabalho com lote, então a assimetria nunca é necessária.

 
O truque MT4-OrderClosePrice também funciona no MT5 -PositionGetDouble(POSITION_PRICE_CURRENT).
Razão: