È necessario un semplice codice per l'EA (modificare due ordini aperti) - pagina 2

 
kwng111:


Scusa kwng ma il tuo post non mi sembra la soluzione per madmax3

Non devi modificare i trade in una funzione( ) chiamata void CloseAll()
Inoltre devi selezionare OrderSymbol ( ) e OrderMagicNumber( )

e in questa parte del programma

        }
        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);
    }
}

i pendingtrades saranno ancora modificati

 

Ecco il codice rivisto per l'intero 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.

La funzione CloseAll() è lì per chiudere i trade ad un tempo specificato se vanno avanti così a lungo.

Questa parte del codice è la parte rivista di ciò che sto cercando di capire:
(come potete vedere il MagicNumber e il Symbol sono lì, tuttavia solo gli ordini pendenti vengono ancora modificati)

     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)

Vi è stato detto che la selezione non funzionerà ieri. E che dovete testare i codici di ritorno e circa il totale

Se non ti prenderai la briga di leggere i post e correggere il tuo codice, noi non ci prenderemo la briga di provare ad aiutarti.

 
WHRoeder:

Ieri ti è stato detto che la select non funziona. E che è necessario testare i codici di ritorno e circa il totale

Se non ti prenderai la briga di leggere i post e correggere il tuo codice, noi non ci prenderemo la briga di provare ad aiutarti.


Ho fatto entrambe le cose, ti stai riferendo alla persona sbagliata. Io sono il poster originale non deVries e ho cambiato il codice in questo (come postato prima):

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

Il problema ora è che modifica gli ordini in sospeso mentre io voglio che modifichi solo gli ordini aperti e solo quando due ordini aperti dello stesso simbolo sono aperti e in esecuzione allo stesso tempo. Ho provato diverse combinazioni di numeri e numeri di OrderSelect ma sono ancora bloccato su questo.

 
madmax3:


Ho fatto entrambe le cose, ti stai riferendo alla persona sbagliata. Io sono il poster originale non deVries e ho cambiato il codice in questo (come postato prima):

Il problema ora è che modifica gli ordini in sospeso mentre io voglio che modifichi solo gli ordini aperti e solo quando due ordini aperti dello stesso simbolo sono aperti e in esecuzione allo stesso tempo. Ho provato diverse combinazioni di numeri e numeri di OrderSelect ma sono ancora bloccato su questo.

Quindi hai bisogno di fare un loop dei tuoi ordini aperti, controllare il Symbol e il MagicNumber come hai fatto sopra . . . ma devi anche controllare se OrderType() <=OP_SELL. . . contare gli ordini che corrispondono, se sono 2 . . . allora fai un altro loop e OrderModify().

L'unico modo per imparare è leggere la documentazione di ogni funzione e capire come funzionano. . . ad esempio OrderType()

 

Ho provato una variazione di codici diversi ma non riesco ancora a farlo funzionare esattamente. Modifica uno dei trade aperti quando due sono aperti e continua a modificarlo, ho bisogno che sia modificato solo una volta e che entrambi i trade siano modificati.

     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);
  }}

Qualche suggerimento su cosa dovrei fare? Ho letto la documentazione btw.

 
Qual è la differenza tra prima che l'ordine sia modificato e dopo che è modificato? Cosa cambia?
 

Prima vengono impostati due ordini, poi uno di essi (una vendita in questo caso quando ho testato la data specifica) viene eseguito. Più tardi nel corso della giornata il secondo ordine (che è ancora lì) viene eseguito, e questo commercio è un acquisto.
La vendita è l'ordine 1 e l'acquisto è l'ordine 2. L'acquisto (ordine 2) ha il suo TakeProfit modificato di 16.3 pip (non sono sicuro del perché non aggiunge 20 pip), poi il TakeProfit viene aumentato di 0.2 pip nello stesso minuto, e questo continua ad accadere, il TakeProfit viene continuamente modificato durante il giorno, a volte aumentato, a volte diminuito, non sono sicuro del perché questo accade.

Edit: penso che i 16.3 pip e gli ulteriori cambiamenti siano anche influenzati dallo spread?

 
Ok, possiamo tornare all'inizio... So che stai cercando di modificare due ordini... ma che cosa stai cercando di fare esattamente? Un tailing SL? Qualcos'altro? Cosa stai cercando di ottenere?
 
madmax3 2012.03.09 15:06
WHRoeder:

Ti è stato detto che la selezione non funzionerà ieri. E che è necessario testare i codici di ritorno e circa totale

Se non ti prenderai la briga di leggere i post e correggere il tuo codice, non ci prenderemo la briga di provare ad aiutarti.


Ho fatto entrambe le cose di cui sopra, si sta riferendo alla persona sbagliata methinks

Mi riferivo al tuo post direttamente precedente

madmax3 2012.03.09 14:52
Ecco il codice rivisto per l'intero EA:
   total=OrdersTotal();
   if(total<1) 
Che mostra ancora i problemi che ho dichiarato.