Bibliotecas: MT4Orders - página 34

 

Notei uma peculiaridade interessante


Tenho um indicador estatístico (gratuito) para o MT4.

Decidi criar um para o mt5.

A biblioteca chegou na hora certa (sou muito preguiçoso para escrever essa biblioteca sozinho).


Antes disso, eu tinha uma versão para o MT5, mas ela funcionava com suas próprias falhas.


Removi todo o código MQL5 - conectei a biblioteca MT4Orders - e ela não faz sentido na inicialização.


Ao mesmo tempo, tudo está normal no histórico:


e o OrderPrint mostra tudo corretamente (como no histórico).


Tenho negociações selecionadas pelo número do tíquete (sistema complicado e confuso, eu sempre me confundo e depois de um tempo esqueço como funciona :-)) )

Aqui está um trecho de código:

      if(SearchNextTicket(firsttimeticket,ticketREPORT,i,HistoryarrayNumber)==2)
        {
         firsttimeticket=MT45_OrderCloseTime();
        }
      ticketREPORT=MT45_OrderTicket();


A questão é que o próximo tíquete (para estatísticas) é selecionado pela classificação do horário de fechamento e, se o horário for o mesmo, ele é selecionado pelo número do tíquete.

Portanto, nesse caso, ele mostra um absurdo.


Mas se eu adicionar uma string de impressão inofensiva:

 Print("1=== i="+i+" firsttimeticket="+firsttimeticket+" ticketREPORT="+ticketREPORT+" HistoryarrayNumber="+HistoryarrayNumber);
      if(SearchNextTicket(firsttimeticket,ticketREPORT,i,HistoryarrayNumber)==2)
        {
         firsttimeticket=MT45_OrderCloseTime();
        }
      ticketREPORT=MT45_OrderTicket();

então tudo funciona.



Qual é a mágica do Print?


Essa impressão funciona bem:

       Print("1=== i="+i);


essa impressão não funciona mais normalmente.

       Print("1=== i=");
 

Descobri.

int i; // não funciona

int i=0; // tudo funciona

 
Vladislav Andruschenko:

Uma coisa interessante que notei

Escreva um código-fonte curto para reproduzir esse recurso. Assim, será possível agir sem adivinhar.


A seleção por tíquete funciona

#include <MT4Orders.mqh>

void OnStart()
{
  TICKET_TYPE Tickets[];
  
  const int Size = ArrayResize(Tickets, OrdersHistoryTotal());
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Tickets[i] = OrderTicket(); // Memorização de bilhetes
      
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Tickets[i], SELECT_BY_TICKET)) // Escolhido por tíquete
      OrderPrint();
}
 
fxsaber:

Escreva uma fonte curta para jogar esse recurso. Assim, será possível agir sem adivinhar.


A seleção de bilhetes funciona


Provavelmente a culpa é da inicialização das variáveis (para mim).

analisando mais.

 
Andrey Khatimlianskii:

Desenterrei-o em nossa correspondência:

Nessa tarefa.

Um exemplo de tarefa com uma ordem pendente: o nível de definição de uma ordem é calculado com base no histórico de preços, mas é ajustado com base na natureza do movimento dos ticks. Depois que a ordem é acionada e a negociação é fechada, o EA não deve colocar uma ordem com base no mesmo nível de preço (mas pode ser ajustado naquele momento por um valor diferente). Eu armazeno essas informações (o nível ao qual a ordem se refere) na variável principal vinculada ao tíquete. É claro que você pode escrevê-las em um comentário, mas isso nem sempre é conveniente e confiável.

É lógico vincular a OrderTicketOpen. Então, precisamos criar SELECT_BY_TICKET para TicketOpen-transaction, que não temos agora. Bem, e adicionar SELECT_BY_TICKET para o pedido TicketOpen.

Está claro que pode haver várias transações ENTRY_OUT para ambas as variantes do TicketOpen, mas apenas uma deve ser selecionada. Entretanto, para essas tarefas contábeis, essa ambiguidade não é um obstáculo.

Boa observação, obrigado. Eu não tinha pensado em tal arranjo.

 

É interessante que nos relatórios do mt5 tudo é contado de forma diferente dos relatórios do mt4.


no mt4, a classificação é feita pelo horário de fechamento e, se o horário de fechamento de uma operação for o mesmo, ela é contada por ticket.


