EA per ogni coppia di valute - quale codice per aprire solo una volta per coppia di valute? - pagina 3

 

Ho cambiato il meccanismo di chiusura da:

for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose()

a

for (int k = 0; k < OrdersTotal(); k ++) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

e ora tutto funziona come previsto. Anche se non capisco perché è così. Perché davvero non capisco le linee aggiuntive nel secondo codice. Ma grazie ragazzi!

 
grey.unit:

Cambio il meccanismo di chiusura da:

a

e ora tutto funziona come previsto. Grazie ragazzi!

Probabilmente non funzionerà sempre. . . quando si chiudono gli ordini aperti o si cancellano gli ordini pendenti all'interno di un ciclo si DEVE contare verso il basso e non verso l'alto. . . devi cambiare il tuo ciclo. E devi rimettere il chack in Symbol() . . . altrimenti l'EA per EURUSD finirà per chiudere potenzialmente gli ordini per GBPUSD . . . quello che dovevi fare era eliminare il continue . . . o trasformare il == in !=
 
grey.unit:

Ho cambiato il meccanismo di chiusura da:

a

e ora tutto funziona come previsto. Anche se non capisco perché è così. Perché davvero non capisco le linee aggiuntive nel secondo codice. Ma grazie ragazzi!

Il tuo secondo codice è corretto ma un po' strano. Apri MetaEditor, finestra di navigazione (Ctrl + D), scheda dizionario, e seleziona MQL4 Reference > Standard constants > Trade operations.

 
RaptorUK:
Probabilmente non funzionerà sempre. . . quando si chiudono gli ordini aperti o si cancellano gli ordini pendenti all'interno di un ciclo si DEVE contare verso il basso e non verso l'alto. . . devi cambiare il tuo ciclo. E devi rimettere il chack in Symbol() . . . altrimenti l'EA per EURUSD finirà per chiudere potenzialmente gli ordini per GBPUSD . . . quello che dovevi fare era eliminare il continue . . . o trasformare il == in !=

Solo per capire bene. Quello che dici è che se modifico il primo codice in:

for (int j = 0; j < OrdersTotal(); j --) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())       // Another security    
                 {

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

allora dovrebbe anche funzionare? Perché ho provato questo e apre solo un ordine per coppia di valute di nuovo.

Oppure se cambio il secondo codice in (k++ a k--) apre anche un solo ordine per coppia di valute.

for (int k = 0; k < OrdersTotal(); k --) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   
 
grey.unit:

Solo per capire bene. Quello che dici è che se modifico il primo codice in:

allora dovrebbe anche funzionare? Perché ho provato questo e apre solo un ordine per coppia di valute di nuovo.

Oppure se cambio il secondo codice in (k++ a k--) apre anche un solo ordine per coppia di valute.

Sto parlando del primo codice, il ciclo che stai usando dove chiudi gli ordini... deve diminuire. . altrimenti si perdono gli ordini. Vedo che hai rimosso il continue e aggiunto le parentesi graffe { }, molto bene :-)

Aprire un ordine per coppia di valute o un ordine in totale?

 
RaptorUK:

Aprire un ordine per coppia di valute o un ordine in totale?

Sì, in totale, naturalmente. Ok, secondo codice:


for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

Quando parliamo del ciclo penso che tu intenda questo:

for (int j = 0; j < OrdersTotal(); j ++)

In realtà lo cambierei in qualcosa come questo:

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

Questa linea apre solo un ordine per coppia di valute (come desiderato!)

Il ciclo è corretto per quanto riguarda questo problema ora?

RaptorUK:

Probabilmente non funzionerà sempre . . . quando si chiudono gli ordini aperti o si cancellano gli ordini pendenti all'interno di un ciclo si DEVE contare verso il basso e non verso l'alto . . . devi cambiare il tuo ciclo. E devi rimettere il chack in Symbol() . . . altrimenti l'EA per EURUSD finirà per chiudere potenzialmente gli ordini per GBPUSD . . . quello che dovevi fare era eliminare il continue . .. o trasformare il == in !=
 
grey.unit:

Sì, in totale, naturalmente. Ok, secondo codice:


Quando parliamo del ciclo penso che tu intenda questo:

In realtà lo cambierei in qualcosa come questo:

Questa linea apre solo un ordine per coppia di valute (come desiderato!)

Il ciclo è corretto per quanto riguarda questo problema ora?

No, fai così...

for (int j = OrdersTotal()-1 ; j >= 0 ; j --)   // start at OrdersTotal() -1 ,  finish when j = 0

La prima posizione dell'ordine è 0 quindi se hai 5 ordini le posizioni sono 0, 1, 2, 3, 4 . . . quindi l'ultima è OrdersTotal() - 1 . . . quindi per contare alla rovescia inizi da OrdersTotal()-1 e finisci a 0

 
Ok, grazie mille per il vostro aiuto!
 
RaptorUK:

No, fai così . . .

La prima posizione dell'ordine è 0 quindi se hai 5 ordini le posizioni sono 0, 1, 2, 3, 4 . . . quindi l'ultimo è OrdersTotal() - 1 . . . quindi per contare alla rovescia inizi da OrdersTotal()-1 e finisci a 0

Quindi dovrebbe apparire così:

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

perché hai scritto questo:

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

o mi sbaglio?

 
grey.unit:

Quindi dovrebbe essere così:

perché hai scritto questo:

o mi sbaglio?

Ti sbagli di grosso. Il vostro codice non viene mai eseguito! Usa quello di RaptorUK.