Discussione sull’articolo "Manuale MQL5: Sviluppo di un indicatore multi-simbolo per l’analisi della divergenza dei prezzi"

 

Il nuovo articolo Manuale MQL5: Sviluppo di un indicatore multi-simbolo per l’analisi della divergenza dei prezzi è stato pubblicato:

In questo articolo, considereremo lo sviluppo di un indicatore multi-simbolo per analizzare la divergenza dei prezzi in un determinato periodo di tempo. Gli argomenti principali sono già stati discussi nel precedente articolo sulla programmazione di indicatori multi-valuta Manuale MQL5: Sviluppo di un indicatore di volatilità multi-simbolo in MQL5. Quindi questa volta ci soffermeremo solo su quelle nuove caratteristiche e funzioni che sono state cambiate radicalmente. Se sei un neofita della programmazione di indicatori multi-valuta, ti consiglio di leggere prima l'articolo precedente.

In questo articolo prenderemo in considerazione le seguenti questioni:

  • Modifica delle proprietà del grafico.
  • Gestione degli eventi CHARTEVENT_OBJECT_DRAG (trascinamento di un oggetto grafico) e CHARTEVENT_CHART_CHANGE (ridimensionamento del grafico o modifica delle proprietà del grafico mediante la finestra di dialogo delle proprietà).
  • Rendering dei buffer degli indicatori utilizzando più di un colore.
  • Definizione di alti e bassi nei buffer degli indicatori all'interno dell'area di visibilità per impostare un grafico alto/basso.
  • Inversione di una serie.

