Domande su MQL5 Wizard e sulla libreria standard di classi di trading - pagina 12

 
Reshetov:

Finora, c'è solo una soluzione unica per affrontare gli svantaggi di cui sopra:

Aprire l'accesso alla lettura dei valori restituiti dal metodo Direction() del modulo dei segnali dai moduli di gestione delle posizioni e di gestione del capitale e del rischio.

Aggiungete un altro metodo, per esempio, con identificatore double getMainSingnal(), che si riferisce a un'istanza della classe del modulo segnali e restituisce il risultato del metodo Direction() del modulo segnali. Poiché questo scambio di informazioni è in modalità di sola lettura, la sicurezza non è compromessa in alcun modo.

Per fare questo

  1. Allocare campi nelle classi CExpertMoney e CExpertTrailing per memorizzare un'istanza della classe CExpertSignal, cioè il modulo principale dei segnali.
  2. Questa stessa istanza della classe CExpertSignal, cioè il modulo del segnale, dovrebbe essere passata ai moduli di gestione delle posizioni e di gestione del denaro durante l'inizializzazione delle istanze di queste classi di moduli e il suo salvataggio nei campi specificati nel passo 1. Ovviamente, prima di farlo, dovreste controllare (assicurarvi) che ci sia già un'istanza della classe del modulo dei segnali, cioè che sia stata creata.
  3. Creare nelle classi CExpertMoney e CExpertTrailing metodi aggiuntivi, con identificatore doppio getMainSignal(), che si riferisce all'istanza della classe del modulo segnali, memorizzata nei campi appropriati di queste classi e restituisce come risultato, il risultato del metodo Direction() del modulo segnali.

Quasi tutto è chiaro. L'unica cosa che voglio chiarire: "perché questo vostro desiderio di vedere il segnale a livello di MM e trailing deve essere implementato a livello di classe base?

Non credo che sarebbe una buona cosa (cioè un male). L'algoritmo non è tipico (dal mio punto di vista). Da quanto ho capito, avete i vostri moduli MM e trailing (con i loro propri algoritmi legati al segnale).

Qui e metteteci dentro i corrispondenti 1.,2.,3.

 
uncleVic:

Quasi tutto è chiaro. L'unica cosa che vorrei chiarire è "perché questo vostro desiderio di vedere il segnale a livello di MM e trailing dovrebbe essere implementato a livello di classe base?".

Non credo che sarebbe una buona cosa (cioè un male). L'algoritmo non è tipico (dal mio punto di vista). Da quanto ho capito avete i vostri moduli di MM e trailing (con i vostri algoritmi legati al segnale).

Quindi, metteteci l'appropriato 1, 2, 3.

Il punto è che Master prende la classe SEhregt come base. E di conseguenza, non posso sovrascrivere le funzioni necessarie nei moduli che creo, perché sono già incompatibili con questa classe CEhregt di base fin dall'inizio, perché non hanno accesso a un'istanza della classe del modulo dei segnali.

Poiché l'istanza della classe modulo segnale è memorizzata solo nel campo della classe SEhregt nel file Expert.mqh, linea 67

CExpertSignal    *m_signal;                   // trading signals object

e questo campo non è condiviso (inaccessibile) con altre classi e moduli creati da loro.

Proprio per questo motivo, non c'è modo di sovrascrivere le classi CExpertMoney e CExpertTrailing per renderle compatibili con la procedura guidata.

Dopo tutto, se l'accesso è negato nelle classi genitori, i discendenti non lo otterranno in alcun modo.


Arrivare alla radice (c) "Aforismi" di Kozma Prutkov

 

Ho capito come passare i segnali di trading dal modulo dei segnali ai moduli di mantenimento della posizione e di gestione del denaro e del rischio senza passare istanze di CExpertSignal.

Aggiungiamo due righe ciascuna alle classi CExpertMoney e CExpertTrailing:

  double m_signaldirection; // Direction from signals module
 
  void              setSignalDirection(double value)  { m_signaldirection = value; }
  

Per il file ExpertMoney.mqh:

class CExpertMoney : public CExpertBase
  {
protected:
   //--- Direction from signals module  
   double m_signaldirection;
   //--- input parameters
   double            m_percent;

public:
                     CExpertMoney();
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   //--- methods of setting adjustable parameters
   void              Percent(double percent)    { m_percent=percent; }
   //--- method of verification of settings
   virtual bool      ValidationSettings();
   //---
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);
   virtual double    CheckReverse(CPositionInfo* position,double sl);
   virtual double    CheckClose(CPositionInfo* position);
  };

Per il file ExpertTrailing.mqh:

class CExpertTrailing : public CExpertBase
  {
protected:
   
    //--- Direction from signals module
   double m_signaldirection;
public:
   //---
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double& sl,double& tp)  { return(false); }
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double& sl,double& tp) { return(false); }
  };


Facendo questo abbiamo definito i campi e i metodi necessari per passare i segnali di trading. Ora abbiamo bisogno di passare questi segnali di trading alle classi del modulo. Lo faremo in Expert.mqh, cioè per la classe CExpert

Scriveremo una linea per passare i nostri segnali di trading alla classe di supporto delle posizioni

m_trailing.setSignalDirection(m_signal.Direction());

e inserirlo all'inizio del metodo che viene chiamato prima di ogni trailing stop, cioè CheckTrailingStop():

bool CExpert::CheckTrailingStop()
  {
//--- Set signal direction to trailing stops module
   m_trailing.setSignalDirection(m_signal.Direction()); 
//--- position must be selected before call
   if(m_position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of modifying the long position
      if(CheckTrailingStopLong()) return(true);
     }
   else
     {
      //--- check the possibility of modifying the short position
      if(CheckTrailingStopShort()) return(true);
     }
//--- return without operations
   return(false);
  }

Scriveremo una linea per passare i segnali di trading nella classe di gestione del denaro e del rischio:

m_money.setSignalDirection(m_signal.Direction());

e inserirlo all'inizio del metodo che viene chiamato prima di ogni apertura di posizione, cioè CheckOpen():

bool CExpert::CheckOpen()
  {
//--- set signal direction to money management module
   m_money.setSignalDirection(m_signal.Direction());
   if(CheckOpenLong())  return(true);
   if(CheckOpenShort()) return(true);
//--- return without operations
   return(false);
  }

E questo è tutto, il problema è risolto.

Ora, possiamo ottenere il valore corrente dei segnali di trading nei moduli di gestione delle posizioni e di gestione delle azioni e dei rischi accedendo al valore del campo m_signaldirection. Tutto quello che dobbiamo fare ora è registrare i nuovi campi e metodi nelle classi CExpertMoney e CExpertTrailing nella documentazione e aggiungere i file modificati agli aggiornamenti.

 

Ecco i file. Nell'Esperto, le righe 100 e 123 sono scritte a mano.

Se avete altre domande, non esitate a chiedere.

 
uncleVic:

Ecco i file. Nell'Esperto, le righe 100 e 123 sono scritte a mano.

Se avete altre domande, non esitate a contattarmi.

Che tipo di persone sono questi sviluppatori? Quando inizieranno ad ascoltare ciò di cui hanno bisogno i trader, che hanno già esperienza nella creazione di sistemi di trading, invece di venire con la loro visione di progettare sistemi di trading che sono praticamente inutilizzabili per gli utenti finali perché hanno bisogno di modificare manualmente il codice sorgente? Quante volte devo spiegare che posso entrare manualmente e sistemare il codice sorgente, e anche allora mi ci vorrà molto tempo per capire cosa c'è, anche se ho familiarità con la programmazione. E l'utente finale difficilmente entrerà nel codice, perché non capisce la programmazione. Lei stesso ha dichiarato, e cito:

"La conoscenza dei linguaggi di programmazione non è più un prerequisito per creare robot di trading."Vedere https://www.mql5.com/ru/articles/240.

"La prima versione di MQL5 Wizard aveva già la possibilità di creare rapidamente un Expert Advisor pronto all'uso come un insieme di semplici moduli in forma di codice sorgente in MQL5. Non era nemmeno necessario conoscere MQL5- bastava leggere"Costruisci il tuo Expert Advisor in MQL5 Wizard" (vedi https://www.mql5.com/ru/articles/275).

Ora si scopre che la conoscenza dei linguaggi di programmazione è richiesta, poiché l'utente deve inserire il codice dopo il Wizard e modificare qualcosa lì. Cioè tutte le dichiarazioni precedenti sono invenzioni e inganni degli sviluppatori.

Per esempio, se scrivo il mio modulo di gestione del denaro e del rischio che deve aprire una posizione secondo il livello del segnale di trade emesso da un modulo scritto da un altro sviluppatore di moduli. Come risultato il mio modulo sarà incompatibile con la procedura guidata. Come spiegare agli utenti che devono andare da qualche parte nel codice e inserire alcune stringhe per far funzionare il modulo? Dopo tutto, gli sviluppatori di moduli dovrebbero creare moduli, e wizard dovrebbe combinarli automaticamente in un sistema coerente, in modo che i moduli, come minimo, non entrino in conflitto tra loro e siano pienamente compatibili. Ma nel tuo caso, la procedura guidata non lo fa, perché dopo la procedura guidata, devi andare nel codice e rifare tutto manualmente.

È davvero così difficile mettere solo sei linee nei file di classe dei genitori, come ho indicato nel mio post precedente? E il problema si risolverà da solo e nessuno dovrà entrare nelle fonti e cambiare qualcosa lì. Che cosa ti farà cadere le mani? Perché sprecare il vostro tempo su qualche stupidaggine con la dimostrazione di come manualmente qualcosa deve essere corretto dopo la procedura guidata? Non potete spendere questo stesso tempo in un compito più utile, in modo che nessuno debba entrare nel codice per risolvere problemi simili in seguito?

Qual è l'ideologia della vostra azienda - da un lato dichiara la completa automazione, ma quando si tratta di questo, propongono di entrare nel codice e rifare tutto a mano dopo la cosiddetta "automazione"?

Tutto sommato, per come la vedo io, è inutile spiegare tutto questo. Non dovresti essere sorpreso che i trader non vogliano passare alla MT5 perché la piattaforma è grezza e sviluppata non per la comodità dell'autotrading, ma per la comodità degli sviluppatori di quella stessa piattaforma. E a meno che l'utente non impari a fondo la programmazione, è meglio che stia lontano dal trading automatico.

Se non vuoi, non sei obbligato a farlo. Se non avete altro da fare, allora sedetevi qui e spiegate ad ogni utente dove e come devono entrare nel codice sorgente con le mani e cosa esattamente correggere.

Собери свой торговый советник в Мастере MQL5
Собери свой торговый советник в Мастере MQL5
  • 2011.01.14
  • MetaQuotes Software Corp.
  • www.mql5.com
Знание языков программирования теперь не является обязательным условием для создания торговых роботов. Если раньше это действительно служило непроходимым препятствием для реализации своих торговых стратегий, то появление Мастера MQL5 в корне изменило ситуацию. Начинающие трейдеры могут перестать тревожиться из-за отсутствия опыта программирования - с новым визардом, позволяющим быстро генерировать код советника, он не понадобится.
 
Temo che lei sia in preda al massimalismo o semplicemente non capisca i limiti di applicabilità degli strumenti.

In ogni caso, con questo livello di argomentazione e portando quasi ogni questione oltre i limiti dell'esagerazione, non ci può essere lavoro con voi. Il vero lavoro implica un processo decisionale cosciente, non la demagogia verbale.
 
Renat:
Temo che lei sia in preda al massimalismo o semplicemente non capisca i limiti di applicabilità degli strumenti.

In ogni caso, con questo livello di argomentazione e prendendo quasi ogni domanda oltre il livello accettabile di esagerazione, non ci può essere lavoro con voi. Il vero lavoro implica un processo decisionale cosciente, non la demagogia verbale.

In generale non ho chiesto lavoro, cioè di guadagnare soldi, ed ero abbastanza felice di collaborare su base volontaria. Come e dove mi guadagno da vivere lo decido io.

Beh, non lo farà e non deve farlo. La nostra attività è quella di offrire, avete il diritto di rifiutare. Come si dice: il padrone è il capo.

Se la tua azienda ha già capito tutto e ha persino insegnato ai dummies a creare i cosiddetti Expert Advisors "pronti all'uso". Inoltre, il punto è che sono buoni solo per la dimostrazione di Wizard, ma non sono molto buoni per l'autotrading, perché anche sui dati storici la curva di equity sembra inconsistente.

Buona fortuna!

 
Reshetov:
...

Per esempio, se scrivo il mio modulo di gestione del denaro e del rischio, che dovrebbe aprire una posizione secondo il livello del segnale di trading emesso dal modulo scritto da un altro sviluppatore di moduli. Il risultato sarà che il mio modulo è già incompatibile con la procedura guidata. Come spiegare agli utenti che devono andare da qualche parte nel codice e inserire alcune stringhe per far funzionare il modulo? Dopo tutto, gli sviluppatori di moduli dovrebbero creare moduli, e wizard dovrebbe combinarli automaticamente in un sistema coerente, in modo che i moduli, come minimo, non entrino in conflitto tra loro e siano pienamente compatibili. E tu hai una procedura guidata che non lo fa, perché dopo devi andare nel codice e rifare tutto manualmente.

È davvero così difficile scrivere solo sei righe nei file di classe dei genitori, come ho sottolineato nel mio post precedente? E il problema si risolverà da solo e nessuno dovrà andare nelle fonti e cambiare qualcosa lì. Che cosa ti farà cadere le mani? Perché sprecare il vostro tempo su qualche stupidaggine, dimostrando come risolvere manualmente qualcosa dopo la procedura guidata? Non potete spendere questo stesso tempo in qualcosa di più utile, in modo che nessuno debba entrare nel codice più tardi per risolvere problemi simili?

...

Il tuo approccio viola l'incapsulamento delle classi e di conseguenza porta confusione gerarchica.

Leggete il libro di Steve McConell "The Perfect Code" a vostro piacimento.

Immaginate una fabbrica per la produzione di guanti, c'è un timbro a cinque dita per la mano destra e sinistra, ma poi arriva un piccolo ordine per guanti a sei dita. Ci sono persone così, dopo tutto. Ma invece di fare un timbro per loro (che farà una partita e rimarrà lì per un po'), suggerisci di modificare il timbro a cinque dita facendo un dito scorrevole. Sembra che sia universale e tutto è grande, ma la forza del timbro a cinque dita sarà indebolita per il bene dell'universalità (per il bene di una piccola necessità di produrre occasionalmente guanti a sei dita). E poi un lotto di 300 quattro dita sarà ordinato, e di nuovo sbriciolerà il modello ben collaudato e affidabile.

Vi è stato detto sopra:

"perché il vostro desiderio di vedere il segnale a livello di MM e trailing deve essere implementato a livello di classe base?".

Non credo che sarebbe un bene (cioè un male). L'algoritmo non è tipico (dal mio punto di vista). Da quanto ho capito, avete i vostri moduli MM e trailing (con i loro propri algoritmi legati al segnale).

Invece di cambiare la bibbia standard, sarebbe meglio fare degli sviluppi per estenderla (attraverso l'ereditarietà). Allora sarebbe davvero interessante.

HZZ Inoltre, in modo che la gente non abbia a che fare con le complessità del codice (come hai scritto sopra), si possono avvolgere i moduli pronti in biblio e versare sharovarianamente nel mercato, poi basta inserire il modulo da Reshetov e premere il pulsante [scarica pasta].

 
Urain:

Il tuo approccio viola l'incapsulamento delle classi e di conseguenza introduce una confusione gerarchica.

Leggete il libro di Steve McConell "Perfect Code" a vostro piacimento.

In parole povere, pensate al Maestro come a una fabbrica di guanti, c'è un timbro a cinque dita per la mano destra e sinistra, ma poi arriva un piccolo ordine di guanti a sei dita. Dopo tutto, ci sono persone così. Ma invece di fare un timbro per loro (che farà una partita e rimarrà lì per un po'), suggerisci di modificare il timbro a cinque dita facendo un dito scorrevole. Sembra che sia universale e tutto è grande, ma la forza del timbro a cinque dita sarà indebolita per il bene dell'universalità (per il bene di una piccola necessità di produrre occasionalmente guanti a sei dita). E poi un lotto di 300 quattro dita sarà ordinato, e di nuovo sbriciolerà il modello ben collaudato e affidabile.

Vi è stato detto sopra:

Invece di apportare modifiche alla bibbia standard, sarebbe meglio fare sviluppi per estenderla (attraverso l'ereditarietà). Allora sarà davvero interessante.
Quante volte possiamo dire che non possiamo ereditare ciò che non è disponibile nelle classi genitori? Quando conoscerete finalmente il libro "Code Complete" scritto da Steve McConell stesso?
  1. Il mio approccio non viola i principi di incapsulamento, perché nella versione che ho proposto, tutto il superfluo è nascosto, e i moduli ricevono solo un segnale di scambio come un valore di tipo doppio e solo in modalità di lettura. A differenza di alcune persone, non ho solo letto i libri su OOP, ma li ho studiati attentamente.
  2. Non ho suggerito di creare guanti a sei dita a quelli di modello, cioè di attaccare le seste dita come moduli aggiuntivi, ma ho semplicemente suggerito di far corrispondere tutti i moduli esistenti con i segnali del modulo segnali, che in realtà è il principale per i sistemi di trading perché l'intero sistema deve funzionare con il suo comando. Sei stato tu a suggerire la modularità, cioè guanti con dita intercambiabili. Ma poiché avete fatto in modo che la mano destra non sappia cosa sta facendo la mano sinistra, cioè gli altri moduli non possono ottenere informazioni dal modulo del segnale e sincronizzare le loro azioni con esso, i guanti avranno dita (moduli) di dimensioni diverse, quando l'utente mette il guanto sulla sua mano e vede che una delle sue dita è piccola e non ci entra, mentre l'altra è grande ed eccessiva.

Per esempio, un trailing stop viene eseguito secondo un sistema di segnali separato sviluppato da un terzo sviluppatore del modulo, come un'onda mobile o parabolica, i cui segnali in alcuni punti contraddicono i segnali del modulo e il sistema di trading inizia a funzionare in modo incoerente. Anche il modulo di gestione del denaro e del rischio non può indovinare telepaticamente che il segnale di trading è debole ed è il momento di ridurre il volume delle posizioni aperte e agire secondo alcune regole indipendenti dal modulo del segnale, cioè uno chiede di rallentare nelle curve e l'altro ingrana la marcia. E l'intero sistema di trading, creato con l'aiuto del tuo cosiddetto maestro, si rivela come nella favola di Krylov chiamata "Il granchio e il luccio". Né più né meno. E proprio questa ideologia favolosa di assemblare consiglieri sconsiderati, la vostra azienda sta cercando di imporci per l'autotrading. Ne abbiamo bisogno?

Il risultato sono sistemi di trading con tali grafici di equità ed equilibrio che possono solo spaventare i commercianti e gli investitori, vedi https://www.mql5.com/ru/code/833.




Questo non è perché il creatore del modulo, in questo caso particolare Nikolay Kositsin, ha fatto qualcosa di sbagliato, ma perché il resto dei moduli del sistema di trading non possono essere coordinati tra loro e stanno lavorando in modo incoerente.

Ma è inutile spiegare. Gli sviluppatori della piattaforma, invece di scrivere una misera sei righe per risolvere i problemi, scriveranno chilometri di note a piè di pagina nei forum, accusando gli sviluppatori dei sistemi di trading di diffondere demagogia, violazioni di incapsulamento e altri peccati mortali, ma non alzeranno un dito per correggere le loro stesse carenze e incomprensioni.

Quindi non ha senso fare altre discussioni. Rimanga della sua opinione e faccia come vuole. Sono stufo ed è inutile, perché gli sviluppatori della piattaforma se ne fregano, perché non fanno le loro cose e se questi stessi strumenti possono essere utilizzati dagli utenti della piattaforma per l'autotrading, agli sviluppatori non interessa. Un uomo ben nutrito non conosce un uomo affamato.

Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
  • voti: 7
  • 2012.02.23
  • Nikolay Kositsin
  • www.mql5.com
Модуль торговых сигналов для Мастера MQL5. Сигналом для открытия позиций служит изменение цвета свечи, формируемой индикатором Heiken_Ashi_Smoothed.
 
Reshetov:
...

Reshetov, non voglio nemmeno leggere i tuoi scarabocchi emotivi. Se vuoi discutere, argomenta il tuo caso.

Lo scopo di una procedura guidata è quello di creare un modello che soddisfi le esigenze della maggior parte dei trader. Ho un modello EA su cherver (l'ho scritto io stesso), imposta la funzionalità di base. E in pratica deve sempre essere corretto. Ma le modifiche sono minime. Se avessi creato un modello per non modificarlo affatto, sarebbe stato un codice enorme per tutte le occasioni, in cui ci si potrebbe perdere.

La procedura guidata crea un modello già funzionante, e una persona che non sa programmare può usarlo così com'è. Se capisci il codice, è facile cambiarlo in quello che vuoi. Basta solo una volta per capire come vengono create le cose e dove sono separate nella libreria standard. Inoltre, potete anche usare la libreria standard come modello e semplicemente copiare le sezioni che vi piacciono nel vostro codice.

Motivazione: