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

 
kwng111:


Desculpe, mas sua postagem não me parece a solução para madmax3

Você não precisa modificar os negócios em uma funçã( ) chamada CloseAll() vazia
Você também deve selecionar OrderSymbol ( ) e OrderMagicNumber( )

e nesta parte do programa

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

as negociações pendentes ainda serão modificadas

 

Aqui está o código revisado para toda a EA:

//+------------------------------------------------------------------+
//|                                                  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; 
        
    
}

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


   return(0);
  }
  
  
  
  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.

A função CloseAll() está lá para fechar os negócios em um horário especificado se eles durarem tanto tempo.

Esta parte do código é a parte revisada do que eu estou tentando descobrir:
(como você pode ver o MagicNumber e o Symbol estão lá, porém apenas as ordens pendentes ainda estão sendo modificadas)

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int total=OrdersTotal();
 if(total>1)

Foi-lhe dito que o seleto não funcionará ontem. E que você deve testar os códigos de retorno e sobre o total

Se você não vai se preocupar em ler os posts e corrigir seu código, não vamos nos preocupar em tentar ajudá-lo.

 
WHRoeder:

Foi dito a você que o select não funcionará ontem. E que você deve testar os códigos de retorno e sobre o total

Se você não vai se preocupar em ler os posts e corrigir seu código, não vamos nos preocupar em tentar ajudá-lo.


Eu já fiz as duas coisas acima, você está se referindo à pessoa errada. Eu sou o cartaz original não deVries e mudei o código para este (como postado antes):

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

O problema agora é que ele modifica ordens pendentes enquanto eu quero que ele modifique apenas ordens abertas e apenas quando duas ordens abertas do mesmo símbolo estão abertas e funcionando ao mesmo tempo. Eu tentei combinações diferentes de números e números OrderSelect, mas ainda estou perplexo com isso.

 
madmax3:


Eu já fiz as duas coisas acima, você está se referindo à pessoa errada. Eu sou o cartaz original não deVries e mudei o código para este (como postado antes):

O problema agora é que ele modifica ordens pendentes enquanto eu quero que ele modifique apenas ordens abertas e apenas quando duas ordens abertas do mesmo símbolo estão abertas e funcionando ao mesmo tempo. Eu tentei combinações diferentes de números e números OrderSelect, mas ainda estou perplexo com isso.

Portanto, você precisa fazer loop através de suas ordens abertas, verificar o Symbol e MagicNumber como você tem acima . . . mas você também precisa verificar por OrderType() <=OP_SELL. . . contar as ordens que correspondem, se for 2 . . . então loop novamente e OrderModify().

A única maneira de aprender é ler a Documentação sobre cada função e ter uma idéia de como elas funcionam . . por exemplo OrderType()

 

Eu tentei uma variação de códigos diferentes, mas ainda não consegui fazer com que funcionasse exatamente. Ele modifica uma das negociações abertas quando duas estão abertas e continua modificando, eu só preciso que ele seja modificado uma vez e preciso que ambas as negociações sejam modificadas.

     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_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     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_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

Alguma sugestão sobre o que eu deveria fazer? Eu li na documentação btw.

 
Qual é a diferença antes do pedido ser modificado e depois de modificado ? o que muda ?
 

Primeiro duas ordens são estabelecidas, depois uma delas (uma venda neste caso quando testei a data específica) é executada. Mais tarde no dia, a segunda ordem (que ainda está lá) é executada, e esta negociação é uma compra.
A venda é a ordem 1 e a compra é a ordem 2. A compra (ordem 2) tem seu TakeProfit modificado em 16,3 pips (não tenho certeza porque não está adicionando 20 pips), então o TakeProfit é aumentado em 0,2 pips no mesmo minuto, e isto continua acontecendo, o TakeProfit é continuamente modificado ao longo do dia, às vezes aumentado, às vezes diminuído, não tenho certeza porque isto está acontecendo.

Edição: Acho que as 16,3 pips e outras mudanças também são influenciadas pelo spread?

 
OK, podemos voltar ao início . . . . Eu sei que você está tentando modificar duas ordens . . . mas o que exatamente você está tentando fazer ? seguir o SL ? algo mais ? o que você está tentando alcançar ?
 
madmax3 2012.03.09 15:06
WHRoeder:

Foi-lhe dito que o seleto não funcionará ontem. E que você deve testar os códigos de retorno e sobre o total

Se você não vai se preocupar em ler os posts e corrigir seu código, não vamos nos preocupar em tentar ajudá-lo.


Eu já fiz as duas coisas acima, você está se referindo à pessoa errada.

Eu estava me referindo ao seu post diretamente anterior

madmax3 2012.03.09 14:52
Aqui está o código revisado para toda a EA:
   total=OrdersTotal();
   if(total<1) 
O que ainda mostra os problemas que eu declarei.