Código simples necessário para EA (modificar duas ordens abertas) - página 3

 

Basicamente eu estabeleço duas ordens pendentes a uma hora específica, especificamente às 23:00 GMT+2, eu acho. Uma das ordens pendentes como uma parada de venda e a outra é uma parada de compra, ambas as ordens estão a uma distância igual da vela aberta a partir das 23:00, neste caso 14 pips. Ambas têm um TakeProfit de 28 pips (neste caso) e um StopLoss de 55 pips.

Agora quando ambas as ordens são cumpridas (essencialmente subindo e descendo 14 pips do preço aberto a partir da vela das 23:00 antes que as ordens expirem), eu quero que ambas as ordens tenham seus lucros de TakeProfit aumentados em, por exemplo, 20 pips. Assim, neste caso, o lucro de suas novas tomadas é de 58 pips. O stop loss, entretanto, deve ser mantido o mesmo durante todo o tempo. Essencialmente o que estou tentando fazer é uma espécie de hedging.

Se duas negociações estiverem abertas, então é provável que o preço vá em uma única direção, o suficiente para cancelar quaisquer perdas se os lucros de ambas as negociações forem aumentados. Para obter qualquer lucro, apenas uma negociação abriria e alcançaria o take profit ou ambas as negociações abririam e atingiriam o take profit sem ir longe em uma direção.

Espero que isto esteja claro, se não estiver, vou fornecer uma imagem que deve ser mais clara.

 
WHRoeder:

Eu estava me referindo ao seu cargo diretamente anterior

madmax3 2012.03.09 14:52
Aqui está o código revisado para toda a EA:
O que ainda mostra os problemas que eu declarei.
Essa parte do código é para outra parte da EA que eu acredito, a parte que abre as ordens pendentes, teria algum efeito sobre a parte que estou tentando consertar? Desculpe, eu acho que confundi partes do código especialmente no post original. No entanto, fiz o que o senhor declarou para a parte do código para a qual eu preciso especificamente.
 
madmax3:

Espero que isto seja claro, se não for, vou fornecer uma imagem que deve ser mais clara.

Está claro, obrigado.

Então você só quer modificar estas ordens uma vez . . . então a resposta é simples. Você precisa verificar a barra das 23:00 e determinar os TPs nos quais as ordens deveriam ter sido abertas . . . se as ordens estão no mesmo TP então elas precisam ser modificadas, se não estão no mesmo TP então elas já foram modificadas e não precisam ser modificadas novamente . . simples.

 
RaptorUK:

Está claro, obrigado.

Então você só quer modificar estas ordens uma vez . . . então a resposta é simples. Você precisa verificar a barra das 23:00 e determinar os TPs nos quais as ordens deveriam ter sido abertas . . . se as ordens estão no mesmo TP então elas precisam ser modificadas, se não estão no mesmo TP então elas já foram modificadas e não precisam ser modificadas novamente . . simples.

A modificação e a verificação só devem acontecer quando há dois ofícios abertos, no entanto, como eu faria isso? Devo acrescentar ao código que já tenho ou começar de novo?

Então, essencialmente, se houver duas negociações (mesmo símbolo e número mágico) a EA deve verificar os lucros das negociações abertas em comparação com as ordens pendentes anteriormente existentes (que agora são executadas) e então, se forem as mesmas, ela deve ser modificada, e uma vez que ela faça um loop, verificará novamente e descobrirá que elas não são as mesmas e, portanto, não modificará mais as negociações?
 
madmax3:
1. A modificação e verificação só deve acontecer quando há duas ordens abertas, como eu faria isso? Devo acrescentar ao código que já tenho ou começar de novo?

2. Portanto, essencialmente, se houver duas negociações (mesmo símbolo e número mágico) a EA deverá verificar os lucros das negociações abertas em comparação com as ordens pendentes anteriormente existentes (que agora são executadas) e, então, se forem as mesmas, ela deverá ser modificada, e uma vez que ela faça um loop, verificará novamente e descobrirá que não são as mesmas e, portanto, não modificará mais as negociações?

1. Passe pelas ordens abertas, verifique o símbolo, o número mágico, quando você tiver uma correspondência que não seja um tipo de ordem pendente incremente um contador . . . quando você passar pela verificação das ordens se você tiver contado 2, então você tem 2 ordens abertas para o símbolo e número mágico corretos . . . então agora você pode modificá-las . . ver 2.

2. Não, você não pode ver o TP das ordens pendentes se elas tiverem sido ativadas e agora não estão mais pendentes. O EA deve verificar a barra das 23:00 e descobrir quais teriam sido os TPs originais . . depois comparar estes com os TPs das 2 ordens pendentes . . a partir desta informação a decisão pode ser tomada para modificar ou não modificar.

 
RaptorUK:

