Back to the index page  
  FAQ   Cerca   Lista utenti   Gruppi   Registrati   Profilo   Messaggi privati   Log in 
MQL: Creare un expert advisor per metatrader 4
Vai a 1, 2, 3  Successivo
 
Nuovo argomento   Rispondi    Indice del forum » Metatrader - Expert Advisor - MQL Precedente :: Successivo  
Ads
 Inviato: Dom Lug 23, 2017 10:47 am  
Messaggio
  Ads




MQL: Creare un expert advisor per metatrader 4
 MessaggioInviato: Gio Nov 22, 2007 10:18 am Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5573
Residenza: Padova

Questo topic si pone come guida per la creazione di un expert advisor passando in rassegna le funzioni principali offerte da mql (apertura e chiusura di ordini, trailing stop, stop-loss, target ecc... ). Prenderemo come esempio l'ea MACD Sample il cui codice è disponibile gratuitamente con il download della piattaforma metatrader. Potete consultare l'articolo da cui ho preso spunto visitando questo link:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Andiamo ad analizzare per prima cosa la strategia di trading che sta alla base del MACD Sample:

- il sistema aprirà e gestirà una sola operazione alla volta.

- entrata LONG se l'indicatore MACD è sotto lo zero, gira verso l'alto ed incrocia la linea rossa che sta scendendo.


Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



- entrata SHORT se il MACD è sopra lo zero, sta scendendo ed incrocia con la linea rossa che va nella direzione opposta.


Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



- uscita dal long se viene raggiunto il target prefissato, viene raggiunto lo stop (utilizzermo il trailing stop) o se viene generato un segnale di short.

- uscita dallo short se viene raggiunto il target prefissato, viene raggiunto lo stop (utilizzermo il trailing stop) o se viene generato un segnale di long.

Iniziamo a mettere giù l'ea. In alcuni casi il codice da scrivere può essere davvero lungo, avere una traccia da seguire può essere utile a non perder il filo:

1. Inizializzare variabili

2. Controlli iniziali
- controllo grafico, numero di barre sul grafico
- controllo sui valori delle variabili esterne: lotti, stop-loss, target point, trailing stop

3. Impostare le variabili interne per un accesso più rapido

4. Controllo sul conto:
- controllo sulla disponibilità di fondi
- possibilità di long? se si apri posizione ed esci
- possibilità di short? se si apri posizione ed esci

5. Controllo delle posiozioni precedentemente aperte
- se è long controlla se deve essere chiusa o se spostare lo stop
- se è short controlla se deve essere chiusa o se spostare lo stop

Andiamo ora ad analizzare passo-passo ogni singolo step:

1. Inizializzazione delle variabili:

Codice:
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;


Le variabili esterne permettono una notevole flessibilità al codice mql, esse infatti possono essere modificate anche a run-time nelle proprietà dell'expert advisor. Se non vengono modificate assumono invece il valore impostato di default nel codice. Capite quindi l'importanza di dare dei valori molto significativi a queste varibili in modo da poter far comprendere la loro utilità anche a chi non conosce una riga di codice.

2. Controlli inziali

Codice:
if(Bars<100) {     
   Print("bars less than 100");     
   return(0);       
   }   
if(TakeProfit<10) {     
   Print("TakeProfit less than 10");     
   return(0);  // check TakeProfit     
   }


Questi controlli possono sembrare banali ma possono aiutare a non cadere in errore. Il Bars<100 è utile per sapere che si sta lavorando su un grafico normale, il TakeProfit<10 serve per controllare che i valori delle variabili esterne rimangano coerenti con la logica del programma.

3. Impostare le variabili interne per un accesso più rapido e una maggiore comodità:

Codice:
int start()  {   
   double MacdCurrent, MacdPrevious, SignalCurrent;   
   double SignalPrevious, MaCurrent, MaPrevious;   
   int cnt, ticket, total;

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);   
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);   
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);   
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);   
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);


Anche qui come per le variabili esterne un utilizzo intelligente dei nomi delle variabili può migliorare la leggibilità del codice. Per le funzioni iMACD e iMA vi rimando invece al topic:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Faccio solo notare come nei parametri delle funzioni vengano utilizzate delle variabili esterne tipo MATrendPeriod.