Intervallo di tempo settimanale nella modalità "Linea verticale"

    Autore: Anatoli Kazharski

     

    È solo un errore di battitura o dovrebbe essere così?

    Non importa quante volte ho provato, tutte le funzioni della "Squadra di copia" non restituiscono mai zero, ma solo -1 o >0.

    //+------------------------------------------------------------------+
    //| Controlla il numero di dati disponibili per tutti i caratteri ||
    //+------------------------------------------------------------------+
    bool CheckAvailableData()
      {
       int attempts=100;
       
    //---
       for(int s=0; s<SYMBOLS_COUNT; s++)
         {
          //--- Se esiste un carattere di questo tipo
          if(symbol_names[s]!=empty_symbol)
            {
    datetime time[];                    // Array per controllare il numero di barre
       int      total_period_bars   =0;    // Numero di barre del periodo corrente
       datetime terminal_first_date =NULL; // Prima data di disponibilità dei dati del periodo corrente nel terminale
             //--- Ottenere la prima data dei dati del periodo corrente nel terminale
             terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE);
             //--- Ottenere il numero di barre disponibili a partire dalla data specificata
             total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent());
             //--- Verificare la disponibilità di queste barre
             for(int i=0; i<attempts; i++)
               {
                //-- Copia la quantità di dati specificata
                if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
                  {
                   //--- Se la quantità richiesta è stata copiata, interrompere il ciclo
                   if(ArraySize(time)>=total_period_bars)
                      break;
                  }
               }
             //--- Se vengono copiati meno dati, si deve fare un altro tentativo.
             if(ArraySize(time)==0 || ArraySize(time)<total_period_bars)
               {
                msg_last=msg_prepare_data;
                ShowCanvasMessage(msg_prepare_data);
                OC_prev_calculated=0;
                return(false);
               }
            }
         }
    //--- Se in modalità linea verticale per il punto di partenza della differenza di prezzo, uscire
       if(StartPriceDivergence==VERTICAL_LINE)
          return(true);
       else
         {
          datetime time[];                    // Array per controllare il numero di barre
          int      total_period_bars   =0;    // Numero di barre del periodo corrente
          datetime terminal_first_date =NULL; // Prima data di disponibilità dei dati del periodo corrente nel terminale
          //--- Ottenere la prima data dei dati del periodo corrente nel terminale
          for(int i=0; i<attempts; i++)
             if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0)
                break;
          //--- Ottenere il numero di barre disponibili a partire dalla data specificata
          for(int i=0; i<attempts; i++)
             if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0)
                break;
          //--- Verificare la disponibilità di queste barre
          for(int i=0; i<attempts; i++)
             //-- Copia la quantità di dati specificata
             if(CopyTime(Symbol(),timeframe_start_point,
                terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0)
                break;
          //--- Se vengono copiati meno dati, si deve fare un altro tentativo.
          if(ArraySize(time)<=0 || total_period_bars<=0)
            {
             msg_last=msg_prepare_data;
             ShowCanvasMessage(msg_prepare_data);
             OC_prev_calculated=0;
             return(false);
            }
         }
    //---
       return(true);
      }
     
    Fleder:

    È solo un errore di battitura o dovrebbe essere così?

    Non importa quante volte ci abbia provato, tutte le funzioni della "Squadra di copia" non restituiscono mai zero, ma solo -1 o >0.

    In generale, si dovrebbe fare >0. Ma in questo caso, i controlli successivi consentono di non farlo.
     
    tol64:
    In generale, si dovrebbe fare >0. Ma in questo caso, i controlli successivi consentono di non farlo.

    Ma questa espressione sarà sempre vera:

    if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
     
    Fleder:

    Ma questa espressione sarà sempre vera:

    È possibile rimuovere del tutto l'if. In questo caso non è critico.
     
    tol64:
    È possibile rimuovere il se. In questo caso non è critico.
    Beh, è quello che ho pensato :-)
     

    In generale, il caricamento dei dati storici su un simbolo non avviene nel modo in cui è scritto nella guida.

    In effetti, le cose si svolgono in questo modo:

    se dal programma mql5 viene fatta una richiesta di dati di una serie temporale utilizzando, ad esempio, la funzione CopyTime

    e questi dati non sono presenti nel terminale (non ancora caricati), il terminale scaricherà questi dati dal server non nella quantità richiesta (nell'esempio della guida è di 100 barre),

    ma il numero di barre della serie temporale richiesta che il parametro "Max barre nel grafico" consente di "mettere" nella RAM.

    È sufficiente richiedere una sola barra di un periodo superiore, ad esempio PERIODO_W1, perché l'intero storico verrà scaricato dal server.

     
    Fleder:

    In generale, il caricamento dei dati storici su un simbolo non avviene nel modo in cui è scritto nella guida.

    In effetti, le cose si svolgono in questo modo:

    se dal programma mql5 viene fatta una richiesta di dati di una serie temporale utilizzando, ad esempio, la funzione CopyTime

    e questi dati non sono presenti nel terminale (non ancora caricati), il terminale scaricherà questi dati dal server non nella quantità richiesta (nell'esempio della guida è di 100 barre),

    ma il numero di barre della serie temporale richiesta che il parametro "Max barre nel grafico" consente di "mettere" nella RAM.

    È sufficiente richiedere una sola barra di un periodo superiore, ad esempio PERIODO_W1, poiché l'intero storico verrà scaricato dal server.

    La guida può contenere tutto ciò che si desidera. Siete liberi di farlo come meglio credete. ;)

    L'esempio della guida è stato discusso in un altro articolo: Come preparare le quotazioni di MetaTrader 5 per altri programmi >>>.

     
    tol64:

    Il certificato può dire tutto quello che volete. Siete liberi di fare ciò che ritenete opportuno. ;)

    L'esempio della guida è stato discusso in un altro articolo: Come preparare le quotazioni di MetaTrader 5 per altri programmi >>>.

    Questo è ciò che ho fatto. Ho appena visto il calcolo delle rimanenti "barre scaricate" dal server nel tuo codice.

    E ho pensato: al terminale non interessa, pompa quanto gli serve per formare.

     

    Alla fine del suo articolo ha scritto:"Questo indicatore può essere sviluppato illimitatamente in meglio".

    A mio parere, la contemplazione della divergenza dei prezzi è di scarsa utilità per l'occhio umano. Un umano non è un robot!

    Ma è un argomento interessante per un robot.

    Avete suggerito diverse opzioni di rendering:

    1. dalla linea.

    2. "giorno".

    Attualmente sto lavorando a qualcosa di simile, solo in modalità "settimana".

     
    Fleder:

    Alla fine del suo articolo ha scritto:"Questo indicatore può essere sviluppato illimitatamente in meglio".

    A mio parere, la contemplazione della divergenza dei prezzi è di scarsa utilità per l'occhio umano. Un umano non è un robot!

    Ma è un argomento interessante per un robot.

    Avete suggerito diverse opzioni di rendering:

    1. dalla linea.

    2. "giorno".

    Attualmente sto lavorando a qualcosa di simile, solo in modalità "settimana".

    Non so se sarò in grado di scrivere qualcos'altro a breve, perché sto affrontando altri problemi. Ma secondo questo articolo, lo sviluppo dovrebbe riguardare ancora i calcoli multivaluta e la visualizzazione di questi calcoli sul canvas.

    Sì, l'uomo non è un robot, ma a volte è necessario guardare l'argomento di studio in un altro modo per farsi un'idea. ;)