Qual é o projeto correto? - página 3

 
Techno:
PapaYozh, estas duas opções são apenas para fechar, mas e quanto à modificação? Melhor ter2 carrapatos para processamento completo do que 2 loops diferentes para fechamento e modificação?


Se algo tem que ser fechado e algo tem que ser modificado, então a construção para (i=0; i<OrderTotals(); i++) é ainda mais incorreta.

Temos que passar de OrderTotal()-1 para 0.

for ( i=OrderTotals()-1; i>=0; i-- )
{ 




 

ou seja, este é o projeto correto?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}
 

No entanto, ainda não entendo a normalização.

Uma coisa é se eu calcular o preço, então é claro que ele deve ser levado aos dígitos do terminal.

Mas neste caso, estamos fechando ao preço atual obtido do fluxo e, é claro, não pode ser maior do que Dígitos.

 
valenok2003:

Mas aqui também está fechando ao preço atual derivado do fluxo, que obviamente não pode ser maior que Dígitos.

Isto é para um testador com citações não-normalizadas.
 
valenok2003:

No entanto, ainda não entendo a normalização.

Uma coisa é se eu calcular o preço, então é claro que ele deve ser levado aos dígitos do terminal.

Mas neste caso, estamos fechando ao preço atual obtido do fluxo e, é claro, não pode ser maior do que Dígitos.

Às vezes, com Dígitos=4, a proposta pode ser igual a 1,32343545654. Não com freqüência, mas isso acontece.
 
Techno:
Às vezes, quando Dígitos=4 Bid pode ser 1,32343545654 isto acontece. Não com freqüência, mas isso acontece.


Viver e aprender. Obrigado.
 
valenok2003:

ou seja, este é o projeto correto?


Na verdade, não: não há verificação para o "símbolo" do instrumento. Se as ordens estiverem abertas para mais de um instrumento, então você corre o risco de fechar as ordens de um instrumento aos preços do outro. Se você precisar fechar a ordem do símbolo, em cujo gráfico o Expert Advisor foi movido, então você tem que usar o "símbolo" do gráfico. Se você precisar fechar todas as ordens, não importa para que gráfico o EA é movido, você tem que ler o "símbolo" da ordem e solicitar o uso do "símbolo" do pedido e do "lance" apropriado. E há ações desnecessárias no código.

Boa sorte.

 
valenok2003:

ou seja, este é o projeto correto?

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, Red);
            Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);            
         }
      }
   }
}
Faça-o assim.
 
VladislavVG:


Sim e há ações extras no código.

Se você quer dizer isto
int Total = OrdersTotal();

então há aqui uma variável extra para a transparência do código.

Ou talvez você esteja falando de algo mais?

 
Techno:
Às vezes, em Dígitos=4, a proposta pode ser igual a 1,32343545654. Não com freqüência, mas isso acontece.

No entanto, no exemplo do script close .mq4(na entrega padrão MT4), não há normalização.

   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      cmd=OrderType();
      //---- first order is buy or sell
      if(cmd==OP_BUY || cmd==OP_SELL)
        {
         while(true)
           {
            if(cmd==OP_BUY) price=Bid;
            else            price=Ask;
            result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else error=0;
            if(error==135) RefreshRates();
            else break;
           }
        }
     }
Razão: