English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
preview
Indicatori multipli su un grafico (Parte 04): Passiamo a un Expert Advisor

Indicatori multipli su un grafico (Parte 04): Passiamo a un Expert Advisor

MetaTrader 5Trading |
278 5
Daniel Jose
Daniel Jose

Introduzione

Nei miei articoli precedenti, ho spiegato come creare un indicatore con più finestre secondarie, cosa che diventa molto utile quando si utilizzano indicatori personalizzati. Sarete d’accordo sul fatto che sia stato piuttosto facile farlo. Quando però proviamo ad applicare la stessa funzionalità ad un Expert Advisor, le cose diventano un po' più complicate poiché non disponiamo degli strumenti che abbiamo utilizzato nel caso dell’indicatore personalizzato. A questo punto la programmazione diventa essenziale. Saper scrivere il codice corretto per creare una sottofinestra è fondamentale. Anche se questo compito non è così facile, sapere come inserire una sottofinestra in un EA non richiede una grande quantità di codice, ma solo una certa conoscenza del funzionamento di MQL5.


Pianificazione

Abbiamo già il nostro indicatore personalizzato funzionante, ovvero la nostra classe di oggetti è già funzionante e, dal momento che si tratta di una classe di oggetti, possiamo trasferirla agevolmente ad altri modelli. Nel caso di un EA, la semplice dichiarazione e il tentativo di utilizzare la classe nel nostro EA non farà funzionare le cose come nel nostro indicatore personalizzato e il motivo è che, stavolta, non abbiamo funzionalità di sottofinestra. Vediamo come risolvere. "Cosa succederebbe se utilizzassimo un indicatore personalizzato già compilato e funzionante e lo richiamassimo attraverso l'EA, utilizzando il comando iCustom? Così potrebbe funzionare, dato che la sottofinestra non è necessaria. Il comando sarebbe del seguente tipo:

#property copyright "Daniel Jose"
//+------------------------------------------------------------------+
input string user01 = "";                //Used indicators
input string user02 = "";                //Assets to follow
//+------------------------------------------------------------------+
int OnInit()
{
        int m_handleSub;

//... Expert Advisor code ...

        if ((m_handleSub = iCustom(NULL, 0, "Chart In SubWindows\\Chart In SubWindow.ex5", user01, user02)) == INVALID_HANDLE) return INIT_FAILED;
        if (!ChartIndicatorAdd(ChartID(), 0, m_handleSub)) return INIT_FAILED;
//... Expert Advisor code ...

        ChartRedraw();
        
        return(INIT_SUCCEEDED);
}
//...The rest of the Expert Advisor code ...

Questo semplice frammento di codice è in grado di caricare il nostro indicatore personalizzato tuttavia non funzionerà correttamente perché non abbiamo una sottofinestra. In questo caso, una volta che il codice sarà stato eseguito nell'EA, quest’ultimo applicherà il nostro indicatore direttamente alla finestra principale. Questo comporta che il nostro grafico sarà nascosto dai template caricati dall'indicatore, il che non è certamente il risultato che desideriamo.

Il problema da risolvere è quindi come creare una sottofinestra per utilizzare il nostro indicatore già funzionante. Potremmo chiederci il perché di creare una sottofinestra per il successivo lancio del nostro indicatore. In effetti non ha senso; è meglio aggiungere la funzionalità direttamente al nostro EA e superare così le eventuali limitazioni.

Partendo da questo presupposto, dobbiamo eseguire diverse operazioni:

Compito. Scopo
1 => Creare un indicatore generico. Creare e utilizzare il comando iCustom senza sporcare il grafico.
2 => Includere in qualche modo questo indicatore nell'EA.  Rendere possibile il trasferimento dell'Expert Advisor con tutte le sue funzionalità senza problemi.
3 => Generare una classe oggetto generale per la sottofinestra  Aggiungere sottofinestre tramite l'EA
4 => Ottenere la classe C_TemplateChart legata alla classe window. Gestire il contenuto delle sottofinestre senza modificare nulla nel codice già in esecuzione.

Anche se potrebbe sembrare difficile, vedrete che le difficoltà sono risolvibili in modo molto semplice. Affrontiamo quindi i singoli punti.


Implementazione: Creazione di un indicatore generico

Per risolvere questa parte del nostro compito creando un codice indicatore personalizzato, completamente pulito ma funzionale. Il codice in questo caso sarà simile al seguente:

#property copyright "Daniel Jose"
#property version   "1.00"
#property description "This file only enables support of indicators in SubWin."
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
int OnInit()
{
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
        return rates_total;
}
//+------------------------------------------------------------------+

Dobbiamo solo salvare questo file come SubSupport.mq5. Quest’ultimo però non lo troveremo insieme agli altri indicatori, bensì lo sposteremo nella directory RISORSA del nostro Expert Advisor. Di conseguenza, la struttura dei file apparirà come nell'immagine seguente:


C'è una buona ragione per questo, ma mettiamola da parte per ora. Passiamo ora al compito successivo.


Implementazione: Includere l'indicatore generale nell'EA

A tal fine, è necessario aggiungere il seguente codice all'inizio del nostro EA.

//+------------------------------------------------------------------+
#define def_Resource "Resources\\SubSupport.ex5"
//+------------------------------------------------------------------+
#resource def_Resource
//+------------------------------------------------------------------+

In questo modo, il codice compilato dell'indicatore generale verrà incluso nel nostro EA. Una volta effettuata questa operazione, sarà cancellato dall'indicatore generale il file .ex5, perché non più necessario. A questo punto è necessario prestare attenzione al fatto che se il file SubSupport.ex5 non viene trovato al momento della compilazione del codice dell'EA, il compilatore utilizzerà automaticamente il codice dell'indicatore generale SubSupport. mq5e aggiungerà il nuovo file eseguibile al nostro Expert Advisor. Quindi, se si modifica il file SubSupport.mq5 e si volesse aggiungere le modifiche all'Expert Advisor, è necessario cancellare il file SubSupport.ex5altrimenti le modifiche non verranno aggiunte.

Questo dettaglio è importante: a volte è necessario sapere come aggiungere le modifiche appena implementate alla risorsa.

L'indicatore generale, a questo punto, fa parte dell'Expert Advisor, quindi passiamo al compito successivo.


Implementazione Creazione di una classe di oggetti sottofinestra

Anche questa parte è semplice. Prima di procedere alla codifica, dobbiamo definire alcuni punti: di quali caratteristiche abbiamo realmente bisogno in questa classe? Inizialmente ho deciso di utilizzare quanto segue:

Funzione Descrizione
Init Aggiungere sottofinestre tramite l'EA
Close Aggiungere sottofinestre tramite l'EA

Queste funzioni non saranno testate, quindi suppongo che saranno richiamate solo una volta durante la vita dell'EA. Il nostro EA, però, sarà sviluppato ulteriormente pertanto è bene riflettere su come renderlo ancora più pratico in futuro. In quest’ottica, creiamo una nuova classe di oggetti chiamata C_Terminale - questa classe supporterà alcune elementi relativi al terminale grafico. Ne sapremo di più in seguito. Esaminiamo l'ultimo compito, poiché non c'è modo di implementare la soluzione in modo parziale.


Implementazione: Eredità della classe C_TemplateChart

Quando in passato ho deciso di creare qualcosa di nuovo utilizzando l'OOP (Programmazione orientata agli oggetti), l’ho fatto perché consapevole del fatto che l'utilizzo di questo approccio presentava seri vantaggi, tra cui la sicurezza e l'ereditarietà. Esiste anche il polimorfismo, ma lo useremo più avanti quando creeremo un sistema di ordini incrociati. In questo caso particolare utilizzeremo uno dei vantaggi dell'OOP: l'ereditarietà. C_TemplateChart è già una classe completamente funzionale. In questo caso, non vorremmo avere il problema di dover riprogrammare tutto da capo o rischiare di aggiungere codice alla classe, impedendo che questa possa essere utilizzata in altri luoghi. La soluzione è utilizzare l'ereditarietà, che consente di aggiungere nuovo codice o funzione senza modificare affatto il codice originale.

L'uso dell'ereditarietà presenta una serie di vantaggi, inclusi i seguenti: il codice già testato rimane tale; la complessità cresce senza un corrispondente aumento della dimensione del codice; solo le nuove funzionalità devono davvero essere testate; ciò che non cambia viene semplicemente ereditato, fornendo stabilità. In altre parole, le cose migliorano con il minimo sforzo e con la massima sicurezza. Per comprendere meglio, diamo un'occhiata alla documentazione:

La classe nonno è la classe più elementare in cui abbiamo il livello più basso di manipolazione dei dati. Quando però la classe genitore eredita qualcosa dal nonno, tutte gli elementi dichiarati come pubblici nella classe nonno possono essere visti e utilizzati dalla classe genitore. Possiamo anche aggiungere nuovi elementi alla classe genitore, senza che questo influisca su ciò che è stato ereditato ed è supportato dall'ereditarietà. Se la classe madre è già finita e funzionante e vogliamo estenderla senza modificare nulla nelle classi sottostanti, creiamo una classe figlia, che avrà tutte le caratteristiche delle classi precedenti. E’ anche possibile intervenire sul funzionamento delle cose, e questa è l’aspetto interessante dell'ereditarietà: le modifiche infatti non influiranno sulle altre classi. C'è una limitazione da segnalare: in C++, che consente l'ereditarietà multipla, un figlio può ereditare funzioni sia dal padre che dalla madre ma questo non è possibile in MQL5. Si può però beneficiare comunque dell'eredità. Di seguito è riportato un esempio di eredità multipla:

Ok, ma come farlo in MQL5? Come dichiarare un'eredità per poterne trarre vantaggio? Il modo più preciso per comprenderlo è leggere i contenuti della programmazione orientata agli oggetti (OOP). Qui andremo dritti al punto. L'ereditarietà sarà realizzata con le seguenti linee:

#include "C_TemplateChart.mqh"
//+------------------------------------------------------------------+
class C_SubWindow : public C_TemplateChart
{
// ... Class code
};

Si noti che la classe C_SubWindow erediterà pubblicamente la classe C_TemplateChart il che significa che ora possiamo usare la classe C_Sottofinestra per accedere alle funzionalità della classe C_TemplateChart.

Nel frammento di codice sopra riportato, ho evidenziato una cosa. Si noti che è tra virgolette ( " ) e non tra parentesi angolari ( < > ) come di consueto. Perché l'ho fatto? Come il linguaggio C++, anche l'MQL5 ha alcune caratteristiche molto interessanti, ma alcune confondono chi sta iniziando a imparare l'arte della programmazione. Quando inseriamo un file di intestazione tra parentesi angolari ( < > ), intendiamo un percorso assoluto: in questo caso il compilatore seguirà esattamente il percorso specificato. Quando invece usiamo le virgolette (come abbiamo fatto in questo caso), il compilatore userà un percorso relativo o, per essere più precisi, partirà dalla directory corrente in cui si trova il file di lavoro. Può sembrare strano ma a volte capita di avere lo stesso nome per file che hanno contenuti diversi e si trovano in directory diverse, ma si vuole comunque fare riferimento alla directory corrente. E’ per questo motivo che si usano le virgolette.

Le due funzioni che intendiamo utilizzare in precedenza, INIT e CLOSE, sono mostrate di seguito:

//+------------------------------------------------------------------+
bool Init(void)
{
        if (m_handleSub != INVALID_HANDLE) return true;
        if ((m_handleSub = iCustom(NULL, 0, "::" + def_Resource)) == INVALID_HANDLE) return false;
        m_IdSub = (int) ChartGetInteger(Terminal.Get_ID(), CHART_WINDOWS_TOTAL);
        if (!ChartIndicatorAdd(Terminal.Get_ID(), m_IdSub, m_handleSub)) return false;
                
        return true;
}
//+------------------------------------------------------------------+
void Close(void)
{
        ClearTemplateChart();
        if (m_handleSub == INVALID_HANDLE) return;
        IndicatorRelease(m_IdSub);
        ChartIndicatorDelete(Terminal.Get_ID(), m_IdSub, ChartIndicatorName(Terminal.Get_ID(), m_IdSub, 0));
        ChartRedraw();
        m_handleSub = INVALID_HANDLE;
}
//+------------------------------------------------------------------+

Il codice è molto semplice e breve. Come vedete, c'è un particolare che richiede attenzione. Notate la parte evidenziata. Dovete stare attenti a non commettere errori nell'aggiungere questa parte, perché se non la lasciate così com'è, il file eseguibile SubSupport.ex5 che abbiamo chiesto di aggiungere all'EA non sarà visibile all'interno dell'EA, bensì all'esterno. Per maggiori dettagli, potete leggere Risorse. In pratica, se si utilizza ( :: ), si indica che l'EA deve utilizzare la risorsa interna disponibile al suo interno. Se invece indichiamo solo il nome della risorsa, l'EA la cercherà all'interno della directory MQL5 e se il file non dovesse esistere nella posizione specificata, la funzione fallirebbe anche se il file fosse stato aggiunto come risorsa EA.

A questo punto, una volta caricata la risorsa, controlliamo il numero di sottofinestre presenti e aggiungiamo un indicatore a quella sottofinestra.

Di seguito è possibile vedere cosa fa il codice:

input string user01 = "";               //Used indicators
input string user02 = "";               //Assets to follows
//+------------------------------------------------------------------+
int OnInit()
{
        int m_handleSub;

//...   

        if ((m_handleSub = iCustom(NULL, 0, "Chart In SubWindows\\Chart In SubWindow.ex5", user01, user02)) == INVALID_HANDLE) return INIT_FAILED;
        if (!ChartIndicatorAdd(ChartID(), (int) ChartGetInteger(ChartID(), CHART_WINDOWS_TOTAL), m_handleSub)) return INIT_FAILED;

//...

        ChartRedraw();
        
   return(INIT_SUCCEEDED);
}
//...The rest of the Expert Advisor code ...

Entrambi i codici funzioneranno allo stesso modo, ma la versione della classe oggetto ci consentirà di aggiungere altre cose nel tempo, dato che la versione mostrata sopra è quella consolidata e non cambierà. Entrambe le versioni fanno la stessa cosa: creano una sottofinestra dell'EA e vi inseriscono tutti gli indicatori personalizzati creati in precedenza. Prestate attenzione alle modifiche apportate al codice rispetto alla forma che aveva all'inizio dell'articolo: le modifiche sono evidenziate in colore.


Conclusione

È molto interessante la scelta del percorso da utilizzare per raggiungere i nostri obiettivi. A volte, di fronte alle difficoltà pensiamo di non poterli raggiungere ma, con un po' di pazienza e dedizione, alla fine possiamo superare ostacoli che all'inizio sembravano insormontabili. In questo articolo vi ho mostrato come sia possibile estendere le funzionalità di una classe senza doverla modificare, grazie all'ereditarietà. Allo stesso tempo, vi ho fatto vedere come aggiungere gli indicatori ai grafici in modo che funzionino come già testati. Aggiungiamo il programma ex5 all'interno del nostro EA e lo utilizziamo senza dover eseguire il porting dell'ex5 originale, semplicemente caricando l'EA.

Il file allegato contiene tutti i miglioramenti sviluppati finora, ma presto ci saranno cose ancora più interessanti in questo codice. 😁👍


Tradotto dal portoghese da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/pt/articles/10241

File allegati |
Ultimi commenti | Vai alla discussione (5)
Mateus Cerqueira Lopes
Mateus Cerqueira Lopes | 25 feb 2022 a 17:50
MetaQuotes:

Nuovo articolo Indicatori multipli su un grafico (Parte 04): Iniziare con gli EA è stato pubblicato:

Autore: Daniel Jose

Ciao Daniel, ho seguito i tuoi articoli, ma cosa mi dici della parte 03?
Daniel Jose
Daniel Jose | 26 feb 2022 a 13:28
Mateus Lopes #:
Ciao Daniel, ho seguito i tuoi articoli, ma per quanto riguarda la Parte 03?

C'è stato un piccolo problema al momento di richiedere il rilascio per la pubblicazione, ma ho già autorizzato la pubblicazione della Parte 03, sarà presto disponibile anche questa, questo problema è stato causato più dal numero di articoli che ho già inviato ... attualmente ci sono altri 15 articoli da analizzare, tutti coinvolti nello sviluppo di questo EA e con ognuno di essi le cose diventano sempre più complesse .... ma vi ringrazio per aver seguito la serie ... aspettatevi un sacco di novità a partire dall'articolo 05, da quel momento in poi ne varrà davvero la pena perché diventerà qualcosa di grande, questi primi articoli sono solo per introdurvi a ciò che verrà...😁👍

CapeCoddah
CapeCoddah | 13 mag 2022 a 13:00

Ciao Daniel,

Ho dei problemi con gli indicatori multicolore e i tuoi articoli, che mi piacciono, indicano che potresti conoscere la soluzione.

Vorrei produrre una funzione che imposti tutti gli attributi dell'indicatore senza utilizzare le opzioni #property, ad esempio #property indicator_color1 clrCrimson,clrWhite,clrLime

Nel programma di prova qui sotto, ho riscontrato che con la #property indicator_color1 clrCrimson,clrWhite,clrLime inclusa, il programma funziona correttamente, mentre se la commento, il programma non funziona correttamente.In questo caso sembra che vengano tracciati solo alcuni dei punti di dati, come se si utilizzasse un time frame "più alto" o si saltassero alcuni punti di dati. Sospetto che la direttiva property color stia impostando altri attributi che non ho identificato quando vengono specificati più colori.

Il secondo problema è che ovviamente non capisco i dettagli e i requisiti dell'utilizzo di grafici multicolore. Ho cercato nella documentazione e non ho trovato alcun articolo che fornisca una panoramica su come utilizzare gli indicatori multicolore. Mentre il primo grafico cambia colore correttamente, il secondo, che traccia i minimi, non cambia colore secondo la mia chiamata di funzione. Questo grafico richiede tutte e tre le proprietà: type2, color2 e width2 per funzionare correttamente. Sono anche perplesso sul motivo per cui le dichiarazioni delle proprietà utilizzano 2 invece di 3. Ho utilizzato l'indicatore Laguerre Adaptive Filter di Mladen per identificare che gli indicatori di proprietà utilizzano il numero della trama, 2, e non il numero dell'indicatore 3 per visualizzare correttamente.

Qualsiasi suggerimento, riferimento o aiuto sarà molto apprezzato.

Saluti, CapeCoddah

Daniel Jose
Daniel Jose | 21 mag 2022 a 17:18
CapeCoddah indicatori multicolore. Mentre il primo grafico cambia colore correttamente, il secondo, che traccia i punti bassi, non cambia colore secondo la mia chiamata di funzione. Questo grafico richiede tutte e tre le proprietà: type2, color2 e width2, per funzionare correttamente. Sono anche perplesso sul motivo per cui le dichiarazioni delle proprietà utilizzano il numero 2 invece del numero 3. Ho utilizzato l'indicatore Laguerre Adaptive Filter di Mladen per identificare che gli indicatori delle proprietà utilizzano il numero 2 del grafico e non il numero 3 per essere visualizzati correttamente.

Qualsiasi suggerimento, riferimento o aiuto sarà molto apprezzato.

Cordiali saluti, CapeCoddah

Se sei un po' confuso, posso capirlo... ma tutta la confusione sta nel fatto che non stai osservando i dettagli del tuo codice. Cercherò di spiegare alcuni dettagli che sono nel commento, poi parlerò un po' del tuo codice....

Il primo punto è che si può anche produrre un indicatore multicolore senza usare #property indicator_colorN ma per l'utente e anche per voi è più pratico, più sicuro e più semplice capire e modificare il codice, perché tutto quello che dovete fare è andare nelle proprietà è modificare i colori presenti lì, e per l'utente è più semplice perché dovrà solo scegliere il colore da modificare e fare la modifica, questo nella finestra standard che MT5 crea per gli indicatori. In qualche modo si sta già facendo la cosa giusta quando si usa il comando PlotIndexSetInteger per generare i cambiamenti di colore, e questo è il modo in cui non si usa #property indicator_colorN, ma quando si usano le proprietà spesso non ha senso usare il comando PlotIndexSetInteger per impostare altri colori, Questo perché la cosa può essere più complicata da mantenere e più confusa per l'utente, dato che potrebbe non capire bene cosa lo standard di colore sta cercando di dire, anche se il codice è vostro e sarete gli unici a usare l'indicatore, non ha molto senso, a meno che in rari casi non creiate un modello di colore dinamico.

Ora parliamo del secondo punto: Il problema in questo caso è che state confondendo il numero di cose che l'indicatore traccerà ( 2 per 2 linee ) con le proprietà dell'oggetto ( in questo caso linea ) e per la linea da tracciare, in realtà è necessario dichiarare almeno 3 informazioni, che sono TypeN, ColorN, WidthN, dove la N indica il numero dell'oggetto, con la pratica e il tempo finirete per capire queste piccole differenze tra le proprietà dell'indicatore e le proprietà degli oggetti che utilizza... Non arrendetevi... continuate a studiare e presto le cose saranno più chiare... 😁👍

Ora vediamo un po' del vostro codice... Non vi mostrerò esattamente come correggerlo (se lo facessi non sarebbe divertente... .... 😁👍✌ ), ma voglio che prestiate attenzione al fatto seguente, che è importante:

      Buf=Set_IndexBuffer5(Buf, dataHi, INDICATOR_DATA , DRAW_COLOR_LINE , 4 ,
"High" , clrYellow , clrWhite , clrDodgerBlue );
      Buf=Set_IndexBuffer5(Buf, dataHic, INDICATOR_COLOR_INDEX );
      Buf=Set_IndexBuffer5(Buf, dataLo, INDICATOR_DATA , DRAW_COLOR_LINE , 4 ,
"Low" , clrYellow , clrWhite , clrDodgerBlue );
      Buf=Set_IndexBuffer5(Buf, dataLoc, INDICATOR_COLOR_INDEX );

Notate che ho segnato due cose nel vostro codice... ora vediamo cosa succede quando viene riprodotto sul grafico....


Vede che solo una delle etichette è quella dichiarata nel codice, solo la HIGH .... e la LOW ?!?! dov'è ?!?! questo è il primo punto che dovrebbe correggere, perché il fatto che l'etichetta LOW non venga mostrata indica che il modello di colore che viene utilizzato è quello dichiarato in #property indicator_color2, cioè, si ha un fallimento a questo punto, se si tenta di rimuovere le proprietà dell'indicatore 2 che creano effettivamente la linea LOW, anche mantenendo il resto del codice, la linea HIGH verrà tracciata, ma la linea LOW no....perché?!?! perché in effetti non state definendo le informazioni necessarie per tracciare la linea LOW, questo dinamicamente tramite l'uso della chiamata PlotIndexSetInteger... sembra strano ... ma questo è ciò che sta accadendo ....

Quando si riesce a risolvere questo problema, se si vuole davvero utilizzare il modo dinamico di dichiarare i dati dell'oggetto riga utilizzando PlotIndexSetInteger, si potranno eliminare i comandi di compilazione #property indicator_color dalla scena, poiché i dati necessari saranno impostati dinamicamente, ma se non si vuole fare questo sforzo, va bene....

Ora voglio che guardiate l'immagine qui sopra e la confrontiate con i colori che state usando in #property indicator_color ... osservate questi colori con molta attenzione .... se lo fate noterete qualcosa di strano .... ancora una volta non vi dirò di non perdere il divertimento, ma cercate di usare colori diversi, senza ripeterne nessuno... quando li ripetete diventa più difficile capire dove sia l'errore... 😁👍

Ora un ultimo dettaglio: Il fatto che tu pensi che stia tracciando solo alcuni punti e saltandone altri può essere dovuto a due motivi: Il pattern di colori non è in contrasto con lo sfondo del grafico, provate a usare colori che contrastino con lo sfondo del grafico, e il secondo, ma non credo che sia effettivamente il caso, è che potrebbe esserci un errore nell'evento OnCalcule, state restituendo -1 o il valore di i, la cosa corretta è restituire rates_total, quindi cambiate questo nel codice per evitare problemi futuri...

CapeCoddah
CapeCoddah | 26 mag 2022 a 13:24

Ciao Daniel,

Mi sono confuso: pensavo che le caratteristiche del disegno fossero definite utilizzando le specifiche del buffer come in MQ4 mentre, almeno per le specifiche DRAW_COLOR..., le caratteristiche del disegno sono definite utilizzando l'identificatore di trama sequenziale. Inoltre, la proprietà indicator_colorX ha in realtà due funzioni, la prima per contare e impostare il numero di colori e la seconda per impostare ciascun colore specificato nella posizione corretta dell'array.Allego due file: Color Test, che ora funziona correttamente anche se necessita di ulteriori perfezionamenti, e MACD Original2_1 di MLADEN, leggermente modificato. Il programma di Mladen è interessante in quanto ha definito due tracciati ma utilizza solo un buffer di indici di colore.


Grazie per l'assistenza

Scopriamo come creare un sistema di trading con l'indicatore RSI Scopriamo come creare un sistema di trading con l'indicatore RSI
In questo articolo, vi parlerò di uno degli indicatori più popolari e utilizzati nel mondo del trading, ovvero l’RSI. Vedremo insieme come mettere in piedi un sistema di trading con questo indicatore.
Un'analisi del motivo per cui gli Expert Advisor falliscono Un'analisi del motivo per cui gli Expert Advisor falliscono
Questo articolo presenta un'analisi di dati del mercato forex per comprendere meglio perché gli Expert Advisor registrano buone prestazioni in alcuni periodi e deludenti in altri.
Indicatori multipli su un grafico (Parte 05): Trasformiamo MetaTrader 5 in un sistema RAD (I) Indicatori multipli su un grafico (Parte 05): Trasformiamo MetaTrader 5 in un sistema RAD (I)
Tante persone non sanno programmare ma sono molto creative e hanno grandi idee. Purtroppo però, la mancanza di conoscenze di programmazione impedisce loro di realizzare queste idee. Vediamo insieme come creare un Chart Trade utilizzando la piattaforma MetaTrader 5 stessa, come se fosse un IDE.
Scopri come creare un sistema di trading con l’indicatore Momentum Scopri come creare un sistema di trading con l’indicatore Momentum
Nel mio precedente articolo ho parlato dell'importanza di identificare la tendenza di mercato, ovvero la direzione dei prezzi. In questo articolo esaminerò uno dei indicatori tecnici più importanti: l'indicatore Momentum. Vedremo insieme come progettare un sistema di trading basato sul Momentum.