Problema com a quantidade total de pedidos em aberto - página 4

 

Olá a todos

Desculpe, mas falei cedo demais. Ao acrescentar RefreshRates() parece fazer diferença, ainda estou tendo o mesmo problema. Às vezes abre ambas as ordens pendentes, às vezes apenas uma das duas, e às vezes nenhuma delas. Ainda estou recebendo erro 130 quando não abre uma ordem, ou ambas, mas nenhum erro quando ambas realmente são abertas. Também notei que naqueles pares onde minhas entradas estão abaixo do MODE_STOPLEVEL, ele nunca abre uma ordem e eu sempre tenho erro 130, mesmo que o programa ajuste minhas entradas conforme solicitado. Estou imprimindo os valores e eles são ajustados conforme esperado. Portanto, estou tentando descobrir porque meu OrderSend não funciona de verdade.

Em um par como o EURUSD, onde o estojo é 5, ele geralmente envia os dois pedidos, mas nem sempre. Entretanto, em um par como o EURAUD, onde o estojo é 10, ele nunca envia um pedido.

extern int TrailingStart=20;
extern int TrailingStop=5;

extern int Hedge=10;
extern double Multiplier=3;

extern int StopLossOriginal=11;

extern int StopLossHedge=9;

extern double Percentage=1;
extern double Lotsize=0.01;
extern double MyMaxlots=30;

extern datetime StartTime1 = D'2016.03.25 16:50';

extern int Pipmove=5;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
//---
  {
   int TS=TrailingStart-TrailingStop;
   double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
   if(StopLossOriginal<stoplevel || StopLossHedge<stoplevel || TS<stoplevel)
     {
      MessageBox("Please note: Your inputs for StopLossOriginal, StopLossHedge and/or"+
                 "\nTrailingStop are below the minimum levels required by your broker,"+
                 "\nand have been increased automatically to "+StringConcatenate(stoplevel)+" Pips");
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int TS=TrailingStart-TrailingStop;
   Print("TS = ",TS);
   int sloss=StopLossOriginal-Pipmove;
   int stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
   Print("stoplevel = ",stoplevel);
     
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2),
          point=Point*10,
          Price=Pipmove*point,
          SL=(StopLossOriginal-Pipmove)*point,
          MinLots = MarketInfo(Symbol(),MODE_MINLOT),
          MaxLots = MarketInfo(Symbol(),MODE_MAXLOT),
          HedgeLots=NormalizeDouble(OrderLots()*Multiplier,2);
          
   if(sloss<=stoplevel) SL=stoplevel*point;
   Print("SL = ",SL);
   if(StopLossHedge<=stoplevel) StopLossHedge=stoplevel;
   Print("StopLossHedge = ",StopLossHedge);
   if(TS<=stoplevel) TrailingStart=(stoplevel+TrailingStop); 
   Print("TrailingStart = ",TrailingStart);     
          
   datetime time1=StartTime1-3300;      

   if(Lots>MaxLots) Lots=MaxLots;
   if(Lots<MinLots) Lots=MinLots;
   if(HedgeLots>MaxLots) HedgeLots=MaxLots;
   if(Lots>MaxLots || Lots<MinLots || HedgeLots>MaxLots)
     {
      MessageBox("Lotsize have been adjusted automatically");
     }

   int buy_ticket=0, sell_ticket=0, buystop_ticket=0, sellstop_ticket=0, total=0;
   for(int i= OrdersTotal()-1; i>= 0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()==Symbol())
        {
         total++;
         if(OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if(OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if(total==0 && Time[0]==time1)
     {
      buy_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,0,0,"Pending",magic,0,Lime);
      OrderModify(OrderTicket(),OrderOpenPrice(),Ask-SL,OrderTakeProfit(),Yellow);
      Print("Buystop = ",GetLastError());
      Sleep(1000);
      RefreshRates();
      Sleep(1000);
      sell_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,0,0,"Pending",magic,0,Red);
      OrderModify(OrderTicket(),OrderOpenPrice(),Bid+SL,OrderTakeProfit(),Yellow);
      Print("Sellstop = ",GetLastError());
     }

Eu também já tentei assim, mas não faz diferença:

buy_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      RefreshRates();
sell_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);

E mesmo que eu faça isso, não faz diferença:

if(total==0) // && (Time[0]==time1)
 

Obrigado a todos por toda a ajuda. Finalmente consegui que funcionasse. A única maneira de conseguir que funcionasse de forma consistente foi mudando-o para isso:

 if(total==0)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      Print("buystop = ",GetLastError());
      RefreshRates();
     }
   if(total==1)
     {
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
      Print("sellstop = ",GetLastError());
     }

Também descobri que o nível do Pipmove antes que a ordem pendente seja ativada também deve ser mais alto do que o stoplevel. Então tudo parece funcionar agora... Obrigado

 
Trader3000:

Obrigado a todos por toda a ajuda. Finalmente consegui que funcionasse. A única maneira de conseguir que funcionasse de forma consistente foi mudando-o para isso:

Também descobri que o nível do Pipmove antes que a ordem pendente seja ativada também deve ser mais alto do que o stoplevel. Então tudo parece funcionar agora... Obrigado

Não, isto também não funciona porque agora vai continuar a abrir um ponto de venda enquanto houver um comércio aberto.
 
A resposta simples é não tentar abrir pedidos pendentes tão próximos do preço atual. 5 Pontos é normalmente meio pip
 
GumRai:
A resposta simples é não tentar abrir pedidos pendentes tão perto do preço atual. 5 Pontos é normalmente meio pip

Obrigado pela resposta. Meu cálculo está na verdade em pips, então as ordens pendentes estão a pelo menos 50 pontos (5 pips de distância do preço atual), no entanto, parece funcionar se eu o mover pelo menos 1 pip mais longe do stoplevel, que é 50 pontos no EURUSD. Agora parece que ele abre ambas as negociações, exceto a primeira, depois que eu o arrasto para o gráfico. Mas estou bem com isso por enquanto. Meu código agora se parece com isto:

extern int TrailingStart=20;
extern int TrailingStop=5;
extern int Hedge=10;
extern double Multiplier=3;
extern int StopLossOriginal=11;
extern int StopLossHedge=9;
extern double Percentage=1;
extern double Lotsize=0.01;
extern double MyMaxlots=30;
extern datetime StartTime1 = D'2016.03.25 14:50';
extern int Pipmove=5;
int i,TS=TrailingStart-TrailingStop,stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; //stoplevel has been converted from points to pips (/10)

int start()
  {
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2),
          point=Point*10,
          Price=Pipmove*point,
          SL=StopLossOriginal*point,
          MinLots = MarketInfo(Symbol(),MODE_MINLOT),
          MaxLots = MarketInfo(Symbol(),MODE_MAXLOT),
          HedgeLots=NormalizeDouble(OrderLots()*Multiplier,2);

   if(StopLossHedge<stoplevel) StopLossHedge=stoplevel;
   if(TS<stoplevel) TrailingStart=(stoplevel+TrailingStop);
   if(Pipmove<stoplevel+1) Pipmove=stoplevel+1;
   if(StopLossOriginal<=StopLossHedge) StopLossOriginal=StopLossHedge+1;

   datetime time1=StartTime1-300;

   int buy_ticket=0,sell_ticket=0,buystop_ticket=0,sellstop_ticket=0,total=0;
   for(i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()==Symbol())
        {
         total++;
         if(OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if(OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if(total<1 && Time[0]==time1)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      RefreshRates();
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
     }

Uma vez que uma das ordens pendentes é acionada, uma de duas coisas pode acontecer: ou aciona o TrailingStop e a outra ordem pendente é apagada. ou se essa negociação for contra mim deve abrir uma sebe na direção oposta. Dependendo de como escrevo o código, ou abrirá mais de uma sebe ou não abrirá nenhuma sebe. Já tentei alguma coisa, incluindo as duas seguintes:

if(OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY)
     {
      if(Bid-OrderOpenPrice()>TrailingStart*point)
        {
         if(OrderStopLoss()<Bid-TrailingStop*point)
           {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*point,OrderTakeProfit(),Blue))
              {
               if(OrderSelect(sellstop_ticket,SELECT_BY_TICKET) && OrderType()==OP_SELLSTOP)
                 {
                  if(OrderDelete(sellstop_ticket,Orange))
                     return(0);
                 }
              }
           }
        }
      if(OrderOpenPrice()>Bid+Hedge*point && buy_ticket==1 && sell_ticket<=1)
            {
              sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Red);
            }  
        }
//Same for Sell

Ou:


//Same up to here:
else if(total<=2 && OrderOpenPrice()>Bid+Hedge*point)
        {
         sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Red);
        }

Devo usar um laço separado para isso? Obrigado.

 

Olá a todos

Foram semanas de tentativas e ainda não fiz nenhum progresso. Tudo funciona agora, exceto que sob certas condições a EA abre mais de um comércio de hedge no comércio original. O SL no comércio original é de 11 pips e o SL no comércio de Hedge é de 9 pips. Às vezes o comércio de hedge é interrompido a 9 pips enquanto o comércio original ainda está aberto. Então, abrirá um segundo comércio de hedge e até mesmo um 3º e 4º enquanto o comércio original ainda está aberto. Eu simplesmente quero limitar a quantidade de comércio de hedge a um e se ele for interrompido, basta esperar e ver o que acontece com o comércio original.

Este é o tipo de resultado que eu recebo:

576 2015.01.15 11:39 comprar parada 29 0.48 1.16786 1.16616 0.00000 0.00 4834.24

577 2015.01.15 11:39 vender parada 30 0.48 1.16642 1.16812 0.00000 0.00 4834.24

578 2015.01.15 11:39 vender 30 0.48 1.16642 1.16812 0.00000 0.00 4834.24

579 2015.01.15 11:39 excluir 29 0.48 1.16786 1.16616 0.00000 0.00 0.00 4834.24

