Risposta

Possibile codifica per consentire l'apertura di più compravendite per superare la dimensione massima del lotto

0 risposte

jbrunet

Abbonato, bbp_partecipante, comunità, 13 risposte.

Visita il profilo

10 anni fa #111607

La maggior parte dei broker ha un limite al numero di lotti che consente di aprire. In alcuni casi, è auspicabile aprire più operazioni per ottenere un numero di lotti aperti superiore al limite massimo fissato dal broker per ogni singolo ticket. Ho fatto qualche esperimento e ho scoperto che la seguente modifica alla funzione sqOpenOrderWithErrorHandling() consente di ottenere questo risultato. Lo propongo come suggerimento da includere nelle versioni future, se gli sviluppatori e gli altri utenti lo riterranno opportuno. Se qualcuno desidera provarlo, è libero di farlo, ma si assicuri di testarlo accuratamente per essere sicuro che non rompa qualcos'altro. I miei test personali hanno riscontrato (finora) che non interrompe altre funzioni e quindi lo sto usando con successo.

 

Si noti che al posto di LotsDecimals, che è definito come double da EA Wizard, di solito utilizzo una variabile int, decimals, che è una variabile int globale ed è definita come il numero di cifre decimali consentite per il dimensionamento dei lotti da quel particolare broker. Nella maggior parte dei casi è 2, per i broker che consentono i micro lotti. Ho utilizzato LotsDecimals nella mia codifica personalizzata di seguito, poiché è la norma per EA Wizard, ma nella mia pratica, utilizzo invece la variabile int decimals.

 

int sqOpenOrderWithErrorHandling(string symbol, int orderType, double orderLots, double price, double realSL, double realPT, string comment, int orderMagicNumber) {
   int ticket, error;
 
// ***** Codice aggiunto personalizzato
  double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
  double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
 
  double jlots=ordineLotti ;     
  double ilots=0.0 ;
  mentre(jlots>0.0) 
    {
        ilots=jlots ;
        if(ilots>mmaxlots) ilots=mmaxlots ;
        if(ilots<mminlots) ilots=mminlots ;
        ilots=NormalizzaDouble(ilots,LotsDecimals) ;
        jlots=jlots-ilots ;
      
 
 
   if(symbol == "NULL") {
      ticket = OrderSend(Symbol(), orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
   } else {
      ticket = OrderSend(simbolo, orderType, ilots, prezzo, MaxSlippage, 0, 0, commento, orderMagicNumber);
   }
// **** Fine del codice aggiunto personalizzato per questa sezione... Vedere il codice aggiuntivo alla fine della funzione.
 

 

   if(ticket < 0) {
      // ordine fallito, scrivere l'errore nel log
      restituire(-1*GetLastError());
   }
 
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   Log("Ordine aperto: ", OrderTicket(), " al prezzo:", OrderOpenPrice());
 
   // impostare stop loss e obiettivo di profitto
   // deve essere fatto separatamente per supportare i broker ECN
   if((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT)) {
      if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
         Log("Ordine modificato, StopLoss: ", realSL,", Profit Target: ", realPT);
      } else {
         error = GetLastError();
         Log("Errore nella modifica dell'ordine: ", errore, " : ", ErrorDescription(error));
 
         RefreshRates();
         if(orderType == OP_BUY) price = Ask;
         if(orderType == OP_SELL) price = Bid;
         se(OrderClose(ticket, orderLots, prezzo, 6) != true) {
            error = GetLastError();
            Log("Impossibile chiudere l'ordine: ", OrderTicket(), ", Errore nell'apertura dell'ordine: ", error, " : ", ErrorDescription(error));
            restituire(-1*errore);
         }
      }
   }
 
// ***** Codice aggiuntivo personalizzato

 

  if(jlots>0.0) continuare ;
 }  
 
// **** Fine del codice aggiunto personalizzato per questa sezione

 

 
  return(ticket);
}

0