Guarda come scaricare robot di trading gratuitamente
Ci trovi su Telegram!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Sistemi Esperti

Download all ticks of a symbol's history - sistema esperto per MetaTrader 5

Visualizzazioni:
144
Valutazioni:
(5)
Pubblicato:
Freelance MQL5 Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance

Il codice di questo consulente esperto scansiona il market watch del broker dell'utente ed estrae i simboli per i quali scarica tutti i tick disponibili o i tick fino a una data.

Può essere utile per scaricare tutta la cronologia dei simboli per il backtest o per creare un grafico personalizzato a partire da questi tick.

I terminali memorizzeranno i tick nella cartella dei dati, pertanto è necessario assicurarsi di disporre di uno spazio adeguato sul disco rigido.

Per facilitare il download dei simboli è necessario un gestore di download.

La struttura CDownloadManager contiene tutte le informazioni che dovremo conservare.

struct CDownloadManager
  {
   bool              m_started,m_finished;
   string            m_symbols[],m_current;
   int               m_index;

  • lo stato del download (iniziato/finito)
  • l'elenco dei simboli da analizzare
  • il simbolo corrente
  • e l'indice del simbolo in fase di scansione

Avremo anche bisogno di leggere e scrivere sul disco rigido e, dato che stiamo lavorando con i simboli, creiamo 2 funzioni rapide per scrivere e leggere stringhe da file binari.

La funzione Salva stringa su file :

void writeStringToFile(int f,string thestring)
  {
//salvare la stringa di simboli
   char sysave[];
   int charstotal=StringToCharArray(thestring,sysave,0,StringLen(thestring),CP_ACP);
   FileWriteInteger(f,charstotal,INT_VALUE);
   for(int i=0;i<charstotal;i++)
     {
      FileWriteInteger(f,sysave[i],CHAR_VALUE);
     }
  }

Riceve :

  • l'handle del file f, di un file aperto per la scrittura e i flag binari FILE_WRITE|FILE_BIN
  • la stringa da scrivere nel file

Scrive un numero intero di caratteri presenti nella stringa e poi memorizza ogni carattere nella stringa.

La funzione di caricamento della stringa dal file:

string readStringFromFile(int f)
  {
   string result="";
//caricare la stringa di simboli
   char syload[];
   int charstotal=(int)FileReadInteger(f,INT_VALUE);
   if(charstotal>0)
     {
      ArrayResize(syload,charstotal,0);
      for(int i=0;i<charstotal;i++)
        {
         syload[i]=(char)FileReadInteger(f,CHAR_VALUE);
        }
      result=CharArrayToString(syload,0,charstotal,CP_ACP);
     }
   return(result);
  }

Riceve:

  • handle f di un file aperto per la lettura in formato binario, flag FILE_READ|FILE_BIN

Legge un numero intero di lunghezza che indica quanti caratteri ci si deve aspettare in quel punto del file. Procede alla lettura di ogni carattere in un array di caratteri e quindi crea una stringa da quell'array di caratteri che viene restituita come risultato del caricamento come stringa.

Torniamo alla struttura CDownloadManager. Abbiamo bisogno di un modo per inizializzare il gestore e riempirlo dall'orologio di mercato:

   //+------------------------------------------------------------------+
   //| prendere i simboli dall'orologio di mercato|
   //+------------------------------------------------------------------+
   void              grab_symbols()
     {
      //! solo dalla mw !
      int s=SymbolsTotal(true);
      ArrayResize(m_symbols,s,0);
      for(int i=0;i<ArraySize(m_symbols);i++)
        {
         m_symbols[i]=SymbolName(i,true);
        }
     }

È abbastanza semplice:

  • chiedere quanti simboli sono presenti nel market watch (attivi)
  • ridimensionare il nostro array m_symbols per riceverli
  • eseguire un loop sul totale dei simboli e richiedere il nome del simbolo

Siamo anche responsabili della gestione del download dei dati dei simboli, quindi avremo bisogno di una funzione che sia essenzialmente il gestore:

   //+------------------------------------------------------------------+
   //| Gestire il processo di download dei simboli|
   //+------------------------------------------------------------------+
   void              manage(string folder,string filename)
     {
      //in sostanza, avvia o naviga verso il simbolo successivo
      //se impostato
      if(ArraySize(m_symbols)>0)
        {
         //se non avviato
         if(!m_started)
           {
            m_started=true;
            //andare al primo simbolo
            m_current=m_symbols[0];
            m_index=1;
            save(folder,filename);
            if(_Symbol!=m_current)
              {
               ChartSetSymbolPeriod(ChartID(),m_current,_Period);
              }
            else
              {
               ENUM_TIMEFRAMES new_period=PERIOD_M1;
               for(int p=0;p<ArraySize(TFS);p++)
                 {
                  if(_Period!=TFS[p])
                    {
                     new_period=TFS[p];
                     break;
                    }
                 }
               ChartSetSymbolPeriod(ChartID(),m_current,new_period);
              }
            return;
           }
         //se avviato
         else
           {
            m_index++;
            if(m_index<=ArraySize(m_symbols))
              {
               m_current=m_symbols[m_index-1];
               save(folder,filename);
               if(_Symbol!=m_current)
                 {
                  ChartSetSymbolPeriod(ChartID(),m_current,_Period);
                 }
               return;
              }
            else
              {
               m_finished=true;
               FileDelete(folder+"\\"+filename);
               Print("Finished");
               ExpertRemove();
               return;
              }
           }
        }
      else
        {
         Print("Please grab symbols first");
        }
      //se il set termina qui
     }

Come funziona il sistema:

  • Il grafico si apre, abbiamo bisogno di 1 grafico e viene impostato un timer.
  • Il timer viene eseguito e noi lo annulliamo
  • Controlliamo se si tratta di un nuovo download o di un download continuo.
  • Se si tratta di un nuovo download, lo impostiamo prendendo tutti i simboli.
  • Se si tratta di un download continuo, scarichiamo i dati per il simbolo corrente.

Questa è la parte di codice che esegue il download sul timer:

//+------------------------------------------------------------------+
//Timer|
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- se sincronizzato
   if(SymbolIsSynchronized(_Symbol)&&TerminalInfoInteger(TERMINAL_CONNECTED)==1)
     {
      EventKillTimer();
      //--- caricare il sistema qui
      if(MANAGER.load(MANAGER_FOLDER,MANAGER_STATUS_FILE))
        {
         //--- sistema caricato, quindi stiamo analizzando un simbolo qui
         Comment("System loaded and we are processing "+MANAGER.m_current);
         //--- carico dei tick

         //--- trova prima il tick più vecchio disponibile nel broker
         int attempts=0;
         int ping=-1;
         datetime cursor=flatten(TimeTradeServer());
         long cursorMSC=((long)cursor)*1000;
         long jump=2592000000;//60*60*24*30*1000;

         MqlTick receiver[];
         long oldest=LONG_MAX;
         Comment("PleaseWait");
         while(attempts<5)
           {
            ping=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,cursorMSC,1);
            if(ping==1)
              {
               if(receiver[0].time_msc==oldest)
                 {
                  attempts++;
                 }
               else
                 {
                  attempts=0;
                 }
               if(receiver[0].time_msc<oldest)
                 {
                  oldest=receiver[0].time_msc;
                 }
               cursorMSC-=jump;
               if(limitDate&&receiver[0].time<=oldestLimit)
                 {
                  break;
                 }
              }
            else
              {
               attempts++;
              }

            Sleep(44);
            Comment("Oldest Tick : "+TimeToString((datetime)(oldest/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"\nCursor("+TimeToString((datetime)(cursorMSC/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+")\nAttempts("+IntegerToString(attempts)+")\nPlease wait for response...");
           }
         //--- a questo punto abbiamo il tick più vecchio
         //--- iniziare a richiedere i tick dal più vecchio al più recente
         if(oldest!=LONG_MAX)
           {
            ArrayFree(receiver);
            datetime newest_tick=0;
            //--- ricevere l'ora dell'ultimo tick per questo simbolo memorizzato in symbol_time
            datetime most_recent_candle=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
            while(newest_tick<most_recent_candle)
              {
               //--- richiedere un nuovo batch partendo dal tempo più vecchio con il limite di ticks specificato
               int pulled=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,oldest,tick_packets);
               if(pulled>0)
                 {
                  //--- se si estrae un nuovo lotto si aggiornano i tempi scaricati
                  newest_tick=receiver[pulled-1].time;
                  oldest=receiver[pulled-1].time_msc;
                  ArrayFree(receiver);
                 }
               //--- timeout delle richieste del server, modificarlo se si vuole
               Sleep(44);
               Comment("Pulled up to "+TimeToString(newest_tick,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" so far");
              }
           }
         else
           {
            Alert("Please close the terminal \n head over to the ticks folder \n and delete the empty folders");
            ExpertRemove();
           }
         //-- aggiornare il gestore e andare avanti
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
      else
        {
         //--- prendere i simboli di market watch per avviare il download
         Comment("Grabbing MW and starting");
         MANAGER.grab_symbols();
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
     }
  }


Tradotto dall’inglese da MetaQuotes Ltd.
Codice originale https://www.mql5.com/en/code/56324

Istogramma colorato del MACD Istogramma colorato del MACD

L'istogramma colorato MACD è una versione migliorata del classico indicatore MACD (Moving Average Convergence Divergence), progettato per fornire un'analisi visiva più chiara e intuitiva del momentum del mercato. Questo indicatore combina le funzionalità tradizionali del MACD con un istogramma dinamico che cambia colore in base alla relazione tra la linea MACD e la linea del segnale, consentendo ai trader di identificare rapidamente le tendenze, i punti di inversione e i momenti di indecisione nel mercato.

MACD Histogram, multi-timeframe, multi-color [v03] MACD Histogram, multi-timeframe, multi-color [v03]

L'indicatore MACD con istogramma può essere applicato a qualsiasi timeframe (superiore o inferiore al timeframe del grafico corrente).

Functions to simplify work with orders Functions to simplify work with orders

Vogliamo solo pensare agli algoritmi e ai metodi, non alla sintassi e ai valori per piazzare gli ordini. Qui sono disponibili semplici funzioni per gestire le posizioni in MQL5.

RSI multi-timeframe [v03] RSI multi-timeframe [v03]

L'indicatore RSI può essere applicato a qualsiasi timeframe (superiore o inferiore al timeframe del grafico corrente).