Problema di ordini multipli

 

Ciao a tutti,

Ho un problema con il mio codice. Quando un ordine (acquisto o vendita) si apre altri vengono in fila.

Quello che sto cercando di fare è

se l'ultimo ordine è una vendita, aprire un ordine di acquisto quando il prezzo è superiore all'ordine Openprice più alcuni pip (ReturnDist).

se l'ultimo ordine è un acquisto, allora apri un ordine di vendita quando il prezzo scende sotto l'Openprice meno alcuni pips.

Qualcuno può dare un aiuto qui?

Grazie in anticipo

Luis

 
luisneves:

Ciao a tutti,

Ho un problema con il mio codice. Quando un ordine (acquisto o vendita) si apre altri vengono in fila.

Quello che sto cercando di fare è

se l'ultimo ordine è una vendita, aprire un ordine di acquisto quando il prezzo è superiore all'ordine Openprice più alcuni pip (ReturnDist).

se l'ultimo ordine è un acquisto, allora apri un ordine di vendita quando il prezzo scende sotto l'Openprice meno alcuni pips.

Qualcuno può dare un aiuto qui?

Grazie in anticipo

Luis

Qual è il tuo piano per limitarlo?

Inizializzi OpenOpposite con 1.

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

Ad ogni tick, chiami OpenOppositeOrder()

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

Non vedo nessun altro riferimento a OpenOpposite.

Il ciclo for in OpenOppositeOrder non ha alcuna restrizione da quanto ho visto finora... dovrebbe?

Dove pensi che sia l'errore nel tuo codice?

 

Ciao Kronin,

Prima di tutto grazie per la tua pronta risposta.

Scusa per il disordine ma quello che ho cercato di fare era di avere blocchi di codice indipendenti e funzionanti.

Quindi, ho pulito la linea che hai segnato e la parte superiore che dice void OpenOpposite () e ora arriva qualche errore come;

espressione su ambito globale non consentita, ecc.

Se non ti sto prendendo molto tempo potresti aiutarmi qui?

Grazie

Luis



 
luisneves:

Ciao Kronin,

Prima di tutto grazie per la tua pronta risposta.

Scusa per il disordine ma quello che ho cercato di fare era di avere blocchi di codice indipendenti e funzionanti.

Quindi, ho pulito la linea che hai segnato e la parte superiore che dice void OpenOpposite () e ora arriva qualche errore come;

espressione su ambito globale non consentita, ecc.

Se non ti sto prendendo molto tempo potresti aiutarmi qui?

Grazie

Luis

Non ho detto che devi pulire qualcosa. Volevo solo sapere, dove cerchi di limitare l'EA dall'aprire più di un ordine.

