Problema con la quantità totale di ordini aperti

 

Ciao a tutti, ho provato tutti i consigli che ho trovato su questo forum, ma nessuno sembra funzionare. Credo che il problema stia nella mia funzione OrderTotal. Faccio trading su 10 coppie di valute, cioè ho l'EA aperto su 10 grafici. Si tratta di una semplice strategia di copertura. Voglio che l'EA apra un trade (long o short) a seconda dei segnali. Se il trade va a mio favore, Trailingstop o Take profit. Se, invece, il trade va contro di me, voglio che apra un trade nella direzione opposta. Il codice che sto usando sembra funzionare ma poi a volte si blocca, cioè non apre più nessun trade. Inoltre, quando ci sono uno o due trade aperti su una coppia, non sembra voler aprire nessun trade su altre coppie.

Ecco il mio codice

int start()
{
     {
     if (OrdersTotal() == 0)
     if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
         }

  for(int i=OrdersTotal()-1; i>=0; i--) 
  {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      if (OrderSymbol()==Symbol())
      //Calculate the point value in case there are extra digits in the quotes
      if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
      else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
      else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
      else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);

//calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
      double lots = NormalizeDouble(OrderLots() * Multiplier, 2); 
      
     if (OrderType() == OP_BUY) 
      {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *PointValue,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *PointValue,Digits))
            {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *PointValue,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
              }
            }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*PointValue,Digits))
            if(OrdersTotal() == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*PointValue, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
          }
 
  1. È necessario filtrare i mestieri.
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
          if (OrderSymbol()==Symbol())
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;  // These
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);                    // Execute only on Symbol orders.
    
          double lots = NormalizeDouble(OrderLots() * Multiplier, 2);  // This and below are always executed
          if (OrderType() == OP_BUY)                                   // Symbol is irrelevant.             
    
    Con le parentesi graffe.
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
          if (OrderSymbol()==Symbol())
    {                                                                   // Rest of code executes only on Symbol orders.
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
          double lots = NormalizeDouble(OrderLots() * Multiplier, 2); 
          
          if (OrderType() == OP_BUY) 
             :
    }

  2. Su un broker a 4 cifre, punto = 0,0001
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
    Fisso e semplificato.
    PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;

  3. Poiché tutto ciò che è dentro le parentesi graffe è Symbol(), ogni MarketInfo può essere sostituito con variabili predefinite
  4. Non codificare i numeri in modo rigido.
    Controlla i tuoi codici di ritornoCosa sono i valori di ritorno delle funzioni? Come si usano? -Forum MQL4 ed errori comuni nei programmi MQL4 e come evitarli - Articoli MQL4
    result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue);
 

1. Grazie mille per il tuo aiuto. Ho aggiunto un tutore come suggerito, ma l'EA continua ad aprire un trade solo su una coppia di valute. Non aprirà un trade su nessuno degli altri grafici anche se le condizioni di acquisto sono state soddisfatte. Sono stato bloccato su questo per settimane, puoi per favore dare un'altra occhiata.

2. EDIT: Non è più necessario

3. Il mio codice ora assomiglia a questo

int start()
{
  {
    if (OrdersTotal() == 0)
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
  }       

  for(int i=OrdersTotal()-1; i>=0; i--) 
    {
      //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
      double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      if (OrderSymbol()==Symbol())
    { 
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(OrdersTotal() == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }
 
    if (OrdersTotal() == 0)
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
Se un ordine è aperto su qualsiasi coppia, non aprirà un altro ordine finché OrdersTotal()==0 di nuovo
 
GumRai:
Se un ordine è aperto su qualsiasi coppia, non ne aprirà un altro finché OrdersTotal()==0 di nuovo

Grazie per il vostro aiuto. Ho bisogno di limitare il primo ordine originale a una sola operazione. Non voglio che l'EA continui ad aprire ordini quando la condizione di acquisto è soddisfatta. Così ho aggiunto l'Orderstotal per limitare questo. Questo codice, tuttavia sembra interferire con il codice qui

else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(OrdersTotal() == 1) //<----------
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());

Qui voglio che l'EA apra solo una copertura per ogni trade aperto, quindi OrderTotal ==1

Qual è allora il modo migliore per limitare il numero di trade, cioè un trade originale e uno di copertura? Grazie

 
Trader3000: Qual è allora il modo migliore per limitare il numero di trade, cioè un trade originale e un trade di copertura?
  1. Quindi conta il numero di ordini che sono aperti sul grafico corrente. OrdersTotal restituisce il numero di ordini aperti su tutti i grafici.
  2. Non filtrare per numero magico rende l'EA incompatibile con tutti gli altri (incluso se stesso su altri TF) e il trading manuale Symbol non è uguale a Ordersymbol quando un'altra valuta viene aggiunta a un altro grafico separato. - MQL4 forum
 

Grazie mille per l'aiuto di tutti. Ho risolto il problema e ora l'EA aprirà un trade su tutti i grafici quando la condizione di acquisto è soddisfatta, tuttavia, nulla al di sotto di questo funziona. L'EA non chiama le funzioni Trailingstop o Hedge. Qualcuno può dare un'occhiata e farmi sapere cosa ho fatto di sbagliato perché non riesco a capirlo.

int start()
{ 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
    {
         result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
    
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
 else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }
 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   double lots = NormalizeDouble(OrderLots() * Multiplier, 2);

Non so esattamente cosa stai facendo, ma ti suggerisco di evitare di nominare 2 variabili con l'unica differenza di una lettera maiuscola. È facile confondere le 2, specialmente quando gli altri che leggono il tuo codice potrebbero aver adottato la convenzione che le variabili che iniziano con una lettera maiuscola sono Globalscope.

Nessun ordine è stato selezionato, quindi OrderLots() potrebbe essere qualsiasi cosa


    
     if (OrderType() == OP_BUY) 

Questo userebbe i valori dell'ultimo ordine selezionato nel ciclo precedente, potrebbe non essere il numero magico o il simbolo corretto.

 

Grazie per la tua risposta. Quello che sto cercando di fare è che l'EA apra il primo trade originale, dove la dimensione del lotto è una percentuale del mio capitale. Se il trade va contro

Per quanto mi riguarda, l'EA deve aprire una copertura nella direzione opposta, ma qui la dimensione del lotto deve essere 3 volte la dimensione del lotto originale (OrderLots). Anche se sembra che nessun

ordine è stato selezionato, non sembra influenzare il funzionamento. Ora ho messo i Lotti direttamente nella funzione OrderSend, ma né il trailingstop né

la copertura viene attivata quando dovrebbe. Entrambi funzionavano perfettamente prima che aggiungessi questo

total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }

int start()
{ 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
    {
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }

Credo che le mie parentesi graffe {} non siano al posto giusto

 
Te l'ho già detto nella seconda parte del mio post precedente
 

Grazie mille per tutto l'aiuto che mi avete dato finora, sto facendo progressi. Ora ho fatto in modo che tutto sembra funzionare come dovrebbe, tranne che l'EA ignora la condizione per l'apertura di un trade di copertura. A volte (ma non sempre) apre un trade di copertura anche quando le condizioni non sono state soddisfatte. Inoltre il TrailingStop non sempre si attiva. Penso che mi manchino ancora delle parentesi graffe {} da qualche parte. Il mio codice ora assomiglia a questo. Qualcuno può dare un'occhiata per me, grazie.

int start()
{ 
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
    {
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK)
            if(total == 1)
            {
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
            }
       }
      // else if (OrderType() == OP_SELL)
      // ... 

GumRai:

This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.


Ho provato a risolvere il problema cambiando le parentesi graffe, è il modo migliore o devo duplicare e aggiungere la funzione OrderSelect ogni volta prima di OrderSend? Grazie
Motivazione: