Ajude-me a fechar a ordem no final do bar!

 

Preciso de ajuda para formular um código que feche a ordem exatamente no final da barra. É para uma EA especial de escalpe, portanto, precisa de precisão precisa. Deixe-me ilustrar o que eu quero dizer:



Agora imagine se eu tivesse algum indicador que me levasse a um longo comércio logo ao abrir a vela marcada com X, então ela subiu e uma vela de baixa se seguiu, com um baixo muito baixo, mas isso não importa, o que importa é que com base em meus cálculos, a saída ideal aqui seria o ponto de fechamento da barra marcada com 1.

A melhor solução que eu poderia pensar por enquanto é esta (no caso deste comércio de compra imaginária):


/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}

Este código fecha o comércio de compra exatamente no Open[0], mas não no Close[1]. Você vê, porque se você olhar na foto e verificar a barra marcada 2, você pode ver que a barra 2 não abriu a esse preço como a anterior fechou-a a um preço ligeiramente diferente.e às vezes uma grande lacuna acontece como aqui:



Assim, a experiência diz isso:

Fechar[1] != Abrir[0]

Em situações muito raras é assim. É por isso que eu preciso que a ordem seja fechada logo no Close[1].

A única solução viável é que, contando o tempo, por exemplo, este é o gráfico M1 e M15, conte o número de segundos ou 60 para M1 ou 900 para M15 em ambos os casos e feche a ordem nos segundos 59 ou 599.

Então vamos recapitular minha pergunta: isto é possível para contar o tempo exatamente como eu descrevi acima, se sim, então como evitar o escorregamento e o problema de atraso de carrapato?

Ou se você encontrar outras soluções como fechar o pedido logo em Close[1] e não Open[0], então eu estou aberto a ele. Por favor, me ajude com isto, este é um problema muito importante da minha EA!

 
Proximus:

Preciso de alguma ajuda para formular um código que feche o pedido exatamente no final da barra.

não há uma situação que você possa dizer que o último tique é um tique antes do último tique da barra atual
 

Modulus, verifique quando não há mais. boa sorte

if( !MathMod( TimeCurrent(), PERIOD_M5 * 60 ) ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );
 
trevone:

Modulus, verifique quando não há mais. boa sorte

Isso não vai funcionar ... será antes do final do bar ou depois dele ... nunca no final do bar. Como deVries disse, não é possível detectar o fim da barra atual, mas podemos detectar o início da próxima . .
 
RaptorUK:
Isso não vai funcionar ... será antes do final do bar ou depois dele ... nunca no final do bar. Como deVries disse, não é possível detectar o fim da barra atual, mas podemos detectar o início da próxima . .


Se pudesse ser sempre antes do fechamento, mas o mais próximo possível do fechamento, então eu aceitaria essa solução também, mas se for apenas 1 vez após o fechamento, então não é melhor do que aquela que eu pensei e, portanto, não é aceitável.


E quanto à outra solução, a de levar 1 segundo antes do fechamento do bar?

Como esta no caso da M1

if( Time[0]>=OrderOpenTime()+59  ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );

Neste caso, como resolver o problema do carrapato se houver algum?

 
Proximus:

Se pudesse ser sempre antes do fechamento, mas o mais próximo possível do fechamento, então eu aceitaria essa solução também, mas se for apenas 1 vez após o fechamento, então não é melhor do que aquela que eu pensei e, portanto, não é aceitável.


E quanto à outra solução, a de levar 1 segundo antes do fechamento do bar?

Como esta no caso da M1

Neste caso, como resolver o problema do carrapato se houver algum?




se não, isso faz você esperar um minuto a mais e também, nesse caso, se houver alguma....
 
Proximus:

Se pudesse ser sempre antes do fechamento, mas o mais próximo possível do fechamento, então eu aceitaria essa solução também, mas se for apenas 1 vez após o fechamento, então não é melhor do que aquela que eu pensei e, portanto, não é aceitável.

As coisas só acontecem em um EA ( e Indicador ) quando há um tick, você não tem como saber quando o último tick de uma barra é até que você tenha o primeiro tick na barra seguinte . . mesmo que o tick esteja a 59 minutos e 59 segundos depois da hora para uma barra H1, ainda pode haver outro tick durante esse segundo . .

Proximus:

E quanto à outra solução, a de levar 1 segundo antes do fechamento da barra?

