avventure di un principiante

 

Ehi ragazzi, grazie per avermi aiutato con il mio codice, sono le 2.11 del mattino a Londra, e sto cercando di decifrare questo enigma mql da un po'. A proposito CodesGuru ti ringrazio per i tutorial, sono più chiari della roba standard offerta, bello sforzo!


Sono alle prime armi con la codifica di una strategia e come sempre ho bisogno dell'aiuto dei professionisti in questo.


Qui sotto c'è un codice che ho messo insieme, ma per qualche motivo esegue solo operazioni brevi.


Sono bloccato senza sapere perché. Inoltre ho anche bisogno di aggiungere questo: 1. Il codice deve eseguire entrambi i trade Long e Short indipendentemente dal fatto che ci sia già un trade aperto nella direzione opposta (es: se c'è un trade long che è aperto, il codice dovrebbe comunque inserire una posizione short se le condizioni sono soddisfatte). Credo di dover giocare con la funzione'OrdersTotal()==0; ma non so cosa fare.


Il codice è allegato. (ho provato ad allegarlo ma per qualche motivo non lo fa, qualche idea su cosa stia succedendo?)


Prometto una buona bottiglia di champaigne per la persona che mi aiuta di più a portare questo codice alla fruizione dal vivo :-)


ps: Ho testato questo in mt4 simulator/strategy tester.


attendo il vostro aiuto ragazzi!

nick

 
//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if(Bars<75)
      {
      Print("Bars less than 100");
      return(0); 
      }
   //Declaration
   
  double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3;
  
  ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
  ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
  ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
 e1under2= ema1< ema2;
 e2under3= ema2< ema3;
 e1over2= ema1> ema2;
 e2over3= ema2> ema3;

 
 

   if(OrdersTotal()==0)   // one order at the time
      {
      // Short  Entry
      static int ticket;
      if( e1under2 && e2under3)     // short function
         {                                                                    
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);   
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
            }
            if(OrdersTotal()==0)   // one order at the time
            if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
         
         {
         if( e1over2 && e2over3) //buy function                                                                    
         ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
            else Print("Error opening BUY order : ",GetLastError());
            return(0);     
         }
 
            
            

            
            
            
            return(0);     
         }
         
         
  
   return(0);
   }
   }
questo è il codice ragazzi!
 

Wow! Un ottimo lavoro di codifica per un "principiante". Riesci a scrivere il tuo codice in modo molto più conciso di quanto sia in grado di fare io.


Ho notato che hai due linee condizionali-if identiche per la sezione BUY, mentre la sezione SELL ne ha solo una.


La seconda frase condizionale identica per la funzione BUY è probabilmente innocua, ma è necessaria?


            if(OrdersTotal()==0)   // un ordine alla volta
if(e1over2 && e2over3) //questo può essere disordinato perché la vecchia versione aveva ==1 per tutte le variabili <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ecco la prima

{
if(e1over2 && e2over3) //comprate la funzione <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ecco la seconda
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,0,Green); //perché 12345? Ho aggiunto ASk-30*Point per lo stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());
}
else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());
return(0);
}


Inoltre, sembra che tu abbia entrambe le funzioni Sell e Buy contenute nella stessa Conditional-if:



if(OrdersTotal()==0) // un ordine alla volta
{
// Short Entry
static int ticket;
if(e1under2 && e2under3) // funzione short
{ // La parentesi di corrispondenza per questo è molto al di sotto della funzione SELL e BUY<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< vedi sotto
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point, "Short Order ",0,0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine SHORT aperto : ",OrderOpenPrice());
}


if(OrdersTotal()==0) // un ordine alla volta
if(e1over2 && e2over3) //questo può essere disordinato perché la vecchia versione aveva ==1 per tutte le variabili

{
if(e1over2 && e2over3) //funzione di acquisto
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,0,Green); //perché 12345? Ho aggiunto ASk-30*Point per lo stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());
}
else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());
return(0);
}







return(0);
} // questa è la parentesi corrispondente a quella mostrata sopra<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<vedi sopra


return(0);
}
}





L'ordine BUY è soggetto al criterio SELL nel modo in cui hai disposto il conditional-if annotato.









 
niko:
questo è il codice ragazzi!

La ragione per cui non fa mai un ordine lungo è che non hai chiuso il blocco di codice che esegue l'ordine breve con una parentesi graffa di chiusura. Questo significa che essenzialmente stai eseguendo un ordine lungo solo se (e1under2 && e2under3) AND (e1over2 && e2over3), cosa che immagino non accadrà.


Dici che vuoi aprire un ordine anche se c'è già un ordine aperto nell'altra direzione. Da questo presumo che tu voglia limitare il numero di ordini ad un massimo di uno in ogni direzione. Includendo il controllo che OrdersTotal() sia uguale a zero, questo vi limita effettivamente a 1 ordine totale, non uno in ogni direzione. Quello che devi fare è controllare il numero e il tipo di ordini esistenti usando un ciclo e dei contatori (molti esempi in questo sito), poi usare il risultato per determinare se un ordine deve essere fatto.


Ho notato nel tuo altro post, come hai menzionato che volevi imparare a scrivere MQL quindi non ho intenzione di scrivere questo per te. Questo esempio è esattamente il giusto tipo di codice e logica semplice che è essenziale nel processo di apprendimento.


Per favore, fallo per te e fammi sapere come va.

 

Ehi ragazzi, siete delle leggende!!!

Grazie per i vostri commenti FXTrader2008 e cloudbreaker. Non avevo notato che c'era una condizione ripetuta per l'acquisto, l'ho tagliata, e ha senso che la staffa non sia chiusa. Buona idea non darmi la risposta codificata, perché voglio imparare il codice da solo. Darò un'occhiata online per loop/contatori.

Oh, il motivo per cui il codice è così bello e compatto è perché un mio amico mi ha aiutato a metterlo insieme (che è un programmatore).

Procederò con la mia parte di cose e se mi blocco vi farò sapere!

Voi fate trading sui mercati dal vivo in modo indipendente o lavorate per metaquotes?

 

Non ho guardato in profondità nel tuo codice, ma un primo consiglio:


Prova a strutturare il tuo codice più chiaramente - non lo facciamo per divertimento ma per una migliore lettura e comprensione! Non ha alcuna influenza sul "senso" o significato del codice...


Vediamo come il tuo codice DOVREBBE apparire (solo la parte essenziale):

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function
     {                                                                    
      ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);  
      if( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
        }
      if(OrdersTotal()==0)   // one order at the time
      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
            ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);    
        }
      return(0);    
     }
   return(0);
  }
 

Come potete vedere ora: Testate solo la vostra condizione "short".

   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function

e all'interno di questo test per la condizione "lunga", due volte - per sicurezza ; ) - questo non può funzionare.

      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
 

Meglio: (ma lontano dalla perfezione)

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   if ( e1under2 && e2under3)     // short function
     {                                                                    
      ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);  
      if ( ticket>0)
        {
         if (OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
        } }
   if( e1over2 && e2over3) //buy function {
      ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
      if ( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
      else Print("Error opening BUY order : ",GetLastError());
     }
  return(0);
  }

Ora dovrebbe funzionare per scambi brevi e lunghi.

Consiglio vivamente di leggere questo libro qui su MQL4 - specialmente la sezione Creazione di un programma normale - è scritto molto bene e si può facilmente implementare la vostra strategia. Ho anche iniziato così...

Se scarichi i file lì e hai problemi con i commenti (dato che sono in cirillico) apri "word", copia&incolla il sorgente di ogni file dalla pagina internet (dato che i commenti lì sono in inglese) a word e infine copia&incolla da word a Metaeditor. D'ora in poi potrai studiare i programmi in inglese.


Spero di essere stato d'aiuto...


(A proposito: Anche io sono molto nuovo di MQL4 ma lavoro come programmatore e quindi la sintassi e la struttura non sono un problema per me...)


Saluti TuRRiCAN

 
Ooops, nel tempo necessario per rispondere, gli altri sono stati più veloci ...
 
TuRRiCAN wrote >>
Ooops, nel tempo necessario per rispondere, gli altri sono stati più veloci ...

Hey Tourrican questo è molto utile grazie! Il cirillico non è un problema, sono russo, dalla Siberia in realtà.

Sì, ho studiato il libro mql, ma è ancora al di fuori dell'apprendimento pratico, è tutta un'altra cosa studiarlo e poi provare a scrivere un programma da solo (perché non spiegano chiaramente con esempi di vita reale in ogni parte del libro, perché e come queste cose sono usate, sai.

Ma ci arriverò, il desiderio ardente dentro di me di fare questo lavoro è più grande di qualsiasi ostacolo.

 
niko:

Fate trading sui mercati dal vivo in modo indipendente o lavorate per metaquotes?

Per rispondere alla tua domanda, normalmente lavoro come pilota di elicotteri. Tuttavia, data la situazione economica, la società per cui lavoro non vuole volare al momento. Così, nel frattempo, sto sviluppando EAs per una società che è di proprietà del mio migliore amico. Stiamo facendo trading dal vivo per conto di alcuni fondi abbastanza noti.

Sono contento che tu stia cercando di imparare a codificare e ti aiuterò quando posso. È rinfrescante trovare qualcuno che si unisce al forum e vuole imparare ad essere autosufficiente.