Reposição de ordem no mesmo preço

Lucas Trondoli Mendes
129
Lucas Trondoli Mendes  

Boa tarde pessoal estou desenvolvendo um robo de Gradiente Liener e me deparei com um dilema, como vou verificar e repor as ordens dos preços?


Minha primeira tentativa foi utilizando o campo de comentário da ordem para gerencias as memas, sendo assim eu deu numero para elas no caso de 0 a 19, e armazenei em um array(booleano) em um segundo arry armazenei o ticket gerado de cada operação, 


//Armazenar o tickt da ordem  

   for(int i=OrdersTotal()-1; i>=0; i--)

      {

         ulong ticket = OrderGetTicket(i);

         string symbol = OrderGetString(ORDER_SYMBOL);

         ulong magic = OrderGetInteger(ORDER_MAGIC);

         string comentario = OrderGetString(ORDER_COMMENT);

         if(symbol == _Symbol && magic == magicNum)

         

            for(int i=0; i<ArraySize(stord); i++) 

               {

               if(comentario == i)

                  {

                  stord[i] = true;

                  optk[i] = ticket;

                  }

               }//fim do for

      }//fim do for 


para então vericar se alguma das posições ja foi pega pelo TakeProfit para repo-lâs:


//verificar posição fechada

   HistorySelect(horaini,TimeCurrent());

   if (deals_prev < HistoryDealsTotal())// Checa se existe nova ordem

      {

         for (int deal = HistoryDealsTotal() - 1; deal >= deals_prev; deal--) // Começando do ultimo deal

            {

               ulong ticket_deal = HistoryDealGetTicket(deal);

               if (ticket_deal > 0)

                  {

                     if (HistoryDealGetInteger(ticket_deal,DEAL_TYPE) == DEAL_ENTRY_OUT)// Verificar saida das posições

                        {

                           for (int i=0; i<=ArraySize(stord)-1; i++)

                              {

                                 if(optk[i] == HistoryDealGetInteger(ticket_deal, DEAL_POSITION_ID)) // Verificar se tem o mesmo Ticket

                                    {                                                                       

                                       stord[i] = false;

                                    }//Fim do if

                              }//fim do for2

                        }//fim do if

                  }//fim do if

            }//Fim do for 1

      }//fim do if

   deals_prev = HistoryDealsTotal();


// Recolocar ordens nas posições fechadas

   for (int i=0; i<=ArraySize(stord)-1; i++)

      {

         if (stord[i] == false) // Verifica posição fechada

            {

               if (ocompra == true)//descobrir se opera na comrpra ou na venda

                  {

                     Print("achou compra");

                     if (i = 19)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*10),_Symbol,0,Entrada+(distgl*11),ORDER_TIME_GTC,0,"19");

                        }

                     if (i = 18)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*9),_Symbol,0,Entrada+(distgl*10),ORDER_TIME_GTC,0,"18");

                        }

                     if (i = 17)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*8),_Symbol,0,Entrada+(distgl*9),ORDER_TIME_GTC,0,"17");

                        }

                     if (i = 16)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*7),_Symbol,0,Entrada+(distgl*8),ORDER_TIME_GTC,0,"16");

                        }

                     if (i = 15)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*6),_Symbol,0,Entrada+(distgl*7),ORDER_TIME_GTC,0,"15");

                        }

                     if (i = 14)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*5),_Symbol,0,Entrada+(distgl*6),ORDER_TIME_GTC,0,"14");

                        }

                     if (i = 13)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*4),_Symbol,0,Entrada+(distgl*5),ORDER_TIME_GTC,0,"13");

                        }

                     if (i = 12)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*3),_Symbol,0,Entrada+(distgl*4),ORDER_TIME_GTC,0,"12");

                           stord[12] = true;

                        }

                     if (i = 11)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*2),_Symbol,0,Entrada+(distgl*3),ORDER_TIME_GTC,0,"11");

                           stord[11] = true;

                        }

                     if (i = 10)

                        {

                           trade.BuyLimit(lote,Entrada+(distgl*1),_Symbol,0,Entrada+(distgl*2),ORDER_TIME_GTC,0,"10");

                           stord[10] = true;

                        }

                     if (i = 9)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*1),_Symbol,0,Entrada-(distgl*0),ORDER_TIME_GTC,0,"9");

                        }

                     if (i = 8)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*2),_Symbol,0,Entrada-(distgl*1),ORDER_TIME_GTC,0,"8");

                        }

                     if (i = 7)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*3),_Symbol,0,Entrada-(distgl*2),ORDER_TIME_GTC,0,"7");

                        }

                     if (i = 6)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*4),_Symbol,0,Entrada-(distgl*3),ORDER_TIME_GTC,0,"6");

                        }

                     if (i = 5)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*5),_Symbol,0,Entrada-(distgl*4),ORDER_TIME_GTC,0,"5");

                        }

                     if (i = 4)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*6),_Symbol,0,Entrada-(distgl*5),ORDER_TIME_GTC,0,"4");

                        }

                     if (i = 3)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*7),_Symbol,0,Entrada-(distgl*6),ORDER_TIME_GTC,0,"3");

                        }

                     if (i = 2)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*8),_Symbol,0,Entrada-(distgl*7),ORDER_TIME_GTC,0,"2");

                        }

                     if (i = 1)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*9),_Symbol,0,Entrada-(distgl*8),ORDER_TIME_GTC,0,"1");

                        }

                     if (i = 0)

                        {

                           trade.BuyLimit(lote,Entrada-(distgl*10),_Symbol,0,Entrada-(distgl*9),ORDER_TIME_GTC,0,"0");

                        }  */                                                                                                                                                                                                                                                                                                                                                                                                                                            

                                                

                  }


e tenho o mesmo codigo para venda.

Porem após a 3 ordem aberta ele começa a repetir o loop de abrir ordens e abre muitas iguais, como se a posição do array estivesse como true.

Se alguem tiver alguma ideia melhor para essa logica ou conseguir descobrir o que tem de errado eu agradaço.



Eduardo Oliveira
2285
Eduardo Oliveira  

o que vc precisa é mais ou menos isso aqui


   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      ulong ticket = 0;
      if((ticket =  OrderGetTicket(i))>0)
      {
         string symbol = OrderGetString(ORDER_SYMBOL);
         if(symbol == _Symbol)
         {

         if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
         {                    
            double priceBuffer = OrderGetDouble(ORDER_PRICE_OPEN);
         }
      }
   }

Ele pega todas as ordens que existem, seleciona um ticket, verifica se é uma ordem de venda e se for ele pega o preço de abertura de ordem...ai o resto é com vc...mas basicamente é só vc verificar qual o menor valor ou maior do preço de venda e colocar a distancia....no de compra é a mesma coisa

Só precisa ver se o seu tipo de ordem é ORDER_TYPE_SELL_STOP ou outras, dê uma verificada