Per quanto riguarda le variabili interne prenso come esempio la variabile MaPrevious. Deve essere stata dichiarata dello stesso tipo del valore che la funzione iMA restituisce. Dopo averla inizializzata in questa maniera scrivere MaPrevious oppure iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1) sarà equivalente dal punto di vista del valore restituito.

4. Controllo sul conto:

Abbiamo detto che il nostro ea aprirà una sola posizione per volta, prima di verificare quindi che ci sia o meno la possibilità di piazzare un'ordine dobbiamo controllare che non ci siano delle posizioni ancora aperte:

Codice:
total=OrdersTotal();   
if(total<1)      {


La funzione OrdersTotal() restituisce il numero di ordini aperti o pendenti, il controllo total<1 permette quindi saltare il controllo sulla possibilità di aprire posizioni nel caso ci sia già almeno un ordine aperto.

Controllo sulla disponibilità di fondi:

Codice:
if(AccountFreeMargin()<(1000*Lots)) {         
   Print("We have no money. Free Margin = ", AccountFreeMargin());
   return(0);
   }


La funzione AccountFreeMargin() restituisce il margine che si ha a disposizione sul proprio conto. Il controllo AccountFreeMargin()<(1000*Lots) serve per non far aprire ordini spropositati e fare un minimo di money management. Ricordo che la variabile Lots è una variabile esterna modificabile a run-time.

E' possibile aprire un long?

Codice:
// check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         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);
        }


Abbiamo già descritto le condizioni per entrare con un long, queste vengono esaurite nel controllo effettuato dall'if.

La funzione OrderSend() è la funzione più utilizzata per aprire una posizione o un'ordine pendente, ecco la sua dichiarazione:

Codice:
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)


La funzione ritorna un numero intero che corrisponde al numero del ticket relativo all'ordine aperto in caso di successo mentre ritorna -1 in caso di insuccesso.

Il primo parametro symbol corrisponde ovviamente al cross su cui aprire la posizione, accetta in ingresso delle stringhe quali: "EURUSD", "USDJPY" ecc. Per aprirlo invece sul grafico a cui l'ea è attaccato basterà richiamare la funzione Symbol().

Il secondo parametro cmd è molto importante perchè permette di scegliere il tipo di ordine che si vuole aprire, questa tabella riassuntiva illustra tutti i vari valori possibili:

Codice:
Constant   Value   Description
OP_BUY      0   Buying position.
OP_SELL      1   Selling position.
OP_BUYLIMIT   2   Buy limit pending position.
OP_SELLLIMIT   3   Sell limit pending position.
OP_BUYSTOP   4   Buy stop pending position.
OP_SELLSTOP   5   Sell stop pending position.


Il terzo parametro volume corrisponde al numero di lotti con cui si vuole aprire la posizione. Ricordo che Lots è stata inizializzata come variabile esterna quindi è possibile modificarla anche a run-time. Effettuare un controllo su questa variabile può quindi rivelarsi utile, è importante sapere che per la maggior parte dei broker il valore minimo per aprire un lotto è 0.1 (minilotto), alcuni accettano anche 0.01 (microlotti); per scoprirlo è sufficente stampare il valore restituito dalla seguente chiamata MarketInfo(Symbol(),MODE_MINLOT). Per quanto riguarda il valore massimo è possibile utilizzare il valore restituito dala funzione MarketInfo(Symbol(),MODE_MAXLOT).

Il quarto parametro corrisponde al prezzo in cui si intende aprire la posizione, è un parametro su cui è necessario spendere qualche parola:

Nel caso in cui si intenda aprire uno short è necessario impostarlo a Bid, nel caso di un long ad Ask. Come spesso succede però la posizione non viene mai aperta istantaneamente è per questo che si può ricorrere al quinto parametro slippage.

Lo slippage è il valore espresso in pips della massima differenza accettabile perchè l'ordine venga aperto. Un'esempio chiarirà meglio la cosa:

vogliamo aprire un long sull'euro, l'Ask è a 1.4750. Dal momento in cui richiamiamo OrderSend() al momento in cui viene aperta la posizione e l'Ask varia. Se abbiamo impostato il parametro slippage a 3 una variazione maggiore di 3 pips farà in modo che l'ordine non venga aperto cioè se il prezzo sarà inferiore o ugule a 1.4753 l'ordine verrà eseguito altrimenti no. La cosa sia valida anche nel caso che il prezzo sia inferiore (e quindi un punto di entrata long migliore) per esempio 1.4746. A rigor di logica la posizione non viene aperta anche se si tratta di un punto migliore d'ingresso.

Se l'ordine deve essere eseguito su un grafico differente da quello in cui l'ea è attaccato è possibile utilizzare la funzione MarketInfo() descritta in questo topic:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



I parametri takeprofit e stoploss si commentano da soli. In alcuni broker esistono delle limitazioni anche in questo e non è possibile impostare stop o target troppo stretti. Per saperlo utilizzate la funzione MarketInfo(Symbol(),MODE_STOPLEVEL).

Il parametro comment è una stringa che viene utilizzata per rendere più leggibile l'apertura degli ordini e sapere se un'ordine è stato aperto dall'ea, di solito infatti viene valorizzata con il nome dell'ea.

Magic è un parametro che, come comment, viene utilizzato per identificare l' ea che ha aperto l'ordine ma è molto più importante. Ne capirete l'utilità quando cercherete di applicare più di un'expert advisor sullo stesso conto...come fare per sapere se l'ea deve chiudere un'ordine oppure non deve toccarlo perchè è stato aperto da un altro ea? Il magic id serve proprio come chiave univoca per risolvere eventuali problemi di questo tipo.

Expiration è di tipo datetime ed è utilizzato per sapere fino a quando dovranno rimanere attivi gli ordini pendenti.

L'ultimo parametro arrow_color è opzionale e viene valorizzato con il colore che si vuole utilizzare per disegnare una freccia nel grafico quando viene aperto l'ordine.

La funzione OrderSend() restituisce -1 in caso l'ordine non venga aperto, ecco il perchè del controllo ticket>0.

Per conoscere la causa d'errore basta stampare la stringa restituita dalla funzione GetLastError( ). In caso l'errore non sia abbastanza esplicativo potete ricercare nel metaeditor maggiori dettagli.

Andiamo ad analizzare ora la funzione OrderSelect():

Codice:
bool OrderSelect( int index, int select, int pool=MODE_TRADES)


La funzione OrderSelect() seleziona un ordine che può essere processato in seguito. La funzione restituisce true se l'rdine selezionato è presente, false in caso non lo sia.

Esistono due modi per selezionare un ordine, il primo è quello di ricercarlo per numero di ticket, il secondo di selezionarlo in base al tipo di ordine. Anche in questo caso se si verificano degli errori si può richiamare la funzione GetLastError() per capire cos'è successo.

Andiamo ora a vedere i parametri della funzione, stavolta iniziamo dal secondo:

select può essere valorizzato con SELECT_BY_TICKET oppure SELECT_BY_POS.

Il primo caso è quello che stiamo utilizzando nella scrittura del nostro ea, selezionando per ticket il primo parametro index sarà il numero del ticket che precedentemente ( il valore restituito da OrderSend() ) ci siamo salvati in una variabile. In questo caso Il terzo parametro pool non è necessario.

Per determinare con precisione di che tipo di ordine si tratti si possono utilizzare diverse funzioni quali OrderType( ), OrderCloseTime( ), ecc. il cui funzionamento è abbastanza intuitivo.

Se invece impostiamo il secondo parametro a SELECT_BY_POS il primo parametro index verrà utilizzato per scorrere i vari ordini. Possiamo quindi scorrere tutti gli ordini variando l'indice (1,2,3...) finchè non restituirà false. In questo caso assume molta importanza l'utilizzo della funzione OrderTicket( ) per individuare univocamente l'ordine selezionato con la funzione OrderSelect().

L'ultimo parametro pool può essere valorizzato con MODE_TRADES (valore di default) oppure MODE_HISTORY. MODE_TRADES permette di selezionare gli ordini tra quelli attivi o pendenti, MODE_HISTORY tra quelli chiusi o cancellati.

Fin'ora abbiamo analizzato la porzione di codice relativa all'entrata long, la stessa cosa anche se opposta è valida per l'entrata short, andiamo solo ad analizzare la condizione d'entrata che prima avevamo tralasciato:

Codice:
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
  MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)


Le condizioni sono riassunte da questa frase:

entrata SHORT se il MACD è sopra lo zero, sta scendendo ed incrocia con la linea rossa che va nella direzione opposta.

Avrete notato che nelle condizioni di apertura non si spiega il controllo MacdCurrent>(MACDOpenLevel*Point), questo viene introdotto per fare in modo che non vengano generati troppi falsi segnali:

per escludere cambiamenti insignificanti e quindi ridurre il numero di falsi segnali viene aggiunto un ulteriore controllo: la variazione del MACD dovrà essere di almeno 5 pips.

Il controllo sull'apertura di ordini long e short è terminato ora passiamo alla parte di codice che verifica se è il caso di chiudere gli ordini o modificarli (spostare lo stop).

Per prima cosa vediamo se ci sono già degli ordini aperti:

Codice:
total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)


Se esiste almeno un'ordine aperto entriamo nel ciclo for, il codice qui sotto serve ad individuare univocamente l'ordine utilizzando la funzione OrderSelect() con il parametro SELECT_BY_POS descritto in precedenza:

Codice:
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {


Nel caso sia stata indivuata la posizione long aperta si effettua un controllo sulle condizioni di chiusura dell'ordine:

Codice:
// should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))


Anche nel caso della chiusura viene utilizzato il filtro per i falsi segnali: MacdCurrent>(MACDCloseLevel*Point).

Nel caso la condizione di chiusura sia verificata si procede alla chiusura dell'ordine:

Codice:
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit


Faccio notare l'importanza del return(0) che comporta l'uscita immediata (ignorando il codice successivo) dalla funzione start e una nuova riesecuzione dall'inizio della stessa.

Ecco invece la dichiarazione di OrderClose():

Codice:
bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)


La funzione restituisce true in caso di successo, false in caso contrario, anche in questo caso potete utilizzare GetLastError().

Il parametro ticket è lo stesso descritto in precedenza che viene restituito dalla funzione OrderSend().

lots il numero di lotti che si vogliono chiudere, in tutti(credo) i broker è obbligatorio chiudere lo stesso numero di lotti aperti nella posizione.

price è il valore in cui si intende chiudere, possiamo scegliere se chiuderlo in base al Bid o all'Ask, generlamente viene utilizzato Bid per i long Ask per gli short.

per slippage vale lo stesso discorso fatto per la funzione OrderSend(), color è il colore opzionale che si intende tracciare nel grafico in corrispondenza della chiusura dell'ordine.

Ultimo punto da affrontare è il controllo sullo stop-loss, la strategia di spostare lo stop quando si è in guadagno con la posizione viene chiamata trailing stop:

Codice:
if(TrailingStop>0) 
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }


E' da ricordare il fatto che le funzioni OrderOpenPrice(), OrderStopLoss() si riferiscono all'ordine precedentemente selezionato all'interno del ciclo for.

Codice:
bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)


OrderModify() serve a modificare l'ordine precedentemente aperto o pendente. I parametri sono abbastanza esplicativi:

ticket: chiave univoca per individuare l'ordine.
price: nuovo prezzo di apertura per un'ordine pendente.
stoploss: nuovo stop-loss, di fatto è il parametro che implementa il trailing stop.
takeprofit: nuovo target point.
expiration: nuova data di termine per l'ordine pendente.
arrow_color: colore dello stop o del target nel grafico.

Nel caso non si intendano modifcare dei parametri si ricorre all'utilizzo delle solite funzioni quali OrderOpenPrice(), OrderTakeProfit() ecc...

Gli stessi controlli sulla chiusura dell'ordine e sullo spostamento dello stop vengono effettuati nel caso di una posizione short, ecco il codice completo dell'expert advisor:

Codice:
//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0); 
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1)
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0); 
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         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);
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError());
         return(0);
        }
      return(0);
     }
   // it is important to enter the market correctly,
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0) 
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0) 
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.


L'ultima modifica di carlo10 il Sab Nov 15, 2014 12:38 pm, modificato 3 volte
Profilo Invia messaggio privato Invia e-mail HomePage
Però.........
 MessaggioInviato: Lun Apr 27, 2009 11:16 am Rispondi citando  
Messaggio
  Eric
Aspirante Trader
Aspirante Trader

Registrato: 19/04/09 13:46
Messaggi: 75
Residenza: Pratiglione

Siete la mia rovina......
Questo forum è talmente interessante che non riesco più a fare niente altro...
Io sono un novello...
Volevo chiederLe, l'ha provato questo programma?
Le ha dato dei buoni risultati?
Si può utilizzare anche con altre piattaforme tipo eToro?
una volta scritto, come devo fare per renderlo operativo?
Scusi per le tante domande ma la voglia è tanta ma le competenze sono poche...... Ho letto che usando questi ea poi si è letteralmente buttati fuori del broker....è vero?
Si possono lasciar girare 24h su 24?
Con quale budget si può iniziare su un conto real?
Grazie 10000000000000000000
Eric
Profilo Invia messaggio privato Invia e-mail
 MessaggioInviato: Lun Apr 27, 2009 5:53 pm Rispondi citando  
Messaggio
  Eric
Aspirante Trader
Aspirante Trader

Registrato: 19/04/09 13:46
Messaggi: 75
Residenza: Pratiglione

Ho provato l'ea che hai messo qui e purtroppo sono sempre in perdita.... Sad Sad Sad Sad
a voi che risultato ha dato??
Profilo Invia messaggio privato Invia e-mail
 MessaggioInviato: Lun Apr 27, 2009 7:37 pm Rispondi citando  
Messaggio
  Doctor Who
Professore
Professore

Registrato: 06/02/08 02:57
Messaggi: 1319

Facendo un "giro nel forum" troverai da solo risposta alle tue domande ,comunque....

"Volevo chiederLe, l'ha provato questo programma?
Le ha dato dei buoni risultati?"
Questo programma serve solo a far capire come funzionano gli ea , e' un esempio , se funzionasse , visto che e' presente su tutte le piattaforme metatrader di default , chiunque ha metatrader sarebbe in gain.
"Si può utilizzare anche con altre piattaforme tipo eToro?"
No.
"una volta scritto, come devo fare per renderlo operativo?"
E'tutto scritto nei post segnati come importante all'inizio della sezione.
"Scusi per le tante domande ma la voglia è tanta ma le competenze sono poche...... Ho letto che usando questi ea poi si è letteralmente buttati fuori del broker....è vero?"
Per alcuni broker e per alcuni ea ,SI.
"Si possono lasciar girare 24h su 24?"
Basta lasciare acceso il pc 24/24 o affittare un server(tipo aruba).
"Con quale budget si può iniziare su un conto real?"
Dipende dal broker, ma non sempre la quantita' minima di denaro richiesto e' sufficente per operare.

In sintesi , oviamente.

_________________

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

Profilo Invia messaggio privato
 MessaggioInviato: Dom Mag 03, 2009 2:43 am Rispondi citando  
Messaggio
  Doctor Who
Professore
Professore

Registrato: 06/02/08 02:57
Messaggi: 1319

