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 711

 
LBatters:

Olá a todos)

Tentei escrever uma função para fechar uma parte da posição, mas quando corro no testador, 138 está surgindo um erro, não entendo qual é o problema. Ajude-me, por favor.

Aqui está uma EA onde esta função deve funcionar)

138 - "O preço solicitado está desatualizado ou o lance e o pedido estão desatualizados".

O preço aberto/fechado não pode ser recalculado, porque está lá, e aqui está o problema(você precisa solicitar o preço e dar-lhe um valor usando MarketInfo, e renomear esta variável para outra variável):

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

Olá a todos.

Estou tentando atualizar uma simples rede de arrasto EA da Kim para apagar ordens pendentes depois de fechar todas as ordens do mercado, ela falha(

Eu adicionei função para excluir ordens pendentes:

Encontrei outro problema que não posso resolver porque não sou muito bom em codificação.

Acho que eu deveria escrever uma condição como esta:

Este é apenas um exemplo de outro EA.


Por favor, me ajude.

Kostya, inicie um loop calculando o número de pedidos dos tipos necessários e depois exclua-o como você quiser.
 
_new-rena:
Kostya, faça um laço para calcular o número de pedidos para os tipos necessários, depois apague como desejar, não se faça sábio.

Eu sou um nerd de código) Eu acrescentei mais pausas lá, talvez isso ajude)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

Sou um nerd de código) Acrescentei mais algumas pausas, talvez isso ajude).

O destaque não é o problema. O problema é que antes de você acrescentar as pausas você deveria ter pensado: "O que há nisso para você"? Não vai fazer nada... e vale a pena adicioná-lo???

Eu não entendi o resto, estou bêbado e não respeito os códigos da Kim... desculpe...

 
AlexeyVik:

O destaque não é o problema. O problema é que antes de você acrescentar as ordens pendentes você deveria ter pensado "O que há nisso para você? Não vai fazer nada... e vale a pena adicioná-lo???

E o resto eu não entendi, estou bêbado e os códigos de Kim não respeitam ... desculpe ...

Nada) Eu pensava assim, tenho que escrever uma condição e agora estou pensando.

Sim, os códigos não são para reais nele) pelo menos de graça, sobre pagamento que eu não sei.

 
7Konstantin7:

Não fez nada) Eu pensei que sim, tenho que escrever uma condição, estou pensando.

Não sei como fazer isto, mas tenho um código diferente para os verdadeiros.

Para os verdadeiros, cada corretora tem seu próprio código, portanto, não há um código universal.

 

Problema resolvido) pensou longa e duramente) obrigado a todos vocês.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

Olá a todos!

Estou enfrentando um problema com o fechamento de pedidos de balcão em um marcador de cinco marcadores. A questão é, eu preciso fechar, digamos, 20 ordens de compra e 33 ordens de venda quando o lucro total é 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 para 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?

Aqui está a função de fechar pedidos.

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

  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("ордер успешно закрыт.");   
           
       }
   }
}  
 

Por favor, informe como fechar os pedidos na ordem em que foram abertos.

Eu quero refazer esta função:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

Por favor, informe como fechar os pedidos na ordem em que foram abertos.

Eu quero refazer esta função:

A resposta é óbvia. Ordenar as posições abertas por ocasião de sua abertura. E depois fechá-las na lista a partir da matriz ordenada.
Razão: