mql5 - linha vertical depois de um certo tempo desde o último comércio - página 2

 
Vladimir Karputov:

Gostaria de esclarecer o termo "último comércio".

É o último negócio dentro do dia atual? Ou para os últimos N dias?

O último acordo em 24 horas - você não precisa voltar mais atrás na história.

 
renatmt5:

a última transação em 24 horas - não há necessidade de ir mais longe na história.

É assim que funciona:

O indicador usa o código para criar, mover e excluir uma linha vertical da ajudaOBJ_VLINE. (só a criação de linhas funciona no indicador até agora). O nome da linha é definido no parâmetro de entrada"Vertical line name".

Último negócio Mover linha vertical

Alinha vertical é criada em OnOnit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


Para minimizar a carga, nós interrogamos o histórico uma vez por minuto. Para este fim, vamos declarar a variávelExtLastMove na área das variáveis globais de nosso programa (neste caso, no indicador)

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- esta variável armazenará a hora do último acesso ao histórico comercial.


Então em OnCalculate(), subtraímos o tempo armazenadoExtLastMove do tempo atual (tempo da última cotação usando qualquer símboloTimeCurrent) e se a diferença for inferior a 60 segundos, saímos.

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

se a diferença for maior, então registramos um novo tempo emExtLastMove.


O histórico comercial é acessado usando LastProfitForPeriod().

Duas datas são usadas aqui: de e para. A data "Até" é definida para o futuro (a hora atual mais um dia), adata "De" é obtida pela subtração de 24 horas da hora atual

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


É tudo por agora, é muito texto...

Arquivos anexados:
 
Vladimir, muito obrigado por seu código e especialmente pelos comentários a seus fragmentos!
Eu não entendo apenas, por que precisamos_datar igual ao futuro? Pode estar à altura do momento atual? Parece que não podemos determinar o resultado do acordo no futuro :) Ou será que precisamos deste dia no futuro para traçar a linha no tempo futuro?
Outra pergunta sobre o loop.
Até onde eu entendo, carregamos um array com dados sobre negócios e fazemos um loop através do array desde o negócio zero até o último negócio, comparando o tempo com o último escrito e sobregravando a variável last_time, se o negócio_time for mais tarde. Ou talvez o contrário seja verdade - a matriz pode ser pesquisada a partir do final? Na verdade, o último elemento da matriz será a última transação fechada para a qual precisamos de dados?
Talvez eu cometa alguns erros lógicos - por favor, não julgue de forma muito dura :)
 
significados para(uint i=0;i<total;i++) mudar para for(uint i=total;i>=0;i--)
 
Em geral, você também não precisa de um loop - basta acessar o elemento de matriz com o número ordinal i=total
 
Eu só não entendo porque precisamos_datar igual para bater no futuro?

Precisamos disso dessa maneira. Para ter garantia "de" e para o tempo atual.

Ou talvez seja possível pesquisar a matriz a partir do final?

Se a tarefa é encontrar o último acordo, então a matriz deve passar e procurar precisamente o tempo - caso algo aconteça ou a lógica interna do núcleo seja alterada e os acordos serão reiniciados em momentos diferentes.

 
Vladimir Karputov:

Esta é a maneira de fazer isso. Para ter a garantia de "de" e para a hora atual.

Se a tarefa é encontrar o último acordo, então o Array deve passar e procurar a hora exata - caso algo aconteça ou a lógica interna do kernel mude e os acordos sejam descartados aleatoriamente.

Ok, entendi. Em princípio, dada a limitação do histórico de 24 horas, não haverá claramente nenhuma carga significativa ao passar pelos dados :)

 
renatmt5:

OK, entendi. Em princípio, dado o limite de 24 horas de história, não haverá claramente nenhuma carga de trabalho significativa quando se analisarem os dados :)

Portanto, o toque final é mover a linha de acordo com o lucro obtido.

Você se lembra quais são as regras da mudança?

 
Entendo corretamente que o último_tempo e o resultado são as variáveis com as quais estamos trabalhando. O resultado determina por quanto tempo a linha será deslocada (redesenhada) para o futuro. Então o bloco de código "Lucro do período" deve ser colocado antes do bloco "Mover a linha vertical" para mover a linha levando em conta os dados do último negócio.
É correto ou estou confundindo algo?
 

Aqui está uma explicação de porque o parâmetro "antes" deve ser feito no futuro:

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

Erros, bugs, perguntas

Renat Fatkhullin, 2016.11.04 12:43

Nunca faça TimeCurrent() como uma data final, faça TimeCurrent()+86400 para garantir que todas as negociações finais sejam capturadas.

TimeCurrent não é a última vez exata, mas o "último tempo conhecido do servidor durante as atualizações", que não é 100% exato. Especialmente no início.


Razão: