Discussione sull’articolo "Crea il Tuo Robot di Trading in 6 Passaggi!"

 

Il nuovo articolo Crea il Tuo Robot di Trading in 6 Passaggi! è stato pubblicato:

Se non sai come vengono costruite le classi di trading e hai paura delle parole "Programmazione Orientata agli Oggetti", allora questo articolo fa per te. In effetti, non è necessario conoscere i dettagli per scrivere il proprio modulo di segnali di trading. Basta seguire alcune semplici regole. Tutto il resto verrà fatto da MQL5 Wizard e otterrai un robot di trading pronto all'uso!

È vero, MQL5 Wizard semplifica enormemente la creazione di un Expert Advisor, ma prima devi imparare cosa verrà utilizzato come input per esso. Per creare automaticamente un Expert Advisor utilizzando MQL5 Wizard, assicurati che i suoi componenti aderiscano a cinque classi di base della sezione Classi di base degli Expert Advisor:

  • CExpertBase è una classe base per altre quattro classi.
  • CExpert è la classe per la creazione di un robot di trading; questa è la classe che fa trading.
  • CExpertSignal è una classe per la creazione di un modulo di segnali di trading; l'articolo riguarda questa classe.
  • CExpertTrailing è una classe per seguire uno Stop Loss protettivo.
  • CExpertMoney è la classe di gestione del denaro.

Ecco tutta la forza dell'approccio "grande e terribile" chiamato Programmazione Orientata agli Oggetti (OOP). Ma niente paura, ormai quasi tutti hanno un cellulare con tante funzioni e quasi nessuno sa come funziona. Non abbiamo bisogno di studiare tutto questo, parleremo solo di alcune funzioni della classe CExpertSignal.


Autore: MetaQuotes

 
E tutto andrebbe bene - i robot di trading vengono creati in 5 clic del mouse, possono essere testati in un tester per il sistema di trading оптимизации параметров, si può mettere il robot risultante a operare sul proprio conto e non è necessario modificare nulla con un file.
Un robot di questo tipo può essere autorizzato a operare? Dopo tutto, la libreria delle classi di trading non contiene l'elaborazione di vari errori, condizione necessaria già al campionato, figuriamoci nel trading reale. È più corretto scrivere che è possibile creare un Expert Advisor in cinque clic solo per un rapido controllo delle idee nel tester, ma un tale Expert Advisor non sarà adatto al trading.
 
Grazie per il vostro lavoro! E grazie per la foto con la scatola e i cubi! Sistematizza :-)
 

per continuare...

Ho pensato di convertire le righe di questo esempio:

if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)

if(m_metodo_slow!=MODE_SMA && m_metodo_slow!=MODE_EMA && m_metodo_slow!=MODE_SMMA && m_metodo_slow!=MODE_LWMA)

Nell'algoritmo:

1) due array:

il primo contiene m_method_fast e m_method_slow

il secondo contiene i valori dell'enumerazione ENUM_MA_METHOD.

2) In un ciclo, prendendo il valore del primo array, controllare se si trova nel secondo.

Potete dirmi come implementare questo?

Ho capito che è necessario collegare CArray . Ma di che tipo?

Chi può, per favore, scrivere una parte del codice, perché le cose elementari di base, e con la sintassi non posso ancora prendere.

Grazie!

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих - Документация по MQL5
 
bivmail:

per continuare...

Ho pensato di convertire le righe di questo esempio:

if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)

if(m_metodo_slow!=MODE_SMA && m_metodo_slow!=MODE_EMA && m_metodo_slow!=MODE_SMMA && m_metodo_slow!=MODE_LWMA)

Nell'algoritmo:

1) due array:

il primo contiene m_method_fast e m_method_slow

il secondo contiene i valori dell'enumerazione ENUM_MA_METHOD.

2) In un ciclo, prendendo il valore del primo array, controllare se si trova nel secondo.

Potete dirmi come implementare questo?

Ho capito che è necessario collegare CArray . Ma di che tipo?

Chi può, per favore, scrivere una parte del codice, perché le cose elementari di base, e con la sintassi non posso ancora prendere.

Grazie!

Come questo:

func(int& array1[],int& array2[])
  {
   int total1=ArraySize(array1);
   int total2=ArraySize(array2);
//---
   for(int i=0;i<total1;i++)
     {
      for(int j=0;j<total2;j++)
        {
         if(array1[i]==array2[j])
           {
            // trovato
           }
        }
     }
  }
 

Sì, sono già arrivato a questo punto in C++ per principianti :-)

Solo che non esiste un tipo di dati ENUM_MA_METHOD.

Come posso scoprire in quale tipo di dati consiste questa enumerazione? È possibile eseguire un ciclo attraverso l'enumerazione ENUM_MA_METHOD stessa?

Ora vedo due modi:

/il primo modo per descrivere entrambi gli array

  ENUM_MA_METHOD l_array_enum_ma_method[3];

  l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

  print("array size %d", ArraySize(l_array_enum_ma_method));

  print("ENUM_MA_METHOD size %d", ArraySize(ENUM_MA_METHOD));

  

   ENUM_MA_METHOD l_array_select_method[1];

   l_array_select_method[0]=m_MethodFast;

   l_array_select_method[1]=m_MethodSlow;

   //ulteriormente secondo lo schema

   

   //secondo modo, collegare la libreria

   //#includere <ArraysArrayInt.mqh>

     CArrayInt *l_array_enum_ma_method=new CArrayInt;

   l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

   l_array_enum_ma_method.Sort();

   //--- elemento di ricerca

   if(l_array_enum_ma_method.Search(m_MethodFast)!=-1) printf("Element found");

   else                        printf("Element not found");

   //--- eliminare l'array

   delete l_array_enum_ma_method;

nel secondo modo è necessario collegare una libreria di un tipo specifico, e che tipo è ENUM_MA_METHOD?

hmm... strano, ho cliccato su reply e si è rivelato un nuovo post....

 
Vedere come inserire correttamente il codice.
 
bivmail:

Sì, sono già arrivato a questo punto in C++ per principianti :-)

Solo che non esiste un tipo di dati ENUM_MA_METHOD.

Come posso scoprire in quale tipo di dati consiste questa enumerazione? È possibile eseguire un ciclo attraverso l'enumerazione ENUM_MA_METHOD stessa?

Ora vedo due modi:

nel secondo modo è necessario collegare una libreria di un tipo specifico, e che tipo è ENUM_MA_METHOD?

hmm... strano, ho fatto clic su reply e si è rivelato un nuovo post....

Primo modo:

 ENUM_MA_METHOD l_array_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};
//--- più avanti nella linea

Secondo modo:

#include <Arrays\ArrayInt.mqh>

CArrayInt l_array_enum_ma_method;
//---
l_array_enum_ma_method.Add(MODE_SMA);
l_array_enum_ma_method.Add(MODE_EMA);
l_array_enum_ma_method.Add(MODE_SMMA);
l_array_enum_ma_method.Add(MODE_LWMA);
//--- più avanti nella linea

Non riesco a capire perché sono necessari così tanti passaggi?

 

oops... grazie mille, è quello che sto cercando di fare... via.

Nel primo caso, ho già visto questo modo di registrare, ma non ho ancora capito di cosa ho bisogno,

e nel secondo caso - ero confuso da ArrayInt. Pensavo che essendo Int, significa che viene memorizzato solo il valore numerico, ma ,

sembra che il compilatore converta MODE_SMA in un numero, e quando si recupera il valore, sarà necessario eseguire una conversione implicita (usando le parentesi) al tipo(ENUM_MA_METHOD), cioè qualcosa di simile al seguente.

  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

P.S. Nella terza sezione 3. Metodi per l'impostazione dei parametri, dovremmo cancellare le righe dichiarate prematuramente, penso a
:

 CiCustom          m_fast_ma;        // indicatore come oggetto
   CiCustom          m_slow_ma;        // indicatore come oggetto
 
bivmail:

P.S. Nella terza sezione 3. Metodi per l'impostazione dei parametri, penso che dovremmo cancellare le righe dichiarate prematuramente:

Rimosso, grazie.
 

Mi stavo entusiasmando, ma non riesco a risolvere il problema (comm - ho letto del trasferimento dell'indirizzo di memoria, ma non ha funzionato nemmeno in questo modo):

Il compilatore restituisce l'errore 'm_MethodFast' - espressione costante richiesta, ' m_MethodSlow' - espressione costante richiesta

Naturalmente, queste sono domande per i non addetti ai lavori. forse dovrei porre tali domande in un altro thread, in modo da non intasare l'articolo?

/il primo modo per descrivere entrambi gli array
//int *Finger_m_MethodFast;
//int *Finger_m_MethodSlow;
//Finger_m_MethodFast=&m_MethodFast;
//Finger_m_MethodFast=&m_MethodSlow;
// int l_array1_select_method[]={Finger_m_MethodFast,Finger_m_MethodFast};
   ENUM_MA_METHOD l_array1_select_method[]={m_MethodFast,m_MethodSlow};
   ENUM_MA_METHOD l_array2_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};

   int total_array1=ArraySize(l_array1_select_method);
   int total_array2=ArraySize(l_array2_enum_ma_method);
   bool NoErrorsFlag=false;
   for(int i_array1=0;i_array1<total_array1;i_array1++)
     {

      for(int i_array2=0;i_array2<total_array2;i_array2++)
        {
         if(l_array1_select_method[i_array1]=l_array2_enum_ma_method[i_array2])
           {
            NoErrorsFlag=true;
           }
        }
      if(!NoErrorsFlag)
        {
         PrintFormat("Tipo di lisciatura non valido %s media mobile!".,EnumToString(l_array1_select_method[i_array1]));
        }

     }

   if(!NoErrorsFlag)
     {
      return(false);
     }