Unisciti alla nostra fan page
- Visualizzazioni:
- 144
- Valutazioni:
- Pubblicato:
-
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
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]
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
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]
L'indicatore RSI può essere applicato a qualsiasi timeframe (superiore o inferiore al timeframe del grafico corrente).