Bibliotecas: MT4Orders - página 21

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: MT4Orders

fxsaber, 2018.04.14 09:10 AM

Exemplo

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


Resultado

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2  buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3  sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2  buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4  sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

No exemplo, você pode ver que, quando o TP/SL é acionado, o comentário original "Hello World!" é completamente substituído pelo comentário do MT5 "tp 1.23614".

No MT4, em tais situações, o comentário se torna "Hello World! tp 1.23614". Devo fazer o mesmo no MT4Orders?

Ou seja, é correto/conveniente que, para fechamentos SL/TP/MO, o comentário da ordem no histórico seja uma combinação do comentário na abertura e no fechamento, como no MT4?

 
fxsaber:

No exemplo, você pode ver que, quando o TP/SL é acionado, o comentário original "Hello World!" é substituído em sua totalidade por seu equivalente no MT5, "tp 1.23614".

No MT4, em tais situações, o comentário se torna "Hello World! tp 1.23614". Preciso fazer o mesmo no MT4Orders?

Ou seja, é correto/conveniente que, para fechamentos de SL/TP/MO, o comentário da ordem no histórico seja uma combinação do comentário na abertura e no fechamento, como é no MT4?

Eu sugeriria algo assim:

Original_Comment[tp: 1.23614] (já que às vezes é necessário analisar o comentário)

com registro de situações anormais quando o comprimento do comentário exceder os limites

 
fxsaber:

No exemplo, você pode ver que, quando o TP/SL é acionado, o comentário original "Hello World!" é substituído em sua totalidade por seu equivalente no MT5, "tp 1.23614".

No MT4, em tais situações, o comentário se torna "Hello World! tp 1.23614". Preciso fazer o mesmo no MT4Orders?

Ou seja, é correto/conveniente que, para fechamentos SL/TP/MO, o comentário da ordem no histórico seja uma combinação do comentário na abertura e no fechamento, como no MT4?

O OrderComment, assim como o OrderCommission, está na biblioteca e agora está muito lento (perceptível em várias chamadas). Está claro que isso se deve apenas às especificidades do MT5 (dividindo esses dados em duas negociações).

Talvez seja melhor adicionar OrderCommentOpen? Bem, ou fazer uma variante completamente universal: OrderCommentOpen, OrderCommentClose e OrderComment, tentando emular o comportamento do MT4.

Ainda estou pensando em um cache para OrderCommission e OrderComment pesados, ou para minha própria lista de negociações, que no meu caso específico é a mesma coisa.

 
Andrey Khatimlianskii:

O OrderComment, assim como o OrderCommission, está muito lento na biblioteca agora (perceptível em várias chamadas). Está claro que isso se deve apenas às especificidades do MT5 (divisão desses dados em duas transações).

Isso não deve afetar o tempo real.

Talvez seja melhor adicionar OrderCommentOpen? Bem, ou criar uma variante universal: OrderCommentOpen, OrderCommentClose e OrderComment, tentando emular o comportamento do MT4.

Talvez valha a pena acrescentar isso. No momento, isso pode ser feito assim (para ordens históricas do MT4)

string OrderCommentOpen()
{
  return(HistoryDealSelect(OrderTicketOpen()) ? HistoryDealGetString(OrderTicketOpen(), DEAL_COMMENT) : NULL);
}

string OrderCommentClose()
{
  return(HistoryDealSelect(OrderTicket()) ? HistoryDealGetString(OrderTicket(), DEAL_COMMENT) : NULL);
}

Ainda estou pensando em um cache para OrderCommission e OrderComment pesados, ou para minha própria lista de negociações, que, no meu caso específico, é a mesma coisa.

Se criarmos um cache, ele deverá ser para todo o histórico. E é melhor fazer isso com base na Generic-bible, eu acho. A única desvantagem é que isso consumirá muita memória no VPS.

O MQ fez um bom trabalho com o histórico no Tester - ele se tornou rápido. Quando foi acelerado, os pensamentos sobre o tópico de armazenamento em cache foram embora (havia versões brutas da Bíblia), porque não vi que seria significativamente mais rápido. Além disso, não consegui criar um TS para o Tester, no qual o histórico de negociação afetaria seriamente a lógica.

É impossível armazenar o histórico em cache em tempo real - ele pode ser corrigido retroativamente. E por que economizar microssegundos em tempo real?

 
fxsaber:

O tempo real não deve ser afetado.

Talvez valha a pena acrescentar. Agora isso pode ser feito da seguinte forma (para ordens históricas do MT4)

Se fizermos um cache, ele deverá ser para todo o histórico. E é melhor fazer isso com base na Generic-bible, provavelmente. Há apenas uma desvantagem: ele consumirá muita memória no VPS.

O MQ fez um bom trabalho com o histórico no Tester - ele se tornou rápido. Quando foi acelerado, os pensamentos sobre o tópico de armazenamento em cache foram embora (havia versões brutas da Bíblia), porque não vi que seria significativamente mais rápido. Além disso, não consegui criar um TS para o Tester, no qual o histórico de negociação afetaria seriamente a lógica.

É impossível armazenar o histórico em cache em tempo real - ele pode ser corrigido retroativamente. E por que economizar microssegundos em tempo real?

Se entendi corretamente, tenho um TS: em um determinado momento, começamos a entrar no mercado por sinal, eventualmente fazemos várias compras e vendas e, no final da sessão, fechamos tudo como está. No dia seguinte, fazemos um círculo, mas os lotes já são calculados pelo histórico de fechamento da última sessão, ou seja, entramos no histórico e vemos se fechamos com lucro ou prejuízo.
Ou seja, sem acesso ao histórico, o TS não pode ser usado.

 
Vitaly Muzichenko:

Se entendi bem, tenho um TS que funciona: em um determinado horário começamos a entrar no mercado em um sinal, eventualmente fazemos várias compras e vendas, no final da sessão fechamos tudo como está. No dia seguinte, fazemos um círculo, mas os lotes já estão calculados com base no histórico de fechamento da última sessão, ou seja, entramos no histórico e vemos se fechamos com lucro ou prejuízo.
Ou seja, sem acesso ao histórico, o TS não pode ser usado.

A palavra-chave nessa frase foi "seriamente". Está claro que o histórico de negociação pode interferir na lógica de negociação. O problema é o TS, que começa a ficar visivelmente mais lento no testador ao acessá-lo.

 
fxsaber:

O tempo real não deve ser afetado.

Talvez valha a pena acrescentar. Agora isso pode ser feito da seguinte forma (para ordens históricas do MT4)

Se fizermos um cache, ele deverá ser para todo o histórico. E é melhor fazer isso com base na Generic-bible, provavelmente. Há apenas uma desvantagem: ele consumirá muita memória no VPS.

O MQ fez um bom trabalho com o histórico no Tester - ele se tornou rápido. Quando foi acelerado, os pensamentos sobre o tópico de armazenamento em cache foram embora (havia versões brutas da Bíblia), porque não vi que seria significativamente mais rápido. Além disso, não consegui criar um TS para o Tester, no qual o histórico de negociação afetaria seriamente a lógica.

É impossível armazenar o histórico em cache em tempo real - ele pode ser corrigido retroativamente. E por que economizar microssegundos em tempo real?

Você mostrou uma vez um código que pesquisa o histórico em busca de "padrões" semelhantes.

Aqui está um TS simples com um histórico profundo:

Analisamos o "padrão de forma" do preço atual em um determinado período de tempo, de "agora" a "um pouco no passado (dia de negociação, por exemplo)", procuramos todos os padrões de preços semelhantes no histórico, classificamos por "grau de coincidência", selecionamos algumas partes mais coincidentes dessa "imagem" no histórico. Analisamos o histórico com E/S virtual e obtemos recomendações sobre entradas/saídas para o estado atual. Você pode até mesmo atribuir um "peso" a cada recomendação com base nos resultados da análise dos padrões históricos.

 
Artyom Trishkin:

Certa vez, você mostrou um código que busca "padrões" semelhantes no histórico.

Aqui está ele.

Aqui está o TS mais simples com histórico profundo:

Observamos o "padrão de forma" do preço atual em um determinado período de tempo, de "agora" a "um pouco no passado (dia de negociação, por exemplo)", pesquisamos todos os padrões de preços semelhantes no histórico, classificamos por "grau de coincidência", selecionamos algumas partes mais coincidentes dessa "imagem" no histórico. Analisamos o histórico com E/S virtual e obtemos recomendações sobre entradas/saídas para o estado atual. Você pode até mesmo atribuir um "peso" a cada recomendação com base nos resultados da análise dos padrões históricos.

Aparentemente, você não entendeu. Eu quis dizer histórico de negociação.

Библиотеки: Кроссплатформенная библиотека оригинальных математических функций
Библиотеки: Кроссплатформенная библиотека оригинальных математических функций
  • 2017.03.27
  • www.mql5.com
Кроссплатформенная библиотека оригинальных математических функций: Автор: fxsaber...
 

Uma TC na qual a história influenciaria seriamente a lógica é uma TC adaptativa.

Qual é o obstáculo?

 
Алексей Тарабанов:

Uma TC na qual a história influenciaria seriamente a lógica é uma TC adaptativa.

Onde você tropeçou?

Você precisa de um exemplo de um TS no qual o histórico de negociação (não o histórico de preços) afeta significativamente o tempo de backtest.