[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 346

 
hoz Vadim, por que recriar o objeto quando você pode usar ObjectSet() ?

Por que pedir conselhos e depois desafiá-los? Este é o mainstream?
 
FAQ:

Acho que não vale a pena discutir mais. Expliquei tudo passo a passo. continue fazendo o que tem feito.

Que tipo de discussão pode haver? Devemos fechar o pedido com o desvio máximo no preço. O que significa que estamos interessados no preço... Ou seja, devemos encontrar uma ordem extrema pendente (com o preço máximo ou mínimo aberto). Se você não concordar, poderá discutir. Caso contrário, afinal estou certo! Eu sei exatamente o que estou dizendo.
 

O código elimina ST e TP. Adiciono uma condição para eliminação seletiva

O que não está escrito corretamente? Continua apagando tudo :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

Ou não existe outra solução e é preciso escrever o código de exclusão para cada condição?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim, por que criar o objeto novamente quando você pode usar ObjectSet() ?

Nesse caso, havia uma função onde o objeto gráfico era completamente criado e configurado. Nela, a função de criação é otimizada. Se o objeto já existe, ele não é criado. Verifique você mesmo. Medir o tempo para criar objetos, depois mudar propriedades. A segunda chamada será muito mais curta. Isto é, nada é recriado.

Como resultado, temos uma função universal que não só cria um objeto, mas também pode personalizá-lo alterando as propriedades do objeto sem muito tempo.

 
Você pode sugerir um roteiro para um EA para determinar a tendência do mercado?
 

Escrevi uma função que eliminaráas ordens de venda com os preços mais baixos.O número de ordens curtas para fechar é igual aonúmero de ordens de compra que acionaram, ou seja, foram para ordens de mercado.

Assim, se uma ordem de compra é acionada, então fechamos uma ordem de venda, se 2 ordens de compra são acionadas, então fechamos 2 ordens de venda.

Aqui está o código:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

montanteOfCurrPending - quantidade de ordens de compra pendentes.

Nível- número de ordens pendentes inicialmente enviadas para cada lado.

OOP- preço aberto do pedido pendente, tomei qualquer valor inalcançável.

Nossa condição é a seguinte: se o contador for menor que asordensToDelete, eliminamos a ordem pendente com o preço mais baixo. Mas todas as posições curtas são eliminadas. O que há de errado comigo?

 
hoz:

Escrevi uma função que eliminaráas ordens de venda com os preços mais baixos.O número de ordens curtas para fechar é igual aonúmero de ordens de compra que acionaram, ou seja, foram para ordens de mercado.

Assim, se uma ordem de compra é acionada, então fechamos uma ordem de venda, se 2 ordens de compra são acionadas, então fechamos 2 ordens de venda.

Aqui está o código:

montanteOfCurrPending - quantidade de ordens de compra pendentes.

Nível- número de ordens pendentes inicialmente enviadas para cada lado.

OOP- preço de abertura da ordem pendente, eu tomei qualquer valor inalcançável.

Nossa condição é a seguinte: se o contador for menor que asordensToDelete, eliminamos a ordem pendente com o preço mais baixo. Mas todas as posições curtas são eliminadas. O que há de errado comigo?

Eu não entendo sua lógica. Por que não: a ordem foi transformada em uma posição de mercado - a ordem pendente oposta mais distante foi eliminada.
Isso é tudo. Ou você tem um monte de pedidos por um preço?
 
artmedia70:

Isso é tudo. Ou você tem um pacote de pedidos a um preço?


Não, ordens em incrementos...
artmedia70:
Eu não entendo sua lógica... Por que não: A ordem foi convertida em uma posição de mercado - a ordem pendente oposta mais distante foi removida.

É assim que eu apago a posição mais distante oposta, ou seja, como é uma posição curta, significa a posição com o preço de abertura mais baixo. Aqui eu reescrevi a função, tudo deve ficar claro aqui. Removi as impressões e removi uma variável extra.

Omontante variávelOfCurrPending transfere o número de negócios restantes na compra. Ou seja, se o valor inicial for nivelado e ovalorOfCurrPending for o valor atual dos pedidos, então subtraindo o valor inicial dos pedidos do atual, obteremos a diferença e este é o valor necessário para apagar os shorts. Você vê?

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
Há algum erro onde eu marquei em vermelho? Como resolvê-lo?
 
hoz:

Não, encomendas em incrementos.

É assim que eu retiro a posição mais distante, ou seja, por ser uma posição curta, significa a posição com o menor preço de abertura. Aqui eu reescrevi a função, deve ficar claro. Removi as impressões e removi uma variável extra.

Omontante variávelOfCurrPending transfere o número de negócios restantes na compra. Ou seja, se o valor inicial for nivelado e ovalorOfCurrPending for o valor atual dos pedidos, então subtraindo o valor inicial dos pedidos do atual, obteremos a diferença e este é o valor necessário para apagar os shorts. Você vê?

Há algum erro onde eu marquei em vermelho? Como resolver isso corretamente?
 Ищется ордер, с минимальной ценой открытия

Eu especificaria no comentário de uma ordem pendente seu número de ordem na grade e escreveria o mesmo número na ordem pendente oposta correspondente. Então, quando uma posição de mercado é encontrada, após a leitura do número em seu comentário, a posição oposta correspondente pode ser encontrada com um número idêntico em seu comentário. Uma vez que os magos são usados para outra coisa.

ZS. Eu ainda não tenho tempo para ler/partilhar seu código

 
artmedia70:

Eu escreveria no comentário da posição pendente seu número seqüencial na grade e escreveria o mesmo número na posição pendente oposta correspondente. Então, quando uma posição de mercado é encontrada, após a leitura do número em seu comentário, a correspondente posição pendente oposta pode ser encontrada sem qualquer problema por um número idêntico em seu comentário. Já que você usa mágicos para outra coisa.

ZS. Eu ainda não tenho tempo para ler/partilhar seu código



Hmm. Sim, não há problema em encontrar a ordem pendente correspondente dessa forma, se o número de ordens pendentes em cada direção for o mesmo. E se diferente, então isto não funcionará como eu entendo.
Razão: