Usei Open ao invés de Time porque uma vez que o Open de um bar ocorre, ele é fixo para sempre e nunca mudará. Não está procurando por duas barras consecutivas - é a mesma barra e está perguntando se a abertura da barra atual durante a qual o carrapato acaba de ocorrer é a mesma que o valor de Aberto armazenado no ThisBarOpen. Além disso, eu teria pensado que Open seria mais simples do que Time porque é uma simples consulta de dados, enquanto o Time poderia ter que fazer referência a outra coisa e possivelmente fazer algum tipo de cálculo.
Re Counter--; eu não mudei isso porque outro EA não seria capaz de fechar uma ordem porque o código verifica que tanto o MagicNumber quanto o Symbol() são o mesmo primeiro.
Certamente, tomo o ponto sobre um corte de energia limpando o conteúdo do BuyTicket, mas isso não aconteceu durante meus testes e meu código ainda está funcionando muito lentamente. Portanto, também não consigo ver como isso pode ser a causa.
Minha principal pergunta no momento é por que levou tanto tempo para remover os EAs das janelas do terminal que tinha posições abertas e sem tempo algum para removê-los do terminal que não tinha posições abertas. Coincidência talvez - mas todas as quatro janelas?
Da última vez eu tive o mesmo problema e na verdade é como você codifica a ea. Talvez seja hora de sua ea precisa ser escrita do zero novamente. v2, por exemplo.
se você fizer disso uma int estática você pode fechar seu pedido explicitamente por esse número de bilhete sem arrastá-lo através do pool de pedidos para ele.
Re Counter--; eu não mudei isso porque outra EA não poderia fechar um pedido porque o código verifica que tanto o MagicNumber quanto o Symbol() são o mesmo primeiro.
Minha principal pergunta no momento é por que demorou tanto tempo para remover os EA das janelas do terminal que tinha posições abertas e sem tempo algum para removê-los do terminal que não tinha posições abertas. Coincidência talvez - mas todas as quatro janelas?
Você entende como funcionam os loops?
if(BuyTicket!=0)
{
if(SmallMA<MediumMA)
{
for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
{
SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
{
// while(IsTradeContextBusy()) Sleep(10);
Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
if(Closed) BuyTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");
}
Counter--;
}
}
}
Digamos que você tenha 3 ordens abertas
Na primeira passagem, counter==0, então a ordem com o índice 0 será selecionada
No final do loop você diminui o contador em 1, então counter== -1.
Antes que o laço execute novamente, o contador é aumentado em 1 como parte da função para a função. Portanto, contador ==0
Portanto, a próxima passagem pelo contador de laço==0 novamente!! e assim por diante e assim por diante.
Você está preso em um loop interminável que simplesmente continua verificando o índice de ordem 0
A única maneira de parar é se não houver ordens em aberto, porque então OrdensTotal - 1 será -1 e 0 não é <= -1
Muito obrigado GumRaj - você resolveu meu problema!! Agora funciona bem. Esta é a primeira vez que escrevo código em MQL4, portanto, é um processo de aprendizado para mim. Estava confuso sobre como o for loop funcionava.
E como você resolveu isso? Se você não estiver em contagem regressiva, você ainda tem um problema (#3) - apenas escondido até que você tenha vários pedidos ou vários EAs.
Ela precisa diminuir se fechar uma ordem para corresponder ao que acontece na piscina, mas não se não fechar uma ordem. Se ele decreta sem fechar uma ordem, entra em um loop infinito.
Você ainda tem o Counter...
Veja o comentário de GumRai https://www.mql5.com/en/forum/151167/page2#954622
Obrigado por seus cargos.
Usei Open ao invés de Time porque uma vez que o Open de um bar ocorre, ele é fixo para sempre e nunca mudará. Não está procurando por duas barras consecutivas - é a mesma barra e está perguntando se a abertura da barra atual durante a qual o carrapato acaba de ocorrer é a mesma que o valor de Aberto armazenado no ThisBarOpen. Além disso, eu teria pensado que Open seria mais simples do que Time porque é uma simples consulta de dados, enquanto o Time poderia ter que fazer referência a outra coisa e possivelmente fazer algum tipo de cálculo.
Re Counter--; eu não mudei isso porque outro EA não seria capaz de fechar uma ordem porque o código verifica que tanto o MagicNumber quanto o Symbol() são o mesmo primeiro.
Certamente, tomo o ponto sobre um corte de energia limpando o conteúdo do BuyTicket, mas isso não aconteceu durante meus testes e meu código ainda está funcionando muito lentamente. Portanto, também não consigo ver como isso pode ser a causa.
Minha principal pergunta no momento é por que levou tanto tempo para remover os EAs das janelas do terminal que tinha posições abertas e sem tempo algum para removê-los do terminal que não tinha posições abertas. Coincidência talvez - mas todas as quatro janelas?
Não sei se isso é realmente relevante para seu problema, mas você limita sua negociação a 1 compra, 1 venda por EA, então por que fazer tudo isso?
Você já tem aqui o número do seu bilhete:
se você fizer disso uma int estática você pode fechar seu pedido explicitamente por esse número de bilhete sem arrastá-lo através do pool de pedidos para ele.
Obrigado por seus cargos.
Re Counter--; eu não mudei isso porque outra EA não poderia fechar um pedido porque o código verifica que tanto o MagicNumber quanto o Symbol() são o mesmo primeiro.
Minha principal pergunta no momento é por que demorou tanto tempo para remover os EA das janelas do terminal que tinha posições abertas e sem tempo algum para removê-los do terminal que não tinha posições abertas. Coincidência talvez - mas todas as quatro janelas?
Você entende como funcionam os loops?
Digamos que você tenha 3 ordens abertas
Na primeira passagem, counter==0, então a ordem com o índice 0 será selecionada
No final do loop você diminui o contador em 1, então counter== -1.
Antes que o laço execute novamente, o contador é aumentado em 1 como parte da função para a função. Portanto, contador ==0
Portanto, a próxima passagem pelo contador de laço==0 novamente!! e assim por diante e assim por diante.
Você está preso em um loop interminável que simplesmente continua verificando o índice de ordem 0
A única maneira de parar é se não houver ordens em aberto, porque então OrdensTotal - 1 será -1 e 0 não é <= -1