580 2015.01.15 11:42 comprar 31 1.44 1.16743 1.16653 0.00000 0.00 0.00 4834.24

581 2015.01.15 11:42 s/l 31 1.44 1.16653 1.16653 0.00000 -129.60 4704.64

582 2015.01.15 11:44 comprar 32 1.44 1.16742 1.16652 0.00000 0.00 4704.64

583 2015.01.15 11:44 s/l 30 0.48 1.16812 1.16812 0.00000 -81.60 4623.04

584 2015.01.15 11:48 modificar 32 1.44 1.16742 1.16893 0.00000 0.00 4623.04

As ordens de compra e venda (29 e 30) são abertas como deveriam. O preço então cai e a ordem de venda (30) é preenchida enquanto a ordem de compra (29) é apagada. O preço então sobe novamente e a ordem de hedge(martingale) (31) é acionada (3*lotsize). O preço então cai novamente e o hedge (31) é interrompido, mas como o 30 ainda está aberto, aciona outro hedge (32), etc. Como posso evitar que o pedido 32 seja acionado? Obrigado.


 

Olá a todos. Já faz mais de um mês que tentei resolver isto e estou começando a pensar que é programticamente impossível codificar. Por isso, se alguém quiser confirmar isto, eu posso colocar para descansar e seguir em frente. Não é possível estabelecer um nível profundo para o número de ordens de hedge(martingale) como explicado no post acima? Obrigado.

O melhor que eu tenho até agora é:

int start()
{
   int buy_ticket=0;
   int sell_ticket=0;
   int total=0;
   for(int i= OrdersTotal()-1; i>= 0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol())
     {
         total++;
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }
   /*if(total==1 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY) <------- this blocked out code is irrelevant, but I want to put it here for completeness
     {
      if(Bid-OrderOpenPrice()>TrailingStart*point)
        {
         if(OrderStopLoss()<Bid-TrailingStop*point)
           {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop *point,OrderTakeProfit(),Blue))
               return(0);
           }
        }*/
      else if(OrderOpenPrice()>Bid+Hedge*point)
        {
         sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Blue);
         return(0);
        }
     }
  }
 

Há diferentes maneiras de se conseguir isso.

Quando o hedge é aberto, criar uma Variável Global do terminal do cliente.

Dê a ela um nome que inclua o número do bilhete do comércio principal.

Dê a ela um valor que funcione como uma bandeira de que um comércio de hedge foi aberto para esse número de bilhete, ou uma contagem de hedge, se necessário.

Verifique o GV antes de abrir um sebe.


O sebe e o comércio principal têm diferentes tamanhos de lote.

Antes de abrir um sebe, verifique as ordens abertas e o histórico para ver se uma ordem oposta foi aberta com o tamanho de lote relevante com um OrderOpenTime() mais tarde do que o tempo de abertura do comércio principal.

 
GumRai:

Há diferentes maneiras de se conseguir isso.

Quando o sebe é aberto, crie uma Variável Global do terminal do cliente.

Dê-lhe um nome que inclua o número do bilhete do comércio principal.

Dê a ele um valor que funcione como uma bandeira de que um comércio de cobertura foi aberto para esse número de bilhete, ou uma contagem de cobertura, se necessário.

Verifique o GV antes de abrir um sebe.


O sebe e o comércio principal têm diferentes tamanhos de lote.

Antes de abrir um hedge, verifique as ordens abertas e o histórico para ver se uma ordem oposta foi aberta com o tamanho de lote relevante com um OrderOpenTime() mais tarde do que o tempo de abertura do comércio principal.

Muito obrigado, vou analisar estas opções e informá-lo-ei.
 

Por isso, tentei conseguir isto através de uma Variável Global, mas desde que acrescentei este código, ele não está abrindo um comércio de hedge de forma alguma. Acho que a questão é que a EA está fazendo um GlobalVariableCheck, mas como ainda não foi criado nenhum, ele não vai continuar:

//+------------------------------------------------------------------+
//|  Hedge                                                           |
//+------------------------------------------------------------------+
void Hedgetrade(){
int buy_hedge=0,sell_hedge=0,total=0;
double Pip=Point*10,HedgeLots=NormalizeDouble(OrderLots()*Multiplier,2),SLHedge=StopLossHedge*Pip;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&& OrderSymbol()==Symbol()){
      total++;
      int ticket=OrderTicket();
      Print("ticket = ",ticket);
     }          
         if(OrderType()==OP_BUY){
            if(buy_hedge==0 && sell_hedge==0 && OrderOpenPrice()>Bid+Hedge*Pip)
               GlobalVariableCheck(ticket);
               sell_hedge=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+SLHedge,0,"Hedge",0,0,Blue);
                  GlobalVariableSet(ticket,1);
                 }
         if(OrderType()==OP_SELL){
            if(sell_hedge==0 && buy_hedge==0 && OrderOpenPrice()<Ask-Hedge*Pip)
               GlobalVariableCheck(ticket);
               buy_hedge=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-SLHedge,0,"Hedge",0,0,Red);
                  GlobalVariableSet(ticket,1);
              }
            }
          }