Prova questo (non l'ho testato):

Cambia la funzione di avvio in (Forse devi filtrare solo per gli ordini di mercato aperti -> a seconda della tua strategia):

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

Aggiungere un contatore OpenOpposite alla funzione OpenOppositeOrder():

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

Questo dovrebbe risolvere il problema degli ordini multipli aperti in fila. Limita l'EA ad aprire più di un ordine (opposto).

 
luisneves:

Ciao a tutti,

Ho un problema con il mio codice. Quando un ordine (acquisto o vendita) si apre, ne arrivano altri in fila.

Perché hai bisogno di un secondo thread sullo stesso pezzo di codice?

RaptorUK:

Guardando il tuo codice trovo molto difficile seguire quello che stai cercando di fare, vedo pochissimi commenti che mi aiutano, la tua funzione start() non mi mostra cosa stai cercando di fare su ogni tick, non hai un layout coerente di indentazione.


Da questo thread:https: //www.mql5.com/en/forum/142629 pagina 3

 
RaptorUK:

Guardando il tuo codice trovo molto difficile seguire quello che stai cercando di fare, vedo pochissimi commenti che mi aiutano, la tua funzione start() non mi mostra cosa stai cercando di fare su ogni tick, non hai un layout coerente di indentazione.

Sono d'accordo con questo. Non ho controllato nient'altro, a parte il problema degli ordini multipli, perché il codice non è facile da leggere. Sembra che parti del codice siano copiate e incollate da altro codice, scritto da qualcun altro. Meglio scrivere le proprie funzioni con il proprio stile (coerente).

 
kronin:

Non ho detto che devi pulire qualcosa. Volevo solo sapere, dove cerchi di limitare l'EA dall'aprire più di un ordine.

Prova questo (non l'ho testato):

Cambia la funzione di avvio in (Forse devi filtrare solo per gli ordini di mercato aperti -> a seconda della tua strategia):

Aggiungere un contatore OpenOpposite alla funzione OpenOppositeOrder():

Questo dovrebbe risolvere il problema degli ordini multipli aperti in fila. Limita l'EA ad aprire più di un ordine (opposto).


Ciao kronin,

Grazie per la tua pronta risposta al mio problema. Quello che sto cercando di ottenere è una condizione per aprire ordini come questo;

La prima apertura per mezzo di un indicatore è un acquisto (potrebbe essere una vendita, naturalmente) e poi un ordine di acquisto è aperto, se il prezzo rimbalza verso il basso ad un livello inferiore al prezzo aperto dall'ordine di acquisto, un ordine di vendita si aprirà, ma se il prezzo sale di nuovo non dovrebbe accadere un nuovo acquisto aperto. Qui un nuovo ordine di acquisto dovrebbe avvenire solo quando il prezzo rimbalza dall'ordine di vendita. Lo stesso se un ordine di vendita è il primo ad avvenire.
Ho provato ad ottenere questo con il seguente codice allegato ma non funziona. Qui funziona cheil primo ordine ad aprirsi è un acquisto, poi, come previsto, si apre un ordine di vendita, ma da qui non si aprono altri ordini...

Ho questi due blocchi di codice e sembra che il primo faccia quello che ci si aspetta che faccia: aprire un ordine di acquisto o di vendita se ci sono le condizioni definite dall'indicatore. Una volta che un ticket
d'ordine è ricevuto, allora una modifica dell'ordine è in atto per inviare i limiti dell'ordine.

Sto usando BuyTicket e SellTicket nel codice per evitare l'apertura di ordini multipli ma sembra che non sia il metodo giusto...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


Il codice che segue identifica gli ordini aperti e li filtra per simbolo di acquisto, numero magico e tipo di ordine. Una volta che rileva l'ultimo ordine aperto nel pool e se la condizione per aprire (considerando che l'ultimo ordine è un acquisto) e confermare che un biglietto di vendita non è presente, allora un ordine di vendita è aperto. Lo stesso se l'ultimo ordine è in vendita. E qui il codice funziona.

Il problema viene quando arriva una condizione per aprire un terzo ordine e così via. Qui, tuttavia, le condizioni di apertura ci sono e il codice ha funzionato bene con la seconda apertura, perché il codice non funziona qui?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

Il codice completo è allegato nel caso abbiate bisogno di vedere cosa sto cercando di spiegare.

Vi prego di prestare attenzione al fatto che ci sono ancora altri problemi e che alcuni codici potrebbero apparire strani, questo è il caso del modo in cui uso aprire gli ordini perché devo ancora imparare come aprire gli ordini basati su Bid più e meno Distance.

Apprezzo molto se potete aiutarmi.


Cordiali saluti
Luis

File:
 
Sai cosa ti dà Volume[0]? Come può avere senso aggiungere un valore di Punto a questo?
 

Ciao Raptor,

Hai ragione!

Sto ancora imparando e provo diversi modi per ottenere ciò di cui ho bisogno e a volte vengono fuori cose stupide.

Ho provato a fare uso di un oggetto per metterlo a livello di Bid e poi ottenere quella posizione per aprire gli ordini, sembra meglio di questo. Uno dei problemi principali è il modo di limitare le nuove aperture mentre l'ordine aperto non è chiuso.

So che hanno molto da imparare e provare per errore è un modo che ho trovato per capire meglio come questo eseguire in pratica. Mentre sto facendo il mio più per capire le informazioni dal libro e documentazione alcune volte mi sento perso e cercare di ottenere aiuto da altri. Qui in Portogallo è molto difficile ottenere lezioni su questo argomento e quindi sono tutto dipendente dalla buona volontà, pazienza e assertività da altri per ottenere aiuto e consigli. Quando l'aiuto arriva, faccio del mio meglio per capire, ma a volte non ci riesco.

Comunque grazie per avermi mostrato che il volume non è il modo per ottenere quel tipo di indicatore.

Cordiali saluti

Luis

 
luisneves:

Ciao Raptor,

Hai ragione!

Sto ancora imparando e provo diversi modi per ottenere ciò di cui ho bisogno e alcune volte vengono fuori cose stupide.

Apprezzo che tu stia provando e cercando di imparare anche tu, forse dovresti prima provare a creare un EA più semplice e lavorare con quello finché non capisci come fargli fare ciò di cui hai bisogno, provare alcune cose, aggiungere alcune dichiarazioni di stampa, vedere cosa succede, in questo modo imparerai e capirai, poi quando avrai imparato di più potrai aggiungere altro al tuo EA. Hai bisogno di avere un'idea chiara di ciò che vuoi che il tuo EA faccia prima di poterlo codificare, troppe funzionalità in una volta sola non renderanno il processo di pensiero chiaro più facile.

Un'altra cosa che ti aiuterà, prova a suddividere i compiti in moduli che puoi riutilizzare con altri EA, poi puoi codificare quel modulo, come una funzione definita dall'utente, da solo come parte di uno script o di un semplice EA per testarlo e assicurarti che funzioni e sia robusto... poi puoi usare quella funzione con fiducia in un EA sapendo che funziona.
 

Ciao RaptorUK,

Grazie per la tua risposta onesta. Ho già provato a rompere i compiti e altri tipi di problemi iniziano a presentarsi, ecco perché iniziare a mettere tutto insieme (e altri problemi inizia....)

Ho già provato a fare un altro EAs e ha funzionato bene, ma ora usando questo approccio senza l'uso di indicatori (quelli standard) le cose si complicano.

Il fatto è che ora sono completamente perso. Ho pensato che il modo in cui sono vedere il codice funziona tick per tick in teoria che dovrebbe funzionare e poi cercare di ottenere limiti per evitare aperture multiple porta le cose peggio.

Così ora ho alcuni blocchi di codice che funzionano bene, altri che hanno bisogno di un po' di attenzione per raffinare le prestazioni e altri (due) che non funzionano, e qui non so come arrivare da qui... semplice come questo e sono totalmente imputato dall'aiuto di persone che sanno come trattare con questo. Voi siete una delle persone che hanno dedicato più tempo ai problemi di m, ma anche così non sono ancora all'altezza di alcuni problemi. Se avessi avuto il tempo di imparare tutto il codice mql e poi iniziare a scrivere basato su un sacco di teoria ed esperienza acquisita in passato forse non ero qui.

Ho visto un EA (allegato) e poi ho cercato di capire come funziona in parti di codice che dovrebbero portarmi quello che sto cercando ma non ho avuto successo in questo. Quello che ho visto è che fa uso di un codice per ottenere aperture in base al prezzo più e meno una certa distanza. Qui quando cerco di ottenere questo viene un problema con i limiti e poi niente... non riesco puramente a metterlo in funzione... e poi non riesco a capire perché gli ordini alternativi non funzionano come in teoria (almeno per come l'ho visto io). Pura disgrazia.......

Comunque queste sono solo parole di un ragazzo limitato...

i migliori saluti

Luis

File: