semplice domanda

 

Saluti a tutti voi. Ho creato un codice (modificando altri codici) per chiudere gli ordini a mercato.



int l_pos_44 = 0;

if (CheckFirstOP(OP_BUY) > 1) {

for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continua;

double Price = OrderOpenPrice();

if (NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits)) {

Dist = MathAbs(Bid - Price);

int Ticket = OrderTicket();

double Lot = OrderLots();

OrderClose(Ticket, Lot, Bid, 3);

}

}


(lo stesso codice per la chiusura delle posizioni di vendita (ovviamente con la variabile OP_SELL invece di OP_BUY))


int CheckFirstOP(int a_cmd_0) {

int l_count_4 = 0;

for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {

if (OrderSelect(l_pos_8, SELECT_BY_POS)) {

if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {

if (OrderType() == a_cmd_0) {

l_count_4++;

break;

}

}

}

}

return (l_count_4);

}


Ho bisogno di un codice per chiudere le posizioni long o short quando ci sono più di 1 posizione aperta per tipo...quindi mantenere 2 posizioni in totale (1 buy e 1 sell)...ho bisogno anche di mantenere la posizione aperta più recente cioè in questo caso quella con il prezzo aperto più alto per la posizione buy e quella con il prezzo aperto più basso per la posizione sell. Il problema è che il codice non chiude le posizioni...non ne chiude nessuna.


quando: "if (CheckFirstOP(OP_BUY) == 1)" allora il codice chiude le prime posizioni immediatamente dopo la loro apertura...cioè dopo che un ordine di acquisto e uno di vendita sono stati aperti vengono chiusi con il prossimo tick. E quando: "if (CheckFirstOP(OP_BUY) > 1)" nessuna delle posizioni viene chiusa. Non so cosa sto sbagliando.

Per favore, qualcuno può aiutarmi?

 

I forgot:


doppio Dist = 1000000.0;

 
Aljohin:

Per favore, qualcuno può aiutarmi?

1. Questa è solo una parte del tuo codice, mostraci la funzione CheckFirstOP() per esempio.

2. Il ciclo for sta incrementando. Questo non funziona correttamente se si chiudono gli ordini nel ciclo, vedi -> https://www.mql5.com/en/forum/119840.

3. La tua convenzione di denominazione delle variabili non è... così buona.

4. Per favore usa il tasto SRC per postare il tuo codice in modo che mantenga la formattazione. È molto difficile leggere il tuo codice così.

 
gordon:

1. Questa è solo una parte del tuo codice, mostraci la funzione CheckFirstOP() per esempio.

2. Il ciclo for sta incrementando. Questo non funzionerà correttamente se si chiudono gli ordini nel ciclo, vedi -> https://www.mql5.com/en/forum/119840.

3. La tua convenzione di denominazione delle variabili non è... così buona.

4. Per favore, usa il tasto SRC per postare il tuo codice in modo che mantenga la formattazione. È molto difficile leggere il tuo codice così.


double Dist=1000000.0;
if ( CheckFirstOP(OP_BUY) > 1) {
      for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
          OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }

int CheckFirstOP(int a_cmd_0) {
   int l_count_4 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect( l_pos_8, SELECT_BY_POS)) {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
            if (OrderType() == a_cmd_0) {
               l_count_4++;
               break;
            }
         }
      }
   }
   return ( l_count_4);
}
my fault...i'm very new to this stuf...
 
gordon:

3. La tua convenzione di denominazione delle variabili è... non molto buona.

sembra una convenzione di nome del decompilatore ...

"è nuovo di queste cose".

 
meikel:

sembra una convenzione sul nome del decompilatore...

"è nuovo di queste cose"

probabilmente sì...voglio modificare un EA che ho comprato...mi hanno anche inviato il codice (hanno detto per errore)...ora capisco il motivo di questa nomenclatura così strana...come ho detto sono nuovo (ho appena letto il libro di MQL4 in questo sito) e non volevo modificare molte cose almeno all'inizio così ho lasciato i nomi come li ho trovati.

 
Ais:

Ciao

L'ordine selezionato può essere completamente chiuso dall'espressione: "OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;"

Cordiali saluti

non risolve il mio problema...

 
gordon:

2. Il ciclo for sta incrementando. Questo non funziona correttamente se si chiudono gli ordini nel ciclo, vedi -> https://www.mql5.com/en/forum/119840.

Perché l'incremento non funziona? Nel libro di MQL4 non è menzionato (credo)... comunque ho provato:


if ( CheckFirstOP(OP_BUY) > 1) {
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
          OrderSelect( i, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }
it doesn't work, don't know why
 
Ais:

basta essere sicuri in questa linea ora

Sì, certo, ho provato e non cambia nulla...cose strane con questa programmazione :) non sarebbe difficile scrivere un semplice ordine di chiusura (ho pensato)...

 
it doesn't work, don't know why
Quando si chiude l'indice dell'ordine 5, l'indice dell'ordine 6 diventa l'indice 5, il 7 diventa il 6, ecc. Contando in alto si perdono tutti gli altri ordini aperti.
 
WHRoeder:
Quando si chiude l'ordine indice 5, l'ordine indice 6 diventa indice 5, il 7 diventa 6, ecc. Facendo il conto si perdono tutti gli altri ordini aperti.

ah ok, capito...comunque il codice è pensato per mantenere un solo ordine aperto e iniziare a lavorare immediatamente quando ci sono 2 ordini aperti e chiuderne uno dopo averli selezionati e analizzati tutti (cioè 2 ordini)...quindi non credo sia un grosso errore incrementare nella selezione degli ordini...comunque ho provato il metodo di decremento senza alcun risultato...forse sto provando in modo sbagliato...non so...qualcuno può provare il mio codice e vedere se chiude veramente i trade...o qualcuno può scrivere un semplice codice per selezionare e chiudere l'ordine aperto precedente (cioè quello con prezzo aperto più alto per comprare e con prezzo aperto più basso per vendere)?

grazie