Qual é o projeto correto? - página 4

 
Martingeil:
Faça-o assim.

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

É esta linha que é confusa. Não creio que seja necessário aqui. Ou eu estou errado?

 
valenok2003:

É esta linha que é confusa. Não creio que seja necessário aqui. Ou eu estou errado?

É para cortar o símbolo mágico

Ao procurá-la primeiro procura por ordens simplesmente pelo símbolo sem um magik, se não houver tais ordens a função deixa de funcionar........., se encontrar ordens com tal símbolo, então procura entre elas para encontrar um magik, e fecha aquelas que correspondem ao magik, se o fluxo comercial for livre.

 
valenok2003:

É esta linha que é confusa. Não creio que seja necessário aqui. Ou eu estou errado?

Se estamos falando em apagar todos os pedidos, então esta linha é desnecessária, quanto à normalização, o que o faz pensar que os scripts embutidos são tais que devem ser tomados como exemplo?
 
Martingeil:

Precisava cortar a majestade desse personagem em particular

Ao pesquisá-la, primeiro procura ordens simplesmente pelo símbolo sem um majic, se não houver, pára a função, se houver ordens com tal símbolo, passa por elas, e encontra aquelas que combinam com o majic, e as fecha se o fluxo comercial for livre.

E como conhecemos antecipadamente o MagicNumber, porque o obtemos usando o OrderMagicNumber(). E além da linha
OrderSymbol() == Symbol()

é duplicado.

Também esta linha

Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);

Se não houver um tal majik, a função deixa de funcionar e os busca se houver um tal majik.

 
Techno:
Se estamos falando em apagar todos os pedidos, então esta linha é desnecessária, como para a normalização, o que o faz pensar que os scripts embutidos são tais que devem ser tomados como exemplo?


bem, marx, afinal de contas.
 
Martingeil:

Necessidade de cortar o magik deste símbolo em particular

ao procurar uma ordem, primeiro procura uma ordem sem um número mágico; se não existirem tais ordens, a função deixará de funcionar......... se encontrar uma ordem com tal número, então ela passa por todas elas para encontrar um número mágico e fecha todas elas que correspondem a um número mágico se o fluxo comercial for livre.

Entendo, só estou falando de fechar todas as encomendas, por isso não entendi a princípio.

Tomei a liberdade de rearranjar seu exemplo desta forma:

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      if (OrderMagicNumber() == MagicNumber)
      {
        while (!IsTradeAllowed()) Sleep(1000);
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
      }
    }
  }

mas para fechar todas as ordens

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
 
valenok2003:


Bem, Marx, afinal de contas.
mesmo Engels ) sem necessidade de cultos de personalidade, escreva com base em seus conhecimentos)
 
valenok2003:
Se você quer dizer isto

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

Ou talvez você esteja falando de algo mais?

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;
      }        
    }
  }  
}

Neste caso, é isto.

O "padrão comum" para C/C++ é :

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total-1; i >=0; i--)                                                        
  {                                                                                          
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
      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;
      }        
    }
  }  
}

A diferença no número de operações. Se não afetar muito neste caso, a diferença de estilos para o testador, por exemplo, terá um efeito perceptível sobre o tempo de otimização. Para o mundo real, ela afeta a velocidade, que às vezes é crítica.

Especialmente a frenagem é um projeto assim (eu não o vi em seu site, mas por alguma razão a maioria das pessoas prefere ? ) :

for (int i=0; i<OrdersTotal(); i++)

Aqui uma função é chamada em cada passagem do laço. É a operação mais "cara" em termos de custo computacional.

Boa sorte.

Vejo que você consertou os códigos nesse sentido.

 

O resultado é este roteiro

//+------------------------------------------------------------------+
//|                                           CloseThisSymbolAll.mq4 |
//+------------------------------------------------------------------+
int start()
{
//----
  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
//----
   return(0);
}
//+------------------------------------------------------------------+
Pergunta - Por que não fecha sempre todos os pedidos? Por exemplo, eu abro três ordens de venda seguidas, depois tento fechá-las com o roteiro, pode fechar uma ou duas ou todas elas. Qual é a razão?
 

Cara, essa é uma maneira infernal de escolher o errado entre todas as opções. Você não deveria estar codificando, garoto.

Não está fechando por causa das recotações.

Razão: