Autoapprendimento del linguaggio MQL5 da zero - pagina 14

 
MrBrooklin:

In futuro, secondo il piano di auto-apprendimento, il compito è quello di modificare lo script passo dopo passo, cioè:

  1. aggiungere Stop Loss e Take Profit;
  2. aggiungere il trailing;
  3. aggiungere il massimo rischio;
  4. ampliare la gamma degli ordini pendenti.
Sinceramente, Vladimir.
Certo, è un peccato che tu non abbia seguito i consigli del tutorial. Imparerai a mettere linee, ordini, ecc., ma non sarai comunque in grado di scrivere una strategia, perché non hai una base teorica. Tutte queste linee e script non vi aiuteranno a capire le cose di base della programmazione, e non potete andare lontano senza. Ho passato i primi 4 mesi solo ad imparare, senza nemmeno provare a scrivere qualcosa. Certo, avrei potuto sfacciatamente, come hai fatto tu, ma la qualità di tale conoscenza è bassa - ci sono molte lacune nelle basi, che dovranno essere colmate in futuro...
 
Реter Konow:
Naturalmente, non avresti dovuto seguire il consiglio del tutorial. Puoi avere la conoscenza di come impostare le linee, gli ordini, ecc., ma non sarai comunque in grado di sviluppare la strategia, perché non hai la base teorica. Tutte queste linee e script non vi aiuteranno a capire le cose di base della programmazione, e non potete andare lontano senza. Ho passato i primi 4 mesi solo ad imparare, senza nemmeno provare a scrivere qualcosa. Certo, avrei potuto sfacciatamente, come te, ma la qualità di tale conoscenza è scarsa. Ci sono sempre delle lacune nelle basi, che dovranno essere colmate in futuro...

Ciao, Peter! Studio il libro di testo quando è necessario, cioè quando vedo una lacuna nella mia conoscenza. Ora, sento che dovrò fare una piccola pausa e studiare più attentamente il libro di testo. Tutte le raccomandazioni dei partecipanti al forum sono prese in considerazione e sto cercando di attenervisi. E ora sono stupito di essere riuscito a scrivere qualcosa usando solo MQL5 Reference book per così poco tempo.

Saluti, Vladimir.

 
MrBrooklin:

Buona sera a tutti e buon umore!

Sto incollando un nuovo script New6.mq5 che ti aiuta a piazzare un ordine pendente SellStop e uno BuyStop con un lotto fisso a una certa distanza dal prezzo corrente sul grafico corrente. In questo script, ho cercato di descrivere tutto come ho promesso prima, in forma chiara e comprensibile per un programmatore di primo grado.

Ho usato le informazioni prese da MQL5 Reference solo quando ho scritto lo script!

Cordiali saluti, Vladimir.

Questo è un buon esempio. Suggerisco di usarlo come punto di partenza. Nozioni di base.

MrBrooklin:

In futuro, secondo il piano di auto-apprendimento, il compito è quello di modificare lo script passo dopo passo, cioè

  1. aggiungere Stop Loss e Take Profit;
  2. aggiungere il trailing;
  3. aggiungere il massimo rischio;
  4. espandere la scelta degli ordini in sospeso.
Sinceramente, Vladimir.

No, no. Non collegare ancora la nuova funzionalità. Ora migliorate la logica esistente. Allo stesso tempo, sbarazzatevi dei problemi nell'implementazione dello script (si stanno già mostrando). Se volete sapere cosa riscrivere, ve lo dico io.

 
Vasiliy Sokolov:

L'esempio è buono. Suggerisco di usarlo come punto di partenza. Linea di base.

No, no. Non inserire ancora nessuna nuova funzionalità. Ora migliorate la logica esistente. Allo stesso tempo sbarazzarsi dei problemi nell'implementazione degli script (si stanno già mostrando). Cosa devi riscrivere esattamente, se ti interessa, te lo dirò.

Ciao Vasily! Naturalmente, ditemi cosa dovete riscrivere, sarebbe interessante per me!

Saluti, Vladimir.

 
MrBrooklin:

Ciao Vasily! Naturalmente dimmi cosa devi riscrivere, sono molto interessato!

Sinceramente, Vladimir.

I programmatori hanno due problemi: errori prodotti dal compilatore e problemi di architettura. Mentre sei un principiante, ti concentri a combattere con il compilatore mentre il tuo obiettivo finale è un programma che funzioni correttamente. Tuttavia, molto rapidamente un programma per principianti si trasforma nel cosiddetto codice spaghetti, che l'autore stesso non riesce a capire abbastanza presto. Ecco perché vi suggerisco di concentrarvi non sul compilatore e sulla correttezza dello script finale, ma sulle questioni architettoniche. È come imparare a suonare il pianoforte: prima si impara a tenere le dita correttamente e a sedersi allo strumento in modo adeguato, nessuno pretende di suonare Bach da un principiante.

//+------------------------------------------------------------------+
//|                                                         New6.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

Avete due gruppi di parametri che determinano il comportamento del vostro script: il primo è impostato staticamente, come una macro. Il secondo è impostato dall'utente quando carica lo script sul grafico. Ora l'utente non sarà in grado di selezionare il tipo di ordine da effettuare senza ricompilare questo script. Questo non va bene. Pertanto, sarebbe meglio abbandonare queste macro in favore del parametro aggiuntivo:

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

Di conseguenza, abbiamo definito una nuova enumerazione, che abbiamo implementato come parametro di selezione per l'utente.

 
Vasiliy Sokolov:

I programmatori hanno due problemi: errori del compilatore e problemi di architettura. Mentre sei un principiante, ti concentri sul combattere il compilatore, e il tuo obiettivo finale è un programma che funzioni correttamente. Tuttavia, molto rapidamente un programma per principianti si trasforma nel cosiddetto codice spaghetti, che l'autore stesso non riesce a capire abbastanza presto. Ecco perché vi suggerisco di concentrarvi non sul compilatore e sulla correttezza dello script finale, ma sulle questioni architettoniche. È come imparare a suonare il pianoforte: prima si impara a tenere le dita correttamente e a sedersi allo strumento in modo adeguato, nessuno pretende di suonare Bach da un principiante.

Avete due gruppi di parametri che determinano il comportamento del vostro script: il primo è impostato staticamente, come una macro. Il secondo è impostato dall'utente quando carica lo script sul grafico. Ora l'utente non sarà in grado di selezionare il tipo di ordine da effettuare senza ricompilare questo script. Questo non va bene. Pertanto, sarebbe meglio abbandonare queste macro in favore del parametro aggiuntivo:

Di conseguenza, abbiamo definito una nuova enumerazione, che abbiamo implementato come parametro di selezione per l'utente.

Ottimo, infatti mi hai suggerito ciò che è scritto nel passo 4 della modifica passo-passo dello script, cioè espandere la selezione degli ordini pendenti.

Grazie!

Saluti, Vladimir.

 

Il prossimo problema del tuo codice è che si espande in un lungo foglio procedurale. Tutti i principianti scrivono così. E questo è un problema che rimane con loro per anni. Imparate a spezzare il vostro algoritmo in parti, partendo dalle basi come questo script. Ci sono due modi per farlo: attraverso funzioni e classi. Il concetto di classi è troppo difficile da afferrare all'inizio, quindi vi suggerisco di concentrarvi sul lavoro con le funzioni. Pensate all'importanza delle funzioni:

  • Tutto il codice scritto in MQL (e questo sono tutti gli script, gli indicatori e gli Expert Advisors in CodeBase per esempio) è all'interno di funzioni di sistema o di funzioni utente.
  • Qualsiasi codice MQL chiama decine di funzioni MQL integrate. Tutta l'interazione con MetaTrader e il suo ambiente di trading si svolge attraverso la chiamata di questa o quella funzione di sistema.
  • Qualsiasi funzione che non dipende da parametri esterni restituisce sempre lo stesso risultato. Una tale funzione può essere semplicemente copiata da uno script/indicatore/consigliere ad un altro e funzionerà correttamente. Copiare un pezzo arbitrario di codice procedurale, d'altra parte, è improbabile che funzioni.
  • Potete scrivere qualsiasi funzione personalizzata che faccia un lavoro utile. E così facendo, espanderà la funzionalità standard di MQL nel modo in cui avete bisogno. Per esempio, si pensa: "Come sarebbe bello se MQL avesse questa funzione....". - Ma perché non scriverlo da soli?
 
Vasiliy Sokolov:

Il prossimo problema del tuo codice è che si espande in un lungo foglio procedurale. Tutti i principianti scrivono così. E questo è un problema che rimane con loro per anni. Imparate a spezzare il vostro algoritmo in parti, partendo dalle basi come questo script. Ci sono due modi per farlo: attraverso funzioni e classi. Il concetto di classi è troppo difficile da afferrare all'inizio, quindi vi suggerisco di concentrarvi sul lavoro con le funzioni. Pensate all'importanza delle funzioni:

  • Tutto il codice scritto in MQL (e questo sono tutti gli script, gli indicatori e gli Expert Advisors in CodeBase per esempio) è all'interno di funzioni di sistema o di funzioni utente.
  • Qualsiasi codice MQL chiama decine di funzioni MQL integrate. Tutte le interazioni con MetaTrader e il suo ambiente di trading sono effettuate attraverso la chiamata di una funzione di sistema.
  • Qualsiasi funzione che non dipende da parametri esterni restituisce sempre lo stesso risultato. Una tale funzione può essere semplicemente copiata da uno script/indicatore/consigliere ad un altro e funzionerà correttamente. Copiare un pezzo arbitrario di codice procedurale, d'altra parte, è improbabile che funzioni.
  • Potete scrivere qualsiasi funzione personalizzata che faccia un lavoro utile. E così facendo, espanderà la funzionalità standard di MQL nel modo in cui avete bisogno. Per esempio, si pensa: "Come sarebbe bello se MQL avesse questa funzione....". - Ma perché non scriverlo da soli?

Grazie, Vasily per un consiglio così completo. Ne terrò certamente conto e cercherò di fare del mio meglio.

Saluti, Vladimir.

 
Vasiliy Sokolov:

Il prossimo problema del tuo codice è che si espande in un lungo foglio procedurale. Tutti i principianti scrivono così. E questo è un problema che rimane con loro per anni. Imparate a spezzare il vostro algoritmo in parti, partendo dalle basi come questo script. Ci sono due modi per farlo: attraverso funzioni e classi. Il concetto di classi è troppo difficile da afferrare all'inizio, quindi vi suggerisco di concentrarvi sul lavoro con le funzioni. Pensate all'importanza delle funzioni:

  • Tutto il codice scritto in MQL (e questo sono tutti gli script, gli indicatori e gli Expert Advisors in CodeBase per esempio) è all'interno di funzioni di sistema o di funzioni utente.
  • Qualsiasi codice MQL chiama decine di funzioni MQL integrate. Tutte le interazioni con MetaTrader e il suo ambiente di trading sono effettuate attraverso la chiamata di una funzione di sistema.
  • Qualsiasi funzione che non dipende da parametri esterni restituisce sempre lo stesso risultato. Una tale funzione può essere semplicemente copiata da uno script/indicatore/consigliere ad un altro e funzionerà correttamente. Copiare un pezzo arbitrario di codice procedurale, d'altra parte, è improbabile che funzioni.
  • Potete scrivere qualsiasi funzione personalizzata che faccia un lavoro utile. E così facendo, espanderà la funzionalità standard di MQL nel modo in cui avete bisogno. Per esempio, si pensa: "Come sarebbe bello se MQL avesse questa funzione....". - Ma perché non scriverlo da soli?
Vasily, quell'uomo non ha ancora padroneggiato gli array. È troppo presto per lui per ascoltare tali lezioni).
 
Реter Konow:
Vasily, l'uomo non ha ancora padroneggiato gli array. È troppo presto per lui per ascoltare tali lezioni).

Peter, tutti i consigli costruttivi sono importanti per me, compresi i tuoi!

Saluti, Vladimir.