Dobrando a Entrada

 

Bom dia amigos,


Tenho um EA que efetua 1 ENTRADA por vez, seja comprado ou vendido. Pra isso antes da ENTRADA eu verifico se existe alguma ordem em aberto, dessa forma:

bool SemPosicao()
  {
   return !PositionSelect(_Symbol); //Retorna Verdadeiro se não houver posição em Aberto
  }

e na hora da compra só verifico se foi true ou false

void OnTick()
  {
//---
   
   if(!simbolo.RefreshRates())
      return;
   
   if(HorarioEntrada())
     {
      if(SemPosicao())
        {
         int resultado_cruzamento=Cruzamento();
         if(resultado_cruzamento==1)
            Compra();
         if(resultado_cruzamento==-1)
            Venda();
        }
     }

   if(HorarioFechamento())
     {
      if(!SemPosicao())
         Fechar();
     }
  }

Simples assim.

Em Ambiente de Tester funciona perfeitamente.

Mas ao colocar numa VPS e mandar rodar em conta real, ele está efetuando duas operações ao mesmo tempo, como se existisse dois EAs.  Mas já me certifiquei que apenas o VPS tá rodando o EA, localmente eu até fechei meu MT5 para certificar-me que não está rodando local + VPS. Mesmo assim continua dobrando.

Se alguém puder me ajudar, agradeço muito. Obrigado.

Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
Alugar um servidor virtual diretamente dos terminais MetaTrader 4 e MetaTrader 5 é a melhor maneira de garantir um trabalho ininterrupto de seus robôs de negociação e das assinaturas de Sinais. Essencialmente, ele é análogo a um VPS, no entanto, ele é melhor e mais adequado para atender às necessidades e desafios que um trader se depara. O...
 
Ruy Christian Hoffmann:

Bom dia amigos,


Tenho um EA que efetua 1 ENTRADA por vez, seja comprado ou vendido. Pra isso antes da ENTRADA eu verifico se existe alguma ordem em aberto, dessa forma:

e na hora da compra só verifico se foi true ou false

Simples assim.

Em Ambiente de Tester funciona perfeitamente.

Mas ao colocar numa VPS e mandar rodar em conta real, ele está efetuando duas operações ao mesmo tempo, como se existisse dois EAs.  Mas já me certifiquei que apenas o VPS tá rodando o EA, localmente eu até fechei meu MT5 para certificar-me que não está rodando local + VPS. Mesmo assim continua dobrando.

Se alguém puder me ajudar, agradeço muito. Obrigado.

Olá.

Eu faria assim como abaixo. Veja se funciona.

Ou verifique se por ser tão rápido você acaba comprando a mercado a primeira e segunda antes de ter um posição em aberto. Talvez criar um NotBefore entre uma compra e outra de alguns segundos para permitir estar posicionado.

bool SemPosicao()
  {
   if PositionSelect(_Symbol) == false // não existe ordem em aberto vai retornar true para SemPosição e permitir comprar e vender.
   {
     return(true);
   }
   else
   {
     return(false);
   }
  }
 
Ivan Ronchi:

Olá.

Eu faria assim como abaixo. Veja se funciona.

Ou verifique se por ser tão rápido você acaba comprando a mercado a primeira e segunda antes de ter um posição em aberto. Talvez criar um NotBefore entre uma compra e outra de alguns segundos para permitir estar posicionado.

Ivan, pensei nisso, pode ser que esteja duplicando pelo tempo entre processar o EA e executar a primeira ordem. Vou testar com o NotBefore. 

Obrigado Ivan :) Segunda lhe dou retorno se vai funcionar.

 
Ruy Christian Hoffmann:

Bom dia amigos,


Tenho um EA que efetua 1 ENTRADA por vez, seja comprado ou vendido. Pra isso antes da ENTRADA eu verifico se existe alguma ordem em aberto, dessa forma:

e na hora da compra só verifico se foi true ou false

Simples assim.

Em Ambiente de Tester funciona perfeitamente.

Mas ao colocar numa VPS e mandar rodar em conta real, ele está efetuando duas operações ao mesmo tempo, como se existisse dois EAs.  Mas já me certifiquei que apenas o VPS tá rodando o EA, localmente eu até fechei meu MT5 para certificar-me que não está rodando local + VPS. Mesmo assim continua dobrando.

Se alguém puder me ajudar, agradeço muito. Obrigado.

Você está operando uma conta Netting?
 
Ivan Ronchi:

Olá.

Eu faria assim como abaixo. Veja se funciona.

Ou verifique se por ser tão rápido você acaba comprando a mercado a primeira e segunda antes de ter um posição em aberto. Talvez criar um NotBefore entre uma compra e outra de alguns segundos para permitir estar posicionado.

Sim!   Crie uma variavel GLOBAL e use junto com a Compra e Venda, assim você já trava o EA para não abrir mais nada...

Depois, caso dê erro de Ordem, ou saia depois da operação, você zera essa variável, liberando o EA pra mais um novo trade.

;)

 
Flavio Jarabeck:
Você está operando uma conta Netting?

Flavio, estou operando somente em VPS e com 1 única conta da Corretora  (Rico). Não sei o que seria operar em Netting.

 
Flavio Jarabeck:

Sim!   Crie uma variavel GLOBAL e use junto com a Compra e Venda, assim você já trava o EA para não abrir mais nada...

Depois, caso dê erro de Ordem, ou saia depois da operação, você zera essa variável, liberando o EA pra mais um novo trade.

;)

Flávio, entendi, é exatamente esse o passo que estou testando agora. Vou ver como se comporta nas próximas entradas. Obrigado.

 
Ruy Christian Hoffmann:

Flavio, estou operando somente em VPS e com 1 única conta da Corretora  (Rico). Não sei o que seria operar em Netting.

https://www.metatrader5.com/pt/mobile-trading/android/help/trade/general_concept
Princípios Gerais - Negociação - Ajuda para a MetaTrader 5 Android
Princípios Gerais - Negociação - Ajuda para a MetaTrader 5 Android
  • www.metatrader5.com
Uma ordem é uma instrução dada a um corretora para comprar ou vender um instrumento financeiro. Existem dois tipos de ordens principais : à mercado e pendente. Além disso, há as ordens especiais de Take Profit e Stop Loss. Um negócio é a execução de uma operação de compra ou venda de um ativo. A compra é executada no preço de venda, e a venda é...
 
Ruy Christian Hoffmann:

Flávio, entendi, é exatamente esse o passo que estou testando agora. Vou ver como se comporta nas próximas entradas. Obrigado.

Cara tenta fazer que nem ta aqui que n da esse problema.

https://www.mql5.com/pt/articles/481

So lembra de setar SetAsyncMode pra false e não true.

Operações de negócios no MQL5 - São fáceis
Operações de negócios no MQL5 - São fáceis
  • www.mql5.com
Quase todos os negociadores chegam ao mercado para fazer dinheiro, mas alguns também apreciam o processo em si. No entanto, não é apenas a negociação manual que pode lhe proporcionar uma experiência emocionante. O desenvolvimento de sistemas automatizados de negociação também pode ser bastante impressionante. Criar uma negociação automática...
 
Ricardo Rodrigues Lucca:

Cara tenta fazer que nem ta aqui que n da esse problema.

https://www.mql5.com/pt/articles/481

So lembra de setar SetAsyncMode pra false e não true.

Ricardo, fantástico, vários códigos para eu estudar. Vou olhar. Mas já adianto que fiz algo simples que funcionou. Como meus Candles não são de 1 minuto, então para eu "barrar" a situação de duplicidade no mesmo candle, eu usei uma variável Global. Nela alimento a primeira entrada com o minuto da operação. Se ele tentar fazer uma segunda entrada onde seja == minuto da entrada anterior, ele não prossegue com a segunda entrada. Por fim quando fecha o candle eu zero o minuto e começa tudo de novo. Aparentemente funcionou :)