Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 408

 
khorosh:
Para avaliar a exatidão do código, você precisa saber exatamente o que o autor queria obter. Suas informações são insuficientes. O que você queria obter não é muito claro. Se você queria compensar a perda após o fechamento da grade abrindo uma ordem oposta e esperando que o preço passe na direção da última ordem alguns pontos, o processo de compensação depende tanto do lote para esta ordem quanto da distância que o preço passará na direção favorável. Isso significa que quando você calcula o lote, você também deve definir a distância que o preço terá que passar para compensar a perda. Mas talvez você queira dizer algo mais.


Sim, eu deveria ter escrito com mais precisão. É que eu já expus por completo duas vezes o que esta função deve fazer, mas ninguém respondeu. Mais uma vez, o que esta função deve fazer. Suponha que eu tenha uma grade de ordens. Não importa se eles são abertos com o mesmo passo ou não, não importa. Uma ordem foi aberta mais cedo e outra mais tarde, ou seja, cada posição passou por uma quantidade diferente de pontos com um lote diferente. A grade será fechada de acordo com certas condições e eu preciso calcular o LOT necessário para cobrir a perda incorrida a partir dessa grade para os pontos TP. Para evitar escrever duas funções de espelho, introduzi um parâmetro de tipo na função.

No entanto, cometi um erro em algum lugar. Por favor, ajude-me a corrigi-lo.

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

Existe alguma maneira de implementá-la corretamente para que feche a partir do zero? Se possível, uma linha de código, por favor.
Percorrer toda a lista (de pedidos) na direção desejada e colocar os valores do Ticket em uma matriz, depois apagar os pedidos forçando essa matriz.
 
BeerGod:

Existe alguma maneira de implementá-la corretamente para que feche a partir do zero? Se possível, uma linha de código, por favor.


Apenas uma solução rápida:

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

Sim, eu deveria ter escrito com mais precisão. É que eu já expus por completo duas vezes o que esta função deve fazer, mas ninguém respondeu. Mais uma vez, o que esta função deve fazer. Suponha que eu tenha uma grade de ordens. Não importa se eles são abertos com o mesmo passo ou não, não importa. Uma ordem foi aberta mais cedo e outra mais tarde, ou seja, cada posição passou por uma quantidade diferente de pontos com um lote diferente. A grade será fechada de acordo com certas condições e eu preciso calcular o LOT necessário para cobrir a perda incorrida a partir dessa grade para os pontos TP. A fim de não escrever duas funções de espelho, introduzi um parâmetro de tipo na função.

Mas ainda há um erro em algum lugar. Por favor, ajude-me a consertá-lo.



Eu tomaria um caminho diferente. Em primeiro lugar, eu calcularia a perda decorrente do fechamento da grade. E então é tão simples quanto isso. Perda = Lucro do próximo pedido. Expresse o lucro do pedido através do lote e TP e encontre o lote a partir da equação.
 
Contender:


Um trabalho manual rápido:


Muito obrigado, tudo está funcionando corretamente, graças a todos os que responderam!


 
khorosh:
Eu tomaria um caminho diferente. Em primeiro lugar, eu calcularia a perda decorrente do fechamento da grade. E então é tão simples quanto isso. Perda = Lucro do próximo pedido. Expresse o lucro do pedido através do lote e TP e encontre o lote a partir da equação.


A perda no final da rede é em dinheiro ou em gratificações?
 
Trader7777:

a perda por fechar a grelha em dinheiro ou em gratificações?
Na moeda do depósito.
 
E quanto ao fato de cada par ter um preço de ponto diferente?
 
Trader7777:
E quanto ao fato de cada par ter um preço de ponto diferente?
Por que você gostaria de fazer isso?
 
Trader7777:
E quanto ao fato de cada par ter um preço de ponto diferente?

Aqui você pode ver como ele é implementado


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo