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 713

 
7Konstantin7:

Obrigado, não posso fazer isso, apenas pensei que talvez alguém pudesse rabiscar algumas linhas nessa função ou poderia deixar cair uma coruja, a versão final. Não me parece difícil, mas é improvável que alguém ajude.

Há 4 créditos no site mql5 poderia dar) se for possível a transferência entre os participantes.

1. Encontrar a primeira posição aberta no loop e devolver seu bilhete?

 
artmedia70:

1. Você pode encontrar a primeira posição aberta no laço e devolvê-la ao bilhete?

Não consigo imaginar como seria no código), mas de alguma forma consegui acrescentar à EA retirando ordens pendentes, não sou bom em código, apenas um pouco.
 
7Konstantin7:
Não consigo imaginar como será no código) mas por algum milagre consegui acrescentar à EA a remoção de ordens pendentes, não sou bom em códigos, apenas um pouco.

Basta pegá-lo e ver como se fecha em um loop

1:

int i, total = OrdersTotal(); bool rez;

for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}

2:

//Всё тоже самое только поменяй направление цикла
for(i = 0; i < total; i++)
Então você entenderá em que ordem as ordens são fechadas. Não posso dizer com certeza porque não o verifiquei. Eu não preciso disso. Mas esta é outra questão, já foi discutida aqui mais de uma vez e eu não quero repetir tudo novamente.
 
AlexeyVik:

Basta pegá-lo e ver como se fecha em um loop

1:

2:

então você saberá em que ordem as encomendas fecham. Não posso dizer, porque ainda não verifiquei. Eu não preciso disso. Mas este é outro tópico, já foi discutido aqui muitas vezes e não quero repetir tudo isso.
O problema já foi resolvido em particular...
 
artmedia70:
Já resolvemos isso em particular...
Bem, eu não leio seu particular... Eu não sei o que está acontecendo.
 
AlexeyVik:
Bem, eu não leio suas mensagens particulares. e eu não sei o que está acontecendo.
Sim, ele não lê... O que aconteceu com meus chinelos? ;)
 
artmedia70:
Sim, ele não lê... Para onde foram meus chinelos?!?! ;)

Lembre-se que Ioann Vassilievich listou o que ele tomou e não tomou Shpak. Portanto, eu sou seus chinelos.


Tchau. Vou para a cama.

 
AlexeyVik:

Lembre-se que Ioann Vassilievich listou o que ele tomou e não tomou Shpak. Portanto, eu sou seus chinelos.


Adeus. Vou para a cama.

Vou perguntar aos outros sobre os chinelos... Boa noite...
 
AlexeyVik:

Basta pegá-lo e ver como se fecha em um loop

1:

2:

Então você saberá em que ordem os pedidos fecham. Não posso dizer porque ainda não verifiquei. Eu não preciso disso. Mas esta é outra questão, já foi discutida aqui muitas vezes e não tenho nenhum desejo de repetir tudo isso.

Obrigado, já resolveu o problema.

artmedia70:

Pensei que me mandariam para a casa de banho) Obrigado pela ajuda.

 

Olá a todos! Já fiz uma pergunta semelhante na página 711, infelizmente ninguém respondeu, talvez agora alguém...

Estou enfrentando um problema com o fechamento de pedidos de balcão em um pedido de cinco dígitos. A questão é que preciso fechar, digamos, 20 pedidos em compra e 33 em venda quando o lucro total for alcançado. E eu quero fechar 20 ordens de compra e 20 ordens de venda usando a função OrderCloseBy(), e fechar as 13 ordens de venda restantes usando a função OrderClose().

Se tivermos um spread fixo de 4 dígitos, não teremos nenhum problema em fechar o spread e também salvaremos o spread ao usar a função OrderCloseBy(). Se tivermos um spread de 5 dígitos, o spread é flutuante e é por isso que, creio, as ordens não são fechadas quando o lucro total é alcançado, e a função OrderCloseBy() argumenta no log. Ao mesmo tempo, se a executarmos no testador, tudo é fechado normalmente.

As encomendas em uma direção, quando o lucro total é alcançado, são fechadas sem nenhum problema.

Quem encontrou tal problema, e quais são as opções para resolvê-lo?

Eu lhe darei a função de fechar as ordens.

Além disso, a função OrderCloseBy() funciona até mesmo em uma ordem de cinco dígitos.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
Razão: