Unisciti alla nostra fan page

Visualizzazione ottimizzata per l'output di testo del grafico di tipo console - libreria per MetaTrader 5
- Visualizzazioni:
- 48
- Valutazioni:
- Pubblicato:
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
La libreria contiene due tipi di display. Il primo, LabelsDisplay, è basato su CChartObjectLabel. Il secondo, CanvasDisplay, è basato su CCanvas. I display sono ottimizzati per la frequenza di rendering. Oltre all'Expert Advisor principale che dimostra il lavoro dei display Demo.mq5, esistono altre due varianti, CanvasVsLabelsTester.mq5, per eseguire le misurazioni esclusivamente nel tester, sui tick. E l'universale CanvasVsLabels.mq5, che esegue le misurazioni sia nel tester che sul grafico. Queste misure possono essere confrontate tra loro. Per maggiori dettagli sul confronto della velocità delle visualizzazioni, consultare il link Canvas vs Labels.
//+------------------------------------------------------------------+ //|ChartDisplayDemo.mq5 | //|Copyright 2021, © Cyberdev | //| https://www.mql5.com/en/users/cyberdev/seller | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, © Cyberdev". #property link "https://www.mql5.com/en/users/cyberdev/seller" #property version "1.00" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #include "cyberdev\ChartDisplay.mqh" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ enum OutType { otCanvas, // Tela otLabels // Etichette }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ input OutType outType = otLabels; // outType - tipo di visualizzazione input int nLines = 50; // nLinee - numero di linee sul display input bool optimizeUpdate = false; // optimiseUpdate - ottimizzazione per le etichette input int bWidth = 406; // bWidth - larghezza di visualizzazione input int lY_Dist = 14; // lY_Dist - distanza tra le linee input bool back = false; // retro - sfondo per le etichette //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ Strings * display; CChart Chart; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'esperto| //+------------------------------------------------------------------+ int OnInit() { Chart.Attach(ChartID()); Chart.ShowGrid(false); Chart.ColorBackground(C'194,231,197'); Chart.ColorBarUp(clrDodgerBlue); Chart.ColorBarDown(clrBlueViolet); Chart.ColorCandleBull(clrDodgerBlue); Chart.ColorCandleBear(clrBlueViolet); Chart.ColorForeground(clrBlack); switch (outType) { case otCanvas: display = new CanvasDisplay(); break; case otLabels: display = new LabelsDisplay(); break; default: return INIT_FAILED; } if ((outType == otLabels && back && !dynamic_cast<LabelsDisplay *>(display).createExt(nLines, 10, 10, bWidth, lY_Dist)) || !display.create(nLines, 10, 15, bWidth, lY_Dist)) return INIT_FAILED; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Funzione di deinizializzazione dell'esperto| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if (CheckPointer(display) == POINTER_DYNAMIC) delete display; Chart.Detach(); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #define concatenate(_rate) \ ("Open: " + DoubleToString(rates[_rate].open, digits) + \ "; High: " + DoubleToString(rates[_rate].high, digits) + \ "; Low: " + DoubleToString(rates[_rate].low, digits) + \ "; Close: " + DoubleToString(rates[_rate].close, digits) + ".") //+------------------------------------------------------------------+ //| Funzione tick dell'esperto| //+------------------------------------------------------------------+ void OnTick() { MqlRates rates[]; int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); static datetime time = 0; datetime cTime; static bool firstRun = true; bool triggered = false; if (CopyRates(NULL, PERIOD_CURRENT, 0, 2, rates) != 2) return; display.setText(concatenate(1)); cTime = rates[0].time; if (cTime != time) { if (!firstRun) { display.push(); display.setText(concatenate(0)); } time = cTime; firstRun = false; triggered = true; } if(outType == otLabels && optimizeUpdate) { if (triggered) display.update(); else dynamic_cast<LabelsDisplay *>(display).updateOne(); } else display.update(); } //+------------------------------------------------------------------+
Per aggiornare la riga superiore, è necessario chiamare il metodo setText della classe utilizzata. Per spostare il testo sulla riga sottostante, viene richiamato il metodo push della classe utilizzata. Per visualizzare il testo aggiunto/aggiornato sul display, utilizzare il metodo update di una qualsiasi delle classi. Oltre a questo metodo, la classe LabelsDisplay ha un metodo aggiuntivo updateOne, che può accelerare la visualizzazione di oltre 2 volte. Viene richiamato solo quando è necessario aggiornare la riga superiore. Se è stato chiamato il metodo push, dopo di esso si deve chiamare il metodo update invece di updateOne .
Parametri di ingresso
- outType - tipo di visualizzazione
- nRighe - numero di righe sul display
- optimiseUpdate -ottimizzazione per le etichette
- bWidth - larghezza del display
- lY_Dist - distanza tra le linee
- back - sfondo per le etichette
Con outType è possibile selezionare il tipo di visualizzazione tra i valori Canvas o Labels. La modifica nLines imposta il numero di righe che verranno salvate dopo lo scorrimento con il metodo push. Il parametro optimiseUpdate consente l'aggiornamento economico di una sola riga, se il metodo push non è stato chiamato e quindi il resto delle righe non deve essere aggiornato (vedere sopra). Con bWidth è possibile impostare la larghezza del display (rilevante per Canvas ed Etichette che utilizzano lo sfondo). Con il parametro lY_Dist è possibile ottenere la dimensione dei caratteri desiderata. La dimensione del carattere viene presa da lY_Dist , a cui viene sottratta la parte impostata dal coefficiente fDec, che consente di modificare l'altezza reale della linea, non la dimensione del carattere, senza tenere conto della distanza tra le linee. Il parametro back abilita lo sfondo in modalità Etichette.
Pertanto, è possibile visualizzare le informazioni nel grafico in 5 modalità diverse.
- Tela
- Etichette
- Etichette con testoottimizzato
- Etichette con sfondo su tela
- Etichette con sfondo, più, ottimizzazione
L'utilizzo di uno sfondo in modalità outType: Labels offre circa lo stesso carico dell'utilizzo di altri oggetti grafici aggiuntivi. In altre parole, aumenta leggermente il tempo necessario per l'output del testo sul display.
Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/33898

Esecuzioni multiple/ottimizzazioni in Tester.

Costruire una retta mobile con un polinomio di 4 gradi. Estrapola la sinusoide e il suo assiale. Le linee costruite rimuovono un valore a ogni barra e viene costruita una linea mobile di valori estrapolati che non viene ridisegnata.

Pannello basato sulla classe CDialog. Lavora sul simbolo corrente. Eliminazione, impostazione di Take Profit, impostazione di Breakeven su un gruppo di posizioni

Strategia basata sull'indicatore standard iCHO (Chaikin Oscillator, CHO) e sull'indicatore personalizzato 'CCIDualOnMA'.