English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
La regola d'oro dei trader

La regola d'oro dei trader

MetaTrader 4Sistemi di trading | 12 gennaio 2022, 12:59
325 0
Genkov
Genkov

Introduzione

Il compito principale di un trader non è solo quello di trovare il momento giusto per entrare nel mercato. È anche necessario trovare il momento giusto per uscirne. La regola d'oro del trading dice: "Riduci sempre le tue perdite e lascia correre i tuoi profitti".

Per realizzare profitti basati su un'elevata aspettativa matematica, dobbiamo comprendere tre principi di base del buon trading.

  1. Conoscere il rischio quando si entra nel mercato (che è un valore iniziale di Stop Loss);
  2. Interrompi i tuoi profitti e consenti ai tuoi profitti di correre (non chiudere la tua posizione prima che sia richiesta dal tuo sistema);
  3. Impara le aspettative matematiche del tuo sistema: testalo e regolalo regolarmente.


Metodo passo-passo per seguire le posizioni che consente ai profitti di correre

Molti pensano che sia impossibile realizzare profitti, poiché non sappiamo dove andrà il mercato. Ma abbiamo davvero bisogno di saperlo per fare trading con successo? Il trading di successo si basa principalmente su un sistema opportunamente progettato che sia in grado di capire i momenti adatti per entrare nel mercato. Tali considerazioni sono fatte utilizzando il potere dell'aspettativa e le regole delle posizioni step-by-step trailing che consentono al profitto di correre per il più alto livello possibile.

Il momento di ingresso nel mercato può essere trovato in molti modi, ad esempio, utilizzando modelli di candele giapponesi, modelli di onde, ecc. Allo stesso tempo, il fattore di profitto deve essere considerato (rapporto profitto / perdita).

Questo metodo si basa sul seguente requisito: un trader seleziona il valore Stop Loss più basso possibile quando apre una posizione. Tale valore può essere determinato utilizzando vari metodi, per ad esempio, potrebbe essere pari all'1,5% del deposito. Quando il mercato raggiunge un profitto pari al valore dello Stop Loss, la metà del lotto viene chiusa ma lo Stop Loss non viene modificato!

Pertanto, creiamo una sorta di rete di sicurezza, nel caso in cui il mercato vada nella direzione opposta. Cioè, riduciamo il nostro rischio fissando le perdite minime. Se il mercato si muovesse in direzione favorevole solo per girare qualche tempo dopo, viene attivato lo Stop Loss (Fig. 1-3).


Fig. 1. Aprire una posizione


Fig. 2. Impostazione stop loss

se il mercato è tornato indietro:


Fig. 3. Se il mercato è tornato indietro, sei a livello di pareggio

Codice del programma Position Trailing

Offriamo un codice di programma che traccia le posizioni aperte e attualizza il secondo principio d'oro, in quanto consente al profitto di correre per il più alto livello possibile.

Se il mercato si muove ancora in direzione favorevole e raggiunge un valore predeterminato, ad esempio 100 pip, lo Stop Loss viene ripristinato a un livello di pareggio. Ulteriori reset vengono effettuati quando si raggiunge il profitto in intervalli predeterminati, ad esempio 50 pip. Possiamo spostare stop loss ad ogni barra successiva, ma ai broker non piacciono i ripristini frequenti, specialmente quando il trade viene eseguito nei timeframe più bassi. Il file di errore (stdlib.mq4) dalla cartella delle librerie ha anche l'errore # 8 error = "richieste troppo frequenti" esattamente per quel caso.

Il metodo per determinare ogni successivo livello di Stop Loss è selezionato da una posizione di prezzo al momento di ottenere un profitto a seconda dei livelli di Fibonacci. I livelli di Fibonacci applicati sono costruiti secondo il metodo del Vegas Tunnel qui.

Il calcolo dei livelli di Fibonacci viene eseguito dalla funzione di generazione dei livelli LevelFibo():

//+------------------------------------------------------------------+
   void LevelFibo()
   {
   double Fb1,Fb2,Fb3,Fb4,Fb5,Fb6,Fb7,Fb8,Fb9,Fb10,Fb11,Fb12,Fb13;
   // "Vegas" channel
   double Ma144_1 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
   double Ma169_1 = iMA(NULL,0,169,0,MODE_EMA,PRICE_CLOSE,1);
   // "Vegas" channel median
   double MedVegas=NormalizeDouble((Ma144_1+Ma169_1)/2,Digits); 
   // calculate Fibo levels values using "Vegas" method
   Fb1=MedVegas-377*Point;     Fb12=MedVegas+377*Point;
   Fb2=MedVegas-233*Point;     Fb11=MedVegas+233*Point;
   Fb3=MedVegas-144*Point;     Fb10=MedVegas+144*Point;
   Fb4=MedVegas-89*Point;      Fb9=MedVegas+89*Point;
   Fb5=MedVegas-55*Point;      Fb8=MedVegas+55*Point;
   Fb6=MedVegas-34*Point;      Fb7=MedVegas+34*Point;
   }
//+------------------------------------------------------------------+

Quando si calcola lo Stop Loss per le posizioni BUY, il profitto è la differenza tra il prezzo massimo della prima barra High[1] e il livello di apertura della posizione OrderOpenPrice(). Il livello di Stop Loss è definito come il livello di Fibonacci "più vicino" rispetto al valore Min della prima barra Low[1] (Fig. 4).


Fig. 4. Calcolo Stop Loss per posizione BUY

Quando si calcola lo Stop Loss per le posizioni SELL, il profitto è la differenza tra il livello di apertura della posizione OrderOpenPrice() e il prezzo massimo della prima barra High[1] (Fig. 5).


Fig. 5. Calcolo Stop Loss per la posizione SELL

Per le posizioni Buy, i valori di Stop Loss si basano sui livelli di Fibo. A seconda del valore più basso della prima candela viene presentato come una funzione separata.

Il codice funzione è mostrato di seguito:

//+---------------------------------------------------------------------+
//| Function (table) for specifying Stop Loss values for BUY position   |
//| by Fibo levels according to the lowest value of the first candle    |
//+---------------------------------------------------------------------+
 void StopLevelFiboBuy()
   {
   if(Low[1]>Fb12)                                newSL_B=Fb12-100*Point;
   if(Low[1]<=Fb12 && Low[1]>(Fb12+Fb11)/2)       newSL_B=(Fb12+Fb11)/2;
   if(Low[1]<=(Fb12+Fb11)/2 && Low[1]>Fb11)       newSL_B=Fb11;
   if(Low[1]<=Fb11 && Low[1]>(Fb11+Fb10)/2)       newSL_B=(Fb11+Fb10)/2;
   if(Low[1]<=(Fb10+Fb11)/2 && Low[1]>Fb10)       newSL_B=Fb10;
   if(Low[1]<=Fb10 && Low[1]>(Fb10+Fb9)/2)        newSL_B=Fb9;
   if(Low[1]<=(Fb10+Fb9)/2 && Low[1]>Fb9)         newSL_B=Fb8;
   if(Low[1]<=Fb9  && Low[1]>Fb8)                 newSL_B=Fb7;
   if(Low[1]<=Fb8  && Low[1]>Fb7)                 newSL_B=(Fb7+MedVegas)/2;
   if(Low[1]<=Fb7  && Low[1]>MedVegas)            newSL_B=Fb6;
   if(Low[1]<=MedVegas && Low[1]>(MedVegas+Fb6)/2)newSL_B=Fb6;
   if(Low[1]<=(MedVegas+Fb6)/2 && Low[1]>Fb6)     newSL_B=Fb5;
   if(Low[1]<=Fb6  && Low[1]>Fb5)                 newSL_B=Fb4;
   if(Low[1]<=Fb5  && Low[1]>Fb4)                 newSL_B=(Fb3+Fb4)/2;
   if(Low[1]<=Fb4  && Low[1]>Fb3)                 newSL_B=Fb3;
   if(Low[1]<=Fb3  && Low[1]>(Fb3+Fb2)/2)         newSL_B=(Fb3+Fb2)/2;
   if(Low[1]<=(Fb3+Fb2)/2  && Low[1]>Fb2)         newSL_B=Fb2;
   if(Low[1]<=Fb2  && Low[1]>(Fb2+Fb1)/2)         newSL_B=(Fb1+Fb2)/2;
   if(Low[1]<=(Fb2+Fb1)/2 && Low[1]>Fb1)          newSL_B=Fb1;
   if(Low[1]<=Fb1)                                newSL_B=Fb1-100*Point;
   }
//+------------------------------------------------------------------+

La tabella dei valori di Stop Loss per livelli di Fibo in base al valore massimo della prima candela della funzione StopLevelFiboSell() per le posizioni di vendita è rappresentata dal seguente codice:

//+----------------------------------------------------------------------+
//| Function (table) for specifying Stop Loss values for SELL position   |
//| by Fibo levels according to the highest value of the first candle    |
//+----------------------------------------------------------------------+
 void StopLevelFiboSell()
   {
   if(High[1]<=Fb12 && High[1]>(Fb12+Fb11)/2)        newSL_S=Fb12+100*Point;
   if(High[1]<=Fb12 && High[1]>Fb11)                 newSL_S=Fb12;
   if(High[1]<=Fb11 && High[1]>Fb11+Fb10)            newSL_S=Fb11;
   if(High[1]<=Fb10 && High[1]>(Fb10+Fb9)/2)         newSL_S=(Fb11+Fb10)/2;
   if(High[1]<=Fb9  && High[1]>Fb8)                  newSL_S=(Fb10+Fb9)/2;
   if(High[1]<=Fb8  && High[1]>Fb7)                  newSL_S=Fb9;
   if(High[1]<=Fb7  && High[1]>MedVegas)             newSL_S=Fb8;
   if(High[1]<=MedVegas && High[1]>MedVegas)         newSL_S=Fb7;
   if(High[1]<=(MedVegas+Fb6)/2 && High[1]>Fb6)      newSL_S=MedVegas;
   if(High[1]<=Fb6  && High[1]>Fb5)                  newSL_S=MedVegas;
   if(High[1]<=Fb5  && High[1]>Fb4)                  newSL_S=Fb6;
   if(High[1]<=Fb4  && High[1]>Fb3)                  newSL_S=Fb5;
   if(High[1]<=Fb3  && High[1]>Fb2)                  newSL_S=Fb4;
   if(High[1]<=Fb2  && High[1]>(Fb2+Fb1)/2)          newSL_S=(Fb2+Fb3)/2;
   if(High[1]<(Fb2+Fb1)/2   && High[1]>Fb1)          newSL_S=Fb2;
   if(High[1]<Fb1)                                   newSL_S=(Fb2+Fb1)/2;
   }
//+------------------------------------------------------------------+

Sarebbe opportuno aggiungere la funzione di calcolo dei livelli di Fibonacci levelFibo a ciascuna delle due funzioni di dipendenza menzionate. Questo è stato fatto nei file demo allegati.

Ora, per quanto riguarda la combinazione di due funzioni o meglio abilitare la funzione di calcolo dei livelli LevelFibo() nella funzione di identificazione dei livelli di Stop Loss focalizzati su questi livelli. Questa combinazione ha senso, poiché le funzioni lavorano insieme. Pertanto, il numero di chiamate di funzioni durante il trailing sarà ridotto - ne rimarrà solo una invece di due.

Dopo la combinazione, appariranno come segue:

//+----------------------------------------------------------------------+
//| Function (table) for specifying Stop Loss values for BUY position    |
//| by Fibo levels according to the lowest value of the first candle     |
//+----------------------------------------------------------------------+
   void StoplevelFiboBuy()
   {
   double Fb1,Fb2,Fb3,Fb4,Fb5,Fb6,Fb7,Fb8,Fb9,Fb10,Fb11,Fb12,Fb13;
   double Ma144_1 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
   double Ma169_1 = iMA(NULL,0,169,0,MODE_EMA,PRICE_CLOSE,1);
   double MedVegas=NormalizeDouble((Ma144_1+Ma169_1)/2,Digits); 
   Fb1=MedVegas-377*Point;     Fb12=MedVegas+377*Point;
   Fb2=MedVegas-233*Point;     Fb11=MedVegas+233*Point;
   Fb3=MedVegas-144*Point;     Fb10=MedVegas+144*Point;
   Fb4=MedVegas-89*Point;      Fb9=MedVegas+89*Point;
   Fb5=MedVegas-55*Point;      Fb8=MedVegas+55*Point;
   Fb6=MedVegas-34*Point;      Fb7=MedVegas+34*Point;
   if(Low[1]>Fb12)                                newSL_B=Fb12-100*Point;
   if(Low[1]<=Fb12 && Low[1]>(Fb12+Fb11)/2)       newSL_B=(Fb12+Fb11)/2;
   if(Low[1]<=(Fb12+Fb11)/2 && Low[1]>Fb11)       newSL_B=Fb11;
   if(Low[1]<=Fb11 && Low[1]>(Fb11+Fb10)/2)       newSL_B=(Fb11+Fb10)/2;
   if(Low[1]<=(Fb10+Fb11)/2 && Low[1]>Fb10)       newSL_B=Fb10;
   if(Low[1]<=Fb10 && Low[1]>(Fb10+Fb9)/2)        newSL_B=Fb9;
   if(Low[1]<=(Fb10+Fb9)/2 && Low[1]>Fb9)         newSL_B=Fb8;
   if(Low[1]<=Fb9  && Low[1]>Fb8)                 newSL_B=Fb7;
   if(Low[1]<=Fb8  && Low[1]>Fb7)                 newSL_B=(Fb7+MedVegas)/2;
   if(Low[1]<=Fb7  && Low[1]>MedVegas)            newSL_B=Fb6;
   if(Low[1]<=MedVegas && Low[1]>(MedVegas+Fb6)/2)newSL_B=Fb6;
   if(Low[1]<=(MedVegas+Fb6)/2 && Low[1]>Fb6)     newSL_B=Fb5;
   if(Low[1]<=Fb6  && Low[1]>Fb5)                 newSL_B=Fb4;
   if(Low[1]<=Fb5  && Low[1]>Fb4)                 newSL_B=(Fb3+Fb4)/2;
   if(Low[1]<=Fb4  && Low[1]>Fb3)                 newSL_B=Fb3;
   if(Low[1]<=Fb3  && Low[1]>(Fb3+Fb2)/2)         newSL_B=(Fb3+Fb2)/2;
   if(Low[1]<=(Fb3+Fb2)/2  && Low[1]>Fb2)         newSL_B=Fb2;
   if(Low[1]<=Fb2  && Low[1]>(Fb2+Fb1)/2)         newSL_B=(Fb1+Fb2)/2;
   if(Low[1]<=(Fb2+Fb1)/2 && Low[1]>Fb1)          newSL_B=Fb1;
   if(Low[1]<=Fb1)                                newSL_B=Fb1-100*Point;
   }
// ----------------------------------------------------------------------+

Il codice di comando principale delle posizioni trailing è rappresentato come un frammento di Expert Advisor con la sequenza di azioni per l'esecuzione delle funzioni sopra menzionate in base al prezzo valori delle barre correnti. Il trailing passo-passo inizia dopo che è stato selezionato un ordine aperto appropriato.

Di seguito è riportato un piccolo frammento di codice finale:

//+------------------------------------------------------------------+
//| TRAILING OPEN POSITIONS                                          |
//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {Print("Order selection error = ",GetLastError());}
   if(OrderSymbol()==Symbol())
     {
      if(OrderType()==OP_BUY)
        {
         if(OrderMagicNumber()==Magic)
           {
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=SL_B*Point && OrderLots()==0.2)Close_B_lot();
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())/Point>=100 && OrderLots()==0.1 && OrderStopLoss()<OrderOpenPrice())
              {
               Print(" 1 - StopLoss shift");
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+2*Point,OrderTakeProfit(),0,Aqua))
                 {
                  Print(" at Modif.ord.# ",OrderTicket()," Error # ",GetLastError());
                 }
               return;
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=120*Point && OrderOpenPrice()>Ma144_1-144*Point)
              {
               StoplevelFiboBuy();
               newSL_B=newSL_B+21*Point;
               if((Bid-newSL_B)/Point<StopLevel)newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print("2nd shift of StopLoss ");
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=200*Point && (High[1]-OrderOpenPrice())<=250*Point)
              {
               StoplevelFiboBuy();
               if((Bid-newSL_B)/Point<StopLevel)newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print(" 3rd shift by level order # ",OrderTicket());
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=250*Point && OrderOpenPrice()>Ma144_1-144*Point)
              {
               StoplevelFiboBuy();
               newSL_B=newSL_B+10*Point;
               if((Bid-newSL_B)/Point<StopLevel) newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print(" 4th shift by level order # ",OrderTicket());
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=300*Point && (High[1]-OrderOpenPrice())<=350*Point)
              {
               StoplevelFiboBuy();
               newSL_B=newSL_B+20*Point;
               if((Bid-newSL_B)/Point<StopLevel) newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print(" 5th shift by level order # ",OrderTicket());
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            ...
           }
        }
     }
  }

La sequenza di trailing passo-passo consiste in 8 passaggi nella versione allegata della demo Expert Advisor.

Di seguito è riportato lo screenshot che mostra le fasi di funzionamento della demo Expert Advisor for Buy position trailing. La posizione è stata aperta a causa del fatto che il modello di "assorbimento di tre candele" è stato formato. Inoltre, il "martello invertito" è tra le candele assorbite. Questo fatto rafforza la forza del segnale per aprire una posizione di acquisto.


Fig. 6. Esempio di Buy position trailing

L'indicatore "Vegas" dovrebbe essere usato per vedere le linee Fibo come su uno screenshot leggero. Può essere visto sul sito web mqL4: https://www.mql5.com/it/code/7148

Lo stesso piccolo screenshot allungato dalla schermata "scura":

Fig. 7. Screenshot dallo schermo del monitor (versione demo per Acquista)

Fig. 8. Esempio di posizione di vendita finale

I parametri di test temporanei devono essere installati per visualizzare il lavoro degli Expert Advisor demo, come mostrato in Fig. 9-10 di seguito:


Fig. 9. parametri di test di Demo_trail_Buy.mql Expert Advisor


Fig. 10. parametri di test di Demo_trail_Sell.mql Expert Advisor

Nota: I file con demo Expert Advisors sono allegati all'articolo, come mini-robot per le posizioni di acquisto e vendita trailing. Le posizioni sono aperte in un doppio lotto qui. Ma quando lo Stop Loss viene spostato a un livello di pareggio, c'è fiducia nel futuro movimento dei prezzi nella giusta direzione ed è possibile aggiungere un'altra posizione.


Conclusione

Gli esempi presentati di ordini trailing mostrano che il metodo di spostamento degli ordini Stop Loss focalizzato sui livelli dinamici di Fibo può produrre risultati positivi. Il metodo descritto può essere raccomandato per l'uso pratico nel trading.

Livelli dinamici di Fibo che identificano le funzioni:

  • LevelFiboKgd.mq4
  • StopLevelFiboBuy.mq4
  • StopLevelFiboSell.mq4
  • File demo:
  • Demo_trail_Buy_v1.mq4 – Demo file for Buy
  • Demo_trail_Sell_v1.mq4 - Demo file for Sell


Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/1349

Sui metodi di analisi tecnica e previsione di mercato Sui metodi di analisi tecnica e previsione di mercato
L'articolo dimostra le capacità e il potenziale di un noto metodo matematico abbinato al pensiero visivo e a una prospettiva di mercato "fuori dagli schemi". Da un lato, esso è scritto per attirare l'attenzione di un vasto pubblico, per convincere le menti creative a riconsiderare il paradigma di trading in quanto tale. E dall'altro, può dare origine a sviluppi alternativi e implementazioni di codice di programma per una vasta gamma di strumenti per l'analisi e la previsione.
Tecnica di test (ottimizzazione) e alcuni criteri per la selezione dei parametri dell'Expert Advisor Tecnica di test (ottimizzazione) e alcuni criteri per la selezione dei parametri dell'Expert Advisor
Non ci sono problemi a trovare il Santo Graal dei test, è tuttavia molto più difficile liberarsene. Questo articolo affronta la selezione dei parametri operativi di Expert Advisor con l'elaborazione di gruppo automatizzata dei risultati di ottimizzazione e test al massimo utilizzo delle capacità di prestazione del terminale e carico minimo dell'utente finale.
Manuale MQL5: Ordini ОСО Manuale MQL5: Ordini ОСО
L'attività di trading di qualsiasi trader comporta vari meccanismi e interrelazioni, comprese le relazioni tra gli ordini. Questo articolo suggerisce una soluzione per l'elaborazione degli ordini OCO. Le classi di libreria standard sono ampiamente coinvolte, e vengono creati nuovi tipi di dati.
MQL5 Cookbook: Implementazione di un array associativo o di un dizionario per l'accesso rapido ai dati MQL5 Cookbook: Implementazione di un array associativo o di un dizionario per l'accesso rapido ai dati
Questo articolo descrive uno speciale algoritmo che consente di accedere agli elementi tramite le loro chiavi univoche. Qualsiasi tipo di dati di base può essere utilizzato come chiave. Ad esempio può essere rappresentato come una stringa o una variabile intera. Tale contenitore di dati è comunemente indicato come dizionario o array associativo. Fornisce un modo più semplice ed efficiente di risolvere i problemi.