Codice:

      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {


" OrderSymbol==Symbol " cosa sta' ad indicare , controlla che l'ea attaccato a quel grafico (tipo eurusd) agisca solo sul cross del grafico(eurusd appunto)?!?!

_________________

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

Profilo Invia messaggio privato
 MessaggioInviato: Dom Mag 03, 2009 11:00 am Rispondi citando  
Messaggio
  fx3
Trader part-time
Trader part-time

Registrato: 11/03/09 17:40
Messaggi: 103
Residenza: Bologna

[...]


L'ultima modifica di fx3 il Dom Ago 16, 2009 10:38 am, modificato 1 volta
Profilo Invia messaggio privato Invia e-mail
 MessaggioInviato: Dom Mag 03, 2009 11:07 am Rispondi citando  
Messaggio
  Dainesi
Site Admin
Site Admin

Registrato: 15/07/08 21:02
Messaggi: 3655
Residenza: Castellanza (VA)

fx3 ha scritto:
Doctor Who ha scritto:
Codice:

      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {


" OrderSymbol==Symbol " cosa sta' ad indicare , controlla che l'ea attaccato a quel grafico (tipo eurusd) agisca solo sul cross del grafico(eurusd appunto)?!?!


No. Dopo aver selezionato un ordine con OrderSelect, verifica che il cross dell'ordine selezionato (dato da OrderSymbol()) coincida con il cross del grafico cui è attaccato l'EA (dato da Symbol())


Oltre al controllo suddetto, controllate anche la coincidenza del MagicNumber per evitare di gestire operazioni aperte sullo stesso cross da altri EA !!

_________________
Autore del libri

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

e
Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.




Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

in aula "full immersion" di Trading, Forex e Trading system e MQL (diversi livelli)
Per info visita:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

Profilo Invia messaggio privato Invia e-mail HomePage
 MessaggioInviato: Dom Mag 03, 2009 2:21 pm Rispondi citando  
Messaggio
  Doctor Who
Professore
Professore

Registrato: 06/02/08 02:57
Messaggi: 1319

Grazie ad entrambi.

_________________

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

Profilo Invia messaggio privato
Ordini pendenti
 MessaggioInviato: Mar Lug 28, 2009 8:31 am Rispondi citando  
Messaggio
  francesco.baroni
New Entry
New Entry

Registrato: 28/07/09 08:23
Messaggi: 3

Vorrei porre una questione riguardante gli ordini PENDENTI: quando si crea un ordine pendente come ad esempio un BUY STOP, si utilizza "OrderSend(Symbol(),OP_BUYSTOP,lot,Price,3,StopLoss,TargetProfit)".
Il mio problema è il quarto parametro: il prezzo dello stop. Infatti si può inserire solo un prezzo preciso, ad esempio il valore 1.4123, ma non si può inserire un'istruzione tipo "High[1]" per comprare al raggiungimento del massimo della barra precedente.
Questo rende veramente poco utile l'istruzione. Come posso fare per chiedere al programma di creare un ordine BUY STOP sul massimo della candela precedente?
Profilo Invia messaggio privato
Re: Ordini pendenti
 MessaggioInviato: Mer Lug 29, 2009 10:01 pm Rispondi citando  
Messaggio
  Dainesi
Site Admin
Site Admin

Registrato: 15/07/08 21:02
Messaggi: 3655
Residenza: Castellanza (VA)

francesco.baroni ha scritto:
Vorrei porre una questione riguardante gli ordini PENDENTI: quando si crea un ordine pendente come ad esempio un BUY STOP, si utilizza "OrderSend(Symbol(),OP_BUYSTOP,lot,Price,3,StopLoss,TargetProfit)".
Il mio problema è il quarto parametro: il prezzo dello stop. Infatti si può inserire solo un prezzo preciso, ad esempio il valore 1.4123, ma non si può inserire un'istruzione tipo "High[1]" per comprare al raggiungimento del massimo della barra precedente.
Questo rende veramente poco utile l'istruzione. Come posso fare per chiedere al programma di creare un ordine BUY STOP sul massimo della candela precedente?


Perché dici che non è possibile ? Naturalmente il prezzo di ingresso deve essere, nel caso di un long, superiore al corso e almeno rispettare gli stop minimi richiesti.

_________________
Autore del libri

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

e
Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.




Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

in aula "full immersion" di Trading, Forex e Trading system e MQL (diversi livelli)
Per info visita:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

Profilo Invia messaggio privato Invia e-mail HomePage
 MessaggioInviato: Mar Ago 04, 2009 11:49 am Rispondi citando  
Messaggio
  francesco.baroni
New Entry
New Entry

Registrato: 28/07/09 08:23
Messaggi: 3

Se si mette un ordine tipo OrderSend(Symbol(),OP_BUYSTOP,lot,High[1],3,StopLoss,TargetProfit)
quest'ordine viene compilato perchè la sintassi è corretta, ma non viene eseguito perchè non riconosce High[1] come un double qualsiasi bensì come il valore preso da un vettore, e per questo motivo non lo legge all'interno di questa istruizione, anche se non so perchè.
p.s. Ovviamente il valore High[1] che ho testato era superiore di molto al prezzo quotato, gli Stop e i TargetProfit erano corretti. Tant'è che mettendo al posto di High[1] lo stesso valore scritto in numero tipo "1.4215" l'ordine partiva.
Profilo Invia messaggio privato
 MessaggioInviato: Mar Ago 04, 2009 1:27 pm Rispondi citando  
Messaggio
  Doctor Who
Professore
Professore

Registrato: 06/02/08 02:57
Messaggi: 1319

Da come scrivi suppongo tu abbia gia trovato la soluzione , what's vettori Shocked
Se cosi non fosse , da appasionato di mql , io proverei ad assegnare ad una variabile i valore di Hight[1] nella riga di codice appena sopra l'ordine(magari anche ad aggiustarne il valore nel caso sia troppo vicino al prezzo in base alle condizioni imposte dal broker) ed a mettere la variabile al posto di Hight [1].
Potrebbe anche funzionare , e cosi' facendo si puo utilizzare un valore x da aggiungere ad HigHt 1 (anche zero volendo) per poter avere un paramentro in piu' da ottimizzare , in caso di baktest.

_________________

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.

Profilo Invia messaggio privato
 MessaggioInviato: Mar Ago 04, 2009 11:55 pm Rispondi citando  
Messaggio
  francesco.baroni
New Entry
New Entry

Registrato: 28/07/09 08:23
Messaggi: 3

Anch'io all'inzio ho provato assegnando ad una variabile il valore di High[1] nella speranza che venisse trasformato in un numero reale qualunque, e non in un valore preso da un vettore. Però incredibilmente ho visto che neanche questo funzionava.
Allora recentemente ho trovato la seguente soluzione, un pò artigianale devo dire: ho applicato al valore di High[1] una funzione matematica tipo Math.Log, e poi la sua funzione inversa: Math.Exp.
Esempio: X=MathLog(MathExp(H[1]); Applicando prima una funzione e poi la sua inversa il valore del numero reale non è cambiato, ma il computer l'ha trasformato in un "double" qualsiasi, e non un double preso da un array. In questo modo inserendo X come prezzo stop nell'istruzione Ordersend, l'ordine partiva.
Mi rendo conto che forse è una soluzione un pò complicata e che magari ce ne poteva essere una migliore, ma questa cmq funziona.
Profilo Invia messaggio privato
 MessaggioInviato: Gio Set 10, 2009 8:29 pm Rispondi citando  
Messaggio
  iopoipoi
New Entry
New Entry

Registrato: 24/03/09 17:56
Messaggi: 3

Ciao a tutti,

mi sto avvicinando alla compilazione e trovo questo post davvero molto utile.

volevo porvi una domanda,
se io volessi creare un ea identico a questo ma che lavora con un altro indicatore che ragiona solo se sopra o sotto lo 0 ad esempio per il long e il short?
dovrei solo sostituire il nome e i parametri?

vi ringrazio davvero per l'aiuto e complimenti ancora

ciao,
iopoipoi
Profilo Invia messaggio privato
aiuto ea
 MessaggioInviato: Mer Set 23, 2009 8:10 am Rispondi citando  
Messaggio
  frigene75
New Entry
New Entry

Registrato: 16/09/09 15:11
Messaggi: 1

Ciao a tutti chi mi aiuta a fare questo EA?
Il mio intento e aprire due posizioni contemporaneament uno in bay l'altro in sell all'inizio di una candela TF30 e chiudere le posizioni a tp+8 sl-6

Vi ringrazio in anticipo per l'aiuto
Profilo Invia messaggio privato
Nuovo argomento   Rispondi    Indice del forum » Metatrader - Expert Advisor - MQL

Pagina 1 di 3
Tutti i fusi orari sono GMT + 2 ore
Vai a 1, 2, 3  Successivo

Mostra prima i messaggi di:

  

Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi
c d
e

CI SIAMO TRASFERITI QUI: http://forum.forexup.biz





Powered by phpBB © 2001, 2002 phpBB Group phpbb.it
Macinscott 2 by Scott Stubblefield


Abuse - Segnalazione abuso - Utilizzando questo sito si accettano le norme di TOS & Privacy.
Powered by forumup.it forum gratis free, crea il tuo forum gratis free ora! Created by Hyarbor & Qooqoa
Confirmed

Page generation time: 0.255