[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 858

 

É uma pergunta simples, mas não consigo pensar em nada.

Existem 4 posições em aberto em um determinado momento. Estou tentando fechar todos eles da seguinte maneira:

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

Mas eles estão fechados não todos, mas através de um só. De fato, eles têm os seguintes números: 2,4,6,7. Portanto, a 2ª e 6ª posições estão fechadas.

Qual é o truque?

 
usver:

É uma pergunta simples, mas não consigo pensar em nada.

Existem 4 posições em aberto em um determinado momento. Estou tentando fechar todos eles da seguinte maneira:

Mas eles estão fechados não todos, mas através de um só. De fato, eles têm os seguintes números: 2,4,6,7. Portanto, a 2ª e 6ª posições estão fechadas.

Qual é o senão?


O truque é que depois que a posição é fechada, a numeração muda na OrderSelect(i,SELECT_BY_POS,MODE_TRADES) e simultaneamente nem tudo pode ser fechado

SZY: Eu fui muito ajudado pelo fts I. Kim, eu mudei um pouco - removi parênteses extras e puxei em uma linha:

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

pesquise no fórum - você encontrará os originais

 
IgorM:


é que depois de fechar uma posição, a numeração muda em OrderSelect(i,SELECT_BY_POS,MODE_TRADES) e tudo não pode ser fechado simultaneamente

SZY: Eu fui muito ajudado pelo fts I. Kim, eu mudei um pouco - removi parênteses extras e puxei em uma linha:

procure através do fórum - você encontrará o original


Obrigado pela dica e pelo exemplo. Vou investigar isso.

No caminho, vou fazer outra pergunta.

A tarefa é a seguinte: preciso determinar que tipo de ordem desencadeada por um stop loss foi fechada, e comparar uma ordem futura fechada por um stop loss com uma ordem anterior (isto é, comparar seus tipos). Tendo pesquisado a documentação, não consegui encontrar nada relacionado ao processamento do último evento.

Neste ponto, eu implementei esta operação como um fechamento de uma ordem quando ela atinge um limite estabelecido (Bid-OrderOpenPrice() >=TP*Point). Isso me permitiu armazenar em uma variável o tipo do último pedido fechado e compará-lo com o que acabou de ser fechado ( if(type===OrderType())) ). Tudo funciona bem durante os testes, mas eu ainda gostaria de implementá-lo usando stop losses.

Tentei selecionar uma ordem fechada do histórico usando OrderSelect() e o argumento MODE_HISTORY. Como não há condições para fechar ordens, então uma mudança na variável OrdersTotal() pode ser considerada como o gatilho de uma stop loss. Mas encontrei um problema: não consigo encontrar o número da última ordem fechada (já que seu número está mudando constantemente), ou simplesmente ainda não descobri como fazer isso.

A questão é: Como implementá-la usando stop-losses? Talvez haja maneiras muito mais fáceis? Bem, se a direção do pensamento estiver correta, então como encontramos a última ordem fechada?

 
IgorM:


a numeração é alterada em OrderSelect(i,SELECT_BY_POS,MODE_TRADES) após o fechamento de uma posição e todas as posições não podem ser fechadas simultaneamente

SZS: Eu fui muito ajudado pelas funções de I. Kim, eu as mudei um pouco - removi os suportes extras e os puxei para uma única linha:

procure através do fórum - você encontrará o original

Você já disse o suficiente... tudo em uma pilha.
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

É uma pergunta simples, mas não consigo pensar em nada.

Existem 4 posições em aberto em um determinado momento. Estou tentando fechar todos eles da seguinte maneira:

Mas eles estão fechados não todos, mas através de um só. De fato, eles têm os seguintes números: 2,4,6,7. Portanto, a 2ª e 6ª posições estão fechadas.

Qual é o problema?

Você está falando de números em ordem? Ou de ingressos?

 
abolk:

Você está falando de números em ordem? Ou de ingressos?


Eu mesmo já estou confuso. Eles são bilhetes, mas eu os dei para deixar a situação clara. Eles fecham um a um.
 

Viva, eu consegui!!!


Victor muito obrigado, eu tive um erro, não escrevi o nome do indicador corretamente.

 
abolk:
O que você acabou de dizer... tudo em uma pilha
https://docs.mql4.com/ru/trading/OrderSelect


Tente mudar/remover takeaways ou paradas em um grupo de pedidos - a tarefa é simples, mas eu encontrei que, quando a seleção do pedido foi feita usando OrderSelect(i,SELECT_BY_POS,MODE_TRADES), a numeração do pedido mudou bem no corpo do loop e eu consegui modificar um pedido já modificado (sem takeaways) várias vezes - erro #1, e é por isso que eu sugeri que quem tiver um problema semelhante

Por favor, informe - como fazer o indicador recalcular no fechamento de várias barras, por exemplo: quero que o indicador seja recalculado a cada 5 novas barras

 
IgorM:


Por favor, informe - como fazer um indicador recalcular no fechamento de várias barras, por exemplo: quero que o indicador seja recalculado a cada 5 novas barras

Você sabe de programação.

Esta é uma tarefa lógica e não é preciso ser muito esperto para resolvê-la. Pense com sua cabeça.

Há casos diferentes. Onde exatamente deve ser religado, em que TF, como deve ocorrer a religação, etc. Como responder à sua pergunta.

Anote o tempo da barra e após cinco barras reiniciadas desta vez e anote-o novamente. No momento de zerar o tempo, você pode colocar uma condição para recalcular. A função iTime(NULL,0,0) irá ajudar. O resto é tudo lógico.

 
IgorM:


Por favor, informe - como fazer um indicador recalcular no fechamento de várias barras, por exemplo: quero que o indicador seja recalculado a cada 5 novas barras


O método não é o mais confiável, provavelmente, mas funcionará apenas para tentar a idéia (por exemplo, um rascunho).

Use a variável Bars e acompanhe sua mudança. Aumentado em 5, lembrado, etc.