Assim no caso da M1

Neste caso, como resolver o problema do carrapato se houver algum?

. . e você não pode esperar pelo último segundo da barra porque pode não haver carrapatos nos últimos 5 segundos da barra, nesse caso você nunca "verá" o último segundo da barra.

 
RaptorUK:

As coisas só acontecem em um EA ( e Indicador ) quando há um tick, você não tem como saber quando o último tick de uma barra é até que você tenha o primeiro tick na barra seguinte . . mesmo que o tick esteja a 59 minutos e 59 segundos depois da hora para uma barra H1, ainda pode haver outro tick durante esse segundo . .

. . e você não pode esperar pelo último segundo da barra porque pode não haver carrapatos nos últimos 5 segundos da barra, nesse caso você nunca "verá" o último segundo da barra.

Então eu devo entender que se as taxas de câmbio interbancárias não mudarem em um determinado período de tempo, o corretor não chama para baixo os novos dados de preços?

Pensei que um tick no MT4 significava que ele sempre atualiza o preço após X períodos de segundos, não importa qual seja o preço ou o volume. Então digamos que a taxa de atualização seria de 3 segundos, então você saberia que na M1 você fecharia essa negociação logo aos 57 segundos ou antes.


Dada esta situação, eu não poderia usar o:

RefreshRates();   

para chamar o último tick aos 58 segundos e sair aos 59?

 
Proximus:

Então eu devo entender que se as taxas de câmbio interbancárias não mudarem em um determinado período de tempo, o corretor não chama para baixo os novos dados de preços?

Pensei que um tick no MT4 significava que ele sempre atualiza o preço após X períodos de segundos, não importa qual seja o preço ou o volume. Então digamos que a taxa de atualização seria de 3 segundos, então você saberia que no M1 você teria que fechar essa negociação logo aos 57 segundos ou antes.

Se os preços do Corretor não mudarem, Bid and Ask, não há um novo tick . . por volta da meia-noite GMT em alguns dos pares menos negociados não pode haver ticks por um minuto ou mais. . . um novo tick não é gerado após um tempo predefinido, acontece quando há uma mudança no preço, Bid or Ask ( e talvez em algumas outras circunstâncias, mudança em outros parâmetros do símbolo ) . .

Proximus:

Dada esta situação, eu não poderia usar o :

Para chamar o último tick aos 58 segundos e sair aos 59?

Como as RefreshRates() serão chamadas se não houver nenhum tick ?
 

Obrigado pelo esclarecimento de como funcionam os carrapatos no MT4.

RaptorUK:

Se os preços do Corretor não mudarem, Bid and Ask, não há um novo tick . . por volta da meia-noite GMT em alguns dos pares menos negociados não pode haver ticks por um minuto ou mais. . um novo tick não é gerado após um tempo pré-definido, acontece quando há uma mudança no preço, Bid or Ask ( e talvez em algumas outras circunstâncias, mudança em outros parâmetros do símbolo ) . .

Como será chamado o RefreshRates() se não houver um tick ?

Bem, eu pensei que o RefreshRates() forçará o corretor a chamar um novo conjunto de alimentação de seu provedor de liquidez, mas eu acho que não é.


De qualquer forma, se alguém pode encontrar uma solução melhor para o meu problema do que esta, então, por favor, compartilhe comigo, é muito importante!

/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}
 
Proximus:

Obrigado pelo esclarecimento de como funcionam os carrapatos no MT4.

RaptorUK:

Se os preços do corretor não mudarem, Bid and Ask, não há um novo tick . . por volta da meia-noite GMT em alguns dos pares menos negociados não pode haver ticks por um minuto ou mais. . um novo tick não é gerado após um tempo pré-definido, acontece quando há uma mudança no preço, Bid or Ask ( e talvez em algumas outras circunstâncias, mudança em outros parâmetros de símbolos ) . .

Como as RefreshRates() serão chamadas se não houver nenhum tick ?

Bem, eu pensei que o RefreshRates() forçará o corretor a chamar um novo conjunto de alimentação de seu provedor de liquidez, mas acho que não é.


De qualquer forma, se alguém pode encontrar uma solução melhor para o meu problema do que esta, então por favor, compartilhe comigo, é muito importante!


O melhor que você pode fazer é usar o próximo tick após o último tick da barra, em outras palavras, o primeiro tick da próxima barra.