portanto, no mt5 é diferente, pois a classificação nos relatórios é feita pelo horário de abertura das negociações.

inconveniente.



@fxsaber Como você implementou a classificação? como no mt4, por horário de fechamento? ou como no mt5, por número de tíquete (horário de abertura)?

 
Vladislav Andruschenko:

É interessante que nos relatórios do mt5 tudo é contado de forma diferente dos relatórios do mt4.

No mt4, a classificação é feita pelo horário de fechamento e, se o horáriode fechamento de um negócio for o mesmo, ele será contado por tíquete.

horário de abertura das negociações.

inconveniente.

E não é.

@fxsaber Como você implementou a classificação? como no MT4, por horário de fechamento? ou por número de tíquete (horário de abertura)?

No MT5, a classificação é feita pelo horário de fechamento - é assim que o próprio MT5 coloca seus registros no histórico.

 
fxsaber:

Não é.

E não é.

O MT5 classifica por horário de fechamento - é assim que o próprio MT5 coloca seus registros no histórico.


Estou usando o relatório baixado do mt4.

Quando eu estava criando um indicador estatístico, meus números não correspondiam ao relatório do MT4.

Descobri por experiência própria que, para que todos os números sejam idênticos, todas as posições devem ser classificadas pelo horário de fechamento (e se o horário for o mesmo, classificamos essas posições por negociações).

De acordo com esse princípio, todos os números das estatísticas do meu relatório e do relatório do mt4 são idênticos.

No caso do mt5, não alterei nada em meus cálculos, apenas apliquei sua biblioteca e descobri que a classificação no mt5 ao carregar o relatório é feita pelo horário de abertura.

SELECT_BY_TICKET não funciona corretamente por algum motivo.

 
Vladislav Andruschenko:


Estou usando o relatório baixado do mt4.

Quando criei o indicador de estatísticas, meus números não correspondiam ao relatório do mt4.

Descobri por experiência própria que, para que todos os números sejam idênticos, é necessário classificar todas as posições pelo horário de fechamento (e se o horário for o mesmo, classificamos essas posições por negociações).

De acordo com esse princípio, todos os números das estatísticas do meu relatório e do relatório do mt4 são idênticos.

No caso do mt5, não alterei nada em meus cálculos, apenas apliquei sua biblioteca e descobri que a classificação no mt5 ao carregar o relatório é feita pelo horário de abertura.

SELECT_BY_TICKET não funciona corretamente por algum motivo.

O que funciona perfeitamente no mt4 não funciona perfeitamente no mt5.

 
Vladislav Andruschenko:


Estou usando o relatório baixado do mt4.

Quando criei o indicador de estatísticas, meus números não correspondiam ao relatório do mt4.

Descobri por experiência própria que, para que todos os números sejam idênticos, é necessário classificar todas as posições pelo horário de fechamento (e se o horário for o mesmo, classificamos essas posições por negociações).

De acordo com esse princípio, todos os números das estatísticas do meu relatório e do relatório do mt4 são idênticos.

No caso do mt5, não alterei nada em meus cálculos, apenas apliquei sua biblioteca e descobri que a classificação no mt5 ao carregar o relatório é feita pelo horário de abertura.

Executar

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

Bibliotecas: Relatório

fxsaber, 2018.12.11 12:28 pm.

Para entender imediatamente a aparência do relatório, basta executar este script em sua conta

#define  REPORT_BROWSER      // Criação de um relatório com inicialização do navegador - requer permissão de DLL.
#include <Report.mqh> // https://www.mql5.com/pt/code/18801

void OnStart()
{
  REPORT::ToFile(); // Criar e abrir o relatório no navegador.
}

SELECT_BY_TICKET não funciona corretamente por algum motivo

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

Bibliotecas: MT4Orders

fxsaber, 2019.03.11 21:40

A seleção de tíquetes funciona

#include <MT4Orders.mqh>

void OnStart()
{
  TICKET_TYPE Tickets[];
  
  const int Size = ArrayResize(Tickets, OrdersHistoryTotal());
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Tickets[i] = OrderTicket(); // Memorização de bilhetes
      
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Tickets[i], SELECT_BY_TICKET)) // Escolhido por tíquete
      OrderPrint();
}