1. Passe pelas ordens abertas, verifique o símbolo, o número mágico, quando você tiver uma correspondência que não seja um tipo de ordem pendente incremente um contador . . . quando você passar pela verificação das ordens se você tiver contado 2, então você tem 2 ordens abertas para o símbolo e número mágico corretos . . . então agora você pode modificá-las . . ver 2.

2. Não, você não pode ver o TP das ordens pendentes se elas tiverem sido ativadas e agora não estão mais pendentes. O EA deve verificar a barra das 23:00 e descobrir quais teriam sido os TPs originais . . depois comparar estes com os TPs das 2 ordens pendentes . . a partir desta informação a decisão pode ser tomada para modificar ou não modificar.

Ah, estou vendo, acredito que isto é o que tenho tentado fazer o tempo todo. Até agora uma das ordens é modificada (especificamente a ordem de compra 2 em meus testes), mas ela continua sendo modificada, será que eu uso 'quebra' para impedir que ela se repita? Também como eu conto e só modifico as ordens abertas quando e só há duas delas abertas? Tenho tentado usar o OrderTotal() para isto, mas não está funcionando, não acho que precisaria fazer duas peças de código separadas para cada ordem, certo?
Apenas as ordens abertas, mesmo numeradas, estão sendo modificadas e, como eu disse que elas são modificadas repetidamente, tentei várias combinações para OrderSelect() mas ainda não consigo entender, como eu disse que sou um noob total na MQL e esta EA está quase pronta, então eu gostaria de terminá-la. Eu li estehttps://book.mql4.com/trading/ordermodify teria algo a ver com minha situação? É para um stop loss, mas eu preciso dele para ter lucro, essencialmente.

O que estou fazendo de errado aqui?

     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() == OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    return(0);
    
  if (
        OrderSelect(iPos-1, SELECT_BY_POS-1)                    
    &&  OrderMagicNumber()  == MagicNumber                
    &&  OrderSymbol()       == "EURUSD"                
    && (OrderType() == OP_SELL)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
return(0);
  }

Como eu iria verificar se o TP é o mesmo que a vela das 23:00? Seria necessário como tal, já que enquanto as ordens em aberto forem modificadas quando 2 delas estiverem lá, isso alcançaria o mesmo efeito? Ou isto é apenas para impedir que o pedido seja continuamente modificado e sim, eu verifiquei a documentação.

Obrigado,

madmax3

 

Seu retorno(0) o está retirando do início() antes que a 2ª ordem seja modificada.

Tudo que você está fazendo é selecionar a ordem por posição, verificando se ela tem o número mágico correto, verificando se é o símbolo correto e se é OP_BUY . . . . então você a modifica, onde você está determinando se ela já foi ou não modificada ?

Você EA tem que ser capaz de recuperar de ser interrompido . ... se seus pedidos forem feitos e o MT4 falhar ele tem que ser capaz de retomar de onde parou quando for reiniciado.

É por isso que você precisa determinar se o pedido já foi modificado ou se precisa ser modificado. ... como ?

"Eu estabeleço duas ordens pendentes a uma hora específica, especificamente às 23:00 GMT+2, penso eu. Uma das ordens pendentes como uma parada de venda e a outra é uma parada de compra, ambas as ordens estão a uma distância igual da vela aberta a partir das 23:00, neste caso 14 pips. Ambas têm um TakeProfit de 28 pips (neste caso) e um StopLoss de 55 pips".

Você pode calcular onde o TP original estava por referência à vela das 23:00, verificar o pedido e ver se ainda está ajustado ao TP original, se está então pode ser modificado... se não, então já foi modificado, então não o modifique novamente.

Há outras maneiras de registrar que o pedido foi modificado, manter registro do número do bilhete escrever a informação em um arquivo quando ele foi modificado, quando estiver prestes a modificá-lo novamente abrir o arquivo e verificar o número do bilhete, etc . . Acho que a verificação versus o TP original é muito mais simples.

 

Até agora eu tenho isto,

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
      }
      }
   
// the end.

O código de redação do arquivo, como incluído acima, é,

//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
          	 FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

Mas estou recebendo esses erros,

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Versão 2: FileOpen - demasiados arquivos abertos

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Versão 2: cabo inválido -1 em FileWrite

O que é isso?

 

Por que diabos você escolheu a mais difícil das duas opções?

Quando terminar de escrever para o arquivo, você precisa fechá-lo. . . se ele já estiver aberto, você não precisa abri-lo novamente.

//---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name="check.csv";        // File name
   
Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening    File opened here, outside the loop
   

FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
   {       
   OrderSelect(iPos,SELECT_BY_POS);
   FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime() )  //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose(Handle);      //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

Seu laço está errado . . a última posição de pedido é 0 e não 1

 
RaptorUK:

Por que diabos você escolheu a mais difícil das duas opções?

Não é esta a maneira de fazer a modificação e verificação usando o arquivo? Ou preciso combinar os dois códigos, a modificação (meu posto antes do último) e o código do arquivo (que é apenas para garantir que não ocorram mais modificações) ?
Razão: