Programmazione per MarvelChart
E’ possibile integrare in MarvelChart nuovi Indicatori e Trading System, usando le procedure guidate fornite, oppure realizzando delle Class Libraries .NET Core 8.0 in modo autonomo e copiandole nella cartella dei documenti di MarvelChart dove l’applicazione ricerca i file delle estensioni. MarvelChart fornisce una procedura guidata per creare nuovi Indicatori ed una per creare nuovi Trading System. E’ inoltre possibile importare od esportare indicatori e trading system, sia in forma di codice sorgente, che in forma di file compilato binario.
Indicatori
MarvelChart permette di creare indicatori personalizzati tramite l’utilizzo di Class Libraries .NET Core 8.0. Ogni indicatore è costituito da una classe .NET, che per essere individuata come tale deve derivare dalla classe Indicator
fornita da MarvelChart nel namespace NetScript
. E’ pertanto possibile creare nuovi indicatori sia seguendo la procedura guidata integrata in MarvelChart, ma anche realizzando una Class Library in modo autonomo, posizionando l’assembly risultante nella cartella:
Procedura guidata per nuovi Indicatori
La procedura guidata per la creazione di nuovi Indicatori è composta da una finestra che richiede le informazioni essenziali relative al nuovo indicatore.
La finestra presenta nella parte superiore i campi per inserire i valori che identificano il nuovo indicatore, mentre nella parte centrale è divisa in diverse sezioni. Le informazioni che identificano il nuovo indicatore sono costituite dai campi:
Class Name - Nome della classe del nuovo indicatore, deve essere un testo univoco;
Indicator Name - Nome del nuovo indicatore, che rappresenta il testo che sarà visibile nel menù Indicators di MarvelChart;
Folder Name - Nome della cartella all’interno della quale aggiungere la voce del nuovo indicatore nel menù Indicators di MarvelChart;
Indicator Short Name - Nome abbreviato dell’indicatore, in genere viene usata una sigla come nome abbreviato, come ad esempio SMA come abbreviazione di Simple Moving Average. Questo nome viene usato quando l’indicatore viene aggiunto nelle intestazioni dei pannelli;
Overlap - Casella di spunta, se attiva l’indicatore verrà aggiunto in sovrapposizione alla serie storica sullo stesso pannello del Chart, mentre se spenta l’indicatore verrà aggiunto in un pannello a sé stante sul Chart.
Le sezioni nella parte centrale della finestra raggruppano le impostazioni relative a:
Inputs - Parametri di ingresso dell’indicatore;
Child Indicators - Eventuali indicatori e funzioni di calcolo che il nuovo indicatore usa nella procedura di calcolo. Ad esempio, l’indicatore Bollinger Bands utilizza come Child Indicators Moving Average e Standard Deviation;
Plots - Uscite dell’indicatore;
Strip Lines - Uscite dell’indicatore con valore costante, che in genere possono essere utilizzate per visualizzare valori come OverBought o OverSold.
Una volta completate tutte le impostazioni, cliccando sul pulsante Create File and Open in Editor, MarvelChart creerà il nuovo file dell’indicatore in linguaggio C# ed aprirà l’ambiente di sviluppo dove sarà possibile scriverne il codice.
Inputs
In questa sezione possono essere definiti i parametri di ingresso dell’indicatore. Per ogni parametro di ingresso è necessario definire nella tabella i seguenti valori:
Variable Name - Nome della variabile usata all’interno del codice del nuovo indicatore per contenere il valore del parametro di ingresso. Deve essere un testo univoco all’interno dell’indicatore;
Name - Nome visualizzato nelle finestre di MarvelChart per individuare il parametro di ingresso dell’indicatore;
Type - Casella a discesa dove selezionare il tipo di dati associato al parametro di ingresso;
Default Value - Valore di default del parametro di ingresso, automaticamente assegnato alla corrispondente variabile quando l’indicatore viene aggiunto al Chart.
Child Indicators
In questa sezione possono essere definiti i Child Indicators, cioè gli indicatori e le relative funzioni di calcolo che il nuovo indicatore che si sta creando utilizzerà nel proprio algoritmo. Per ogni Child Indicator è necessario definire nella tabella i seguenti valori:
Indicator Type - Casella a discesa dove selezionare il tipo di Child Indicator che si intende utilizzare nel calcolo del nuovo indicatore;
Variable Name - Nome della variabile associata al Child Indicator. Deve essere un testo univoco all’interno dell’indicatore;
Plots
Nella sezione Plots si possono definire i valori di uscita del nuovo indicatore. Per ogni Plot è necessario definire nella tabella i seguenti valori:
Variable Name - Nome della variabile associata all’uscita del nuovo indicatore. Deve essere un testo univoco all’interno dell’indicatore;
Alias - Nome Alias dell’uscita. Quando il nuovo indicatore viene utilizzato come Child Indicator all’interno di altri indicatori, tramite l’Alias è possibile accedere rapidamente ai valori calcolati per l’uscita;
Name - Nome dell’uscita, è il testo visualizzato nelle finestre di MarvelChart per individuare l’uscita;
Color - Colore di default dell’uscita. Può essere vuoto, nel qual caso MarvelChart assegnerà automaticamente un colore quando l’indicatore viene aggiunto al Chart;
Line Weight - Spessore o dimensione della linea, dell’istogramma o dei punti dell’uscita;
Style - Casella a discesa tramite la quale selezionare lo stile di disegno dell’uscita. Le alternative disponibili sono:
Solid - Linea continua;
Dash - Linea tratteggiata;
Dot - Linea punteggiata;
DashDot - Linea tratteggiata e punteggiata;
DashDotDot - Linea tratteggiata e punteggiata, composta da un tratteggio e due punti;
Point - Punto;
Histogram - Istogramma verticale disegnato a partire dal valore zero dell’asse Y del pannello del chart;
PointToPoint - Linea che congiunge due punti non nulli, ma che possono essere anche non consecutivi.
Strip Lines
Le Strip Lines sono molto simili ai Plots, ma si distinguono per il fatto che le Strip Lines hanno un unico valore costante per tutti i punti del Chart, mentre i Plots possono avere un valore diverso per ogni punto del Chart. Per ogni Strip Line è necessario definire nella tabella i seguenti valori:
Variable Name - Nome della variabile associata alla Strip Line del nuovo indicatore. Deve essere un testo univoco all’interno dell’indicatore;
Name - Nome della Strip Line, è il testo visualizzato nelle finestre di MarvelChart per individuare la Strip Line;
Default Value - Valore di default della Strip Line, automaticamente assegnato alla corrispondente variabile quando l’indicatore viene aggiunto al Chart;
Color - Colore di default della Strip Line. Può essere vuoto, nel qual caso MarvelChart assegnerà automaticamente un colore quando l’indicatore viene aggiunto al Chart;
Line Weight - Spessore o dimensione della linea, dell’istogramma o dei punti della Strip Line;
Style - Casella a discesa tramite la quale selezionare lo stile di disegno della Strip Line. Le alternative disponibili sono:
Solid - Linea continua;
Dash - Linea tratteggiata;
Dot - Linea punteggiata;
DashDot - Linea tratteggiata e punteggiata;
DashDotDot - Linea tratteggiata e punteggiata, composta da un tratteggio e due punti;
Point - Punto;
Histogram - Istogramma verticale disegnato a partire dal valore zero dell’asse Y del pannello del chart;
PointToPoint - Linea che congiunge due punti non nulli, ma che possono essere anche non consecutivi.
Metodi della classe Indicator
Nella creazione di nuovi indicatori è generalmente sufficiente implementare tramite override solo due metodi della classe Indicator
, OnCreate
e OnCalculate
.
OnCreate
public virtual void OnCreate(IScriptData data, IVariablesFactory variablesFactory, IPlotFactory plotFactory)
Questo metodo viene richiamato da MarvelChart quando l’indicatore viene aggiunto al Chart, o comunque quando è necessario inizializzare una nuova istanza dell’indicatore. Può essere utilizzato per inizializzare variabili, Inputs (in particolare le serie storiche usate negli Inputs), Plots, Strip Lines, Child Indicators ed in genere qualsiasi altro oggetto utilizzato nell’indicatore che necessiti di inizializzazione. Il metodo ha i parametri:
data
- Contiene i dati di lavoro dell’indicatore, come ad esempio le serie storiche ed il simbolo del Chart;variablesFactory
- Utilizzato per inizializzare variabili che contengono serie di dati;plotFactory
- Utilizzato per inizializzare plots e strip lines;
Inizializzazione delle variabili
Se nell’indicatore sono necessarie variabili che memorizzano i valori barra per barra, è possibile utilizzare oggetti di tipo IVariableSeries<T>
, inizializzandole nel metodo OnCreate
, come nell’esempio seguente:
this.m_variable = variablesFactory.CreateVariableSeries<double>(this);
Inizializzazione degli Inputs
Quando l’indicatore prevede degli Inputs i loro valori possono essere inizializzati nel metodo OnCreate
. E’ consigliabile inizializzare sempre gli Inputs relativi a serie storiche, come nell’esempio seguente:
if (this.Price == null) this.Price = data?.Bars?.Close;
Inizializzazione dei Plots
Tutti gli indicatori devono avere almeno un Plot, cioè un’uscita. I Plot possono essere inizializzati come nell’esempio che segue:
this.m_average = plotFactory.CreatePlot(this, "Average", null, 1, PlotStyle.Solid);
Inizializzazione delle Strip Lines
Anche le eventuali Strip Lines possono essere inizializzate nel metodo OnCreate
, ad esempio in questo modo:
this.m_overSold = plotFactory.CreateStripLine(this, "Over-Sold", null, 1, PlotStyle.Dash);
Inizializzazione dei Child Indicators
L’inizializzazione dei Child Indicators consiste semplicemente nella chiamata del costruttore della relativa classe, passando come parametro parent
il valore this
, come nell’esempio seguente:
this.m_ma = new VariableTypeMovingAverage(this);
OnCalculate
public virtual void OnCalculate(IScriptData data)
Il metodo OnCalculate
è quello che MarvelChart utilizza per calcolare i valori degli indicatori. E’ il metodo principale di ogni indicatore: l’algoritmo di calcolo deve essere implementato in questo metodo.
OnNewBar
public virtual void OnNewBar(IScriptData data)
Questo metodo viene richiamato da MarvelChart ogni volta che nella serie storica viene aggiunta una nuova barra. Normalmente non è necessario implementare un override di questo metodo, in quanto MarvelChart estende automaticamente la lunghezza delle serie di dati relative a Variabili, Plots e Child Indicators inizializzati nel metodo OnCreate
passando come parametro parent
il valore this
.
OnDestroy
public virtual void OnDestroy(IScriptsContext context)
Questo metodo viene richiamato da MarvelChart quando l’indicatore viene eliminato dal Chart o comunque quando l’istanza viene rilasciata. Normalmente non è necessario implementare un override di questo metodo, in quanto se si sono inizializzati Variabili, Plots, Strip Lines e Child Indicators tramite il metodo OnCreate
passando come parametro parent
il valore this
, tutte le relative istanza saranno automaticamente rilasciate da MarvelChart. L’implementazione di un override di questo metodo può essere necessaria nel caso sia necessario rilasciare altri oggetti inizializzati nel metodo OnCreate
.
Drawings
public Guid AddChartDrawing(ChartDrawing chartDrawing) public void DeleteChartDrawing(Guid objectId)
MarvelChart consente di aggiungere Drawings al Chart tramite codice negli indicatori. La classe Indicator
fornisce 2 metodi, uno per aggiungere un Drawing al Chart (AddChartDrawing
), l’altro per rimuoverlo (DeleteChartDrawing
). Non è necessario chiamare DeleteChartDrawing
nel metodo OnDestroy
: MarvelChart collega automaticamente i Drawings con l’indicatore che li ha aggiunti al Chart, rimuovendo l’indicatore anche i Drawings da esso creati vengono rimossi dal Chart. I Drawing sono descritti da classi, una per ogni tipo diverso di Drawing, che derivano dalla classe base ChartDrawing
. Le classi dei Drawings sono definite nel namespace NetScript.ChartDrawings
. Ogni Drawing presenta un insieme di proprietà diverso in base alle caratteristiche dello stesso. I tipi di Drawing disponibili sono:
Buy Symbol
Esempio: aggiungere un Buy Symbol al Chart.
Guid symbolId = this.AddChartDrawing(new BuySymbol());
Proprietà:
Position
- Coordinate X ed Y del Drawing;Title
- Testo da associare al Drawing.
Sell Symbol
Esempio: aggiungere un Sell Symbol al Chart.
Guid symbolId = this.AddChartDrawing(new SellSymbol());
Proprietà:
Position
- Coordinate X ed Y del Drawing;Title
- Testo da associare al Drawing.
Exit Symbol
Esempio: aggiungere un Exit Symbol al Chart.
Guid symbolId = this.AddChartDrawing(new ExitSymbol());
Proprietà:
Position
- Coordinate X ed Y del Drawing;Title
- Testo da associare al Drawing.
Label
Esempio: aggiungere una Label al Chart.
Guid symbolId = this.AddChartDrawing(new Label());
Proprietà:
Position
- Coordinate X ed Y del Drawing;Text
- Testo da associare al Drawing.TextSettings
- Impostazioni relative al testo del Drawing, quali Font, colore ed allineamento.
Horizontal Line
Esempio: aggiungere una Horizontal Line al Chart.
Guid symbolId = this.AddChartDrawing(new HorizontalLine());
Proprietà:
Price
- Coordinata Y del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore.
Vertical Line
Esempio: aggiungere una Vertical Line al Chart.
Guid symbolId = this.AddChartDrawing(new VerticalLine());
Proprietà:
X
- Coordinata X del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;FontSettings
- Impostazioni relative al Font del Drawing.
Trend Line
Esempio: aggiungere una Trend Line al Chart.
Guid symbolId = this.AddChartDrawing(new TrendLine());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore.
Info Line
Esempio: aggiungere una Info Line al Chart.
Guid symbolId = this.AddChartDrawing(new InfoLine());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;ElapsedTime
- Attiva/Disattiva il disegno del tempo intercorso tra i 2 punti di controllo della linea;ElapsedBars
- Attiva/Disattiva il disegno del numero di barre intercorse tra i 2 punti di controllo della linea;DifferenceInPercentage
- Attiva/Disattiva il disegno della differenza di valore in percentuale sull’asse Y dei 2 punti di controllo della linea;DifferenceInPoints
- Attiva/Disattiva il disegno della differenza di valore in punti sull’asse Y dei 2 punti di controllo della linea;TextSettings
- Impostazioni relative al testo del Drawing, quali Font, colore ed allineamento.
Alert Line
Esempio: aggiungere una Alert Line al Chart.
Guid symbolId = this.AddChartDrawing(new AlertLine());
Proprietà:
Price
- Coordinata Y del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Direction
- Direzione di attraverso della linea che attiva l’Alert;Enabled
- Abilita/Disabilita l’Alert.
Ray Line
Esempio: aggiungere una Ray Line al Chart.
Guid symbolId = this.AddChartDrawing(new RayLine());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore.
Extended Line
Esempio: aggiungere una Extended Line al Chart.
Guid symbolId = this.AddChartDrawing(new ExtendedLine());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore.
Lines Cross
Esempio: aggiungere un Lines Cross al Chart.
Guid symbolId = this.AddChartDrawing(new LinesCross());
Proprietà:
Position
- Punto di incrocio delle linee orizzontale e verticale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;FontSettings
- Impostazioni relative al Font del Drawing.
Ellipse
Esempio: aggiungere una Ellipse al Chart.
Guid symbolId = this.AddChartDrawing(new Ellipse());
Proprietà:
TopLeft
- Punto di controllo che rappresenta l’angolo in alto a sinistra del rettangolo nel quale l’ellisse è inscritta;BottomRight
- Punto di controllo che rappresenta l’angolo in basso a destra del rettangolo nel quale l’ellisse è inscritta;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area dell’ellisse, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Rectangle
Esempio: aggiungere un Rectangle al Chart.
Guid symbolId = this.AddChartDrawing(new Rectangle());
Proprietà:
TopLeft
- Punto di controllo che rappresenta l’angolo in alto a sinistra del rettangolo;BottomRight
- Punto di controllo che rappresenta l’angolo in basso a destra del rettangolo;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del rettangolo, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Poly Line
Esempio: aggiungere una Poly Line al Chart.
Guid symbolId = this.AddChartDrawing(new PolyLine());
Proprietà:
Points
- Elenco dei punti che costituiscono la Poly Line;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore.
Disjoint Channel
Esempio: aggiungere un Disjoint Channel al Chart.
Guid symbolId = this.AddChartDrawing(new DisjointChannel());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;ChannelHeight
- Altezza del canale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;ChannelAlpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Error Channel
Esempio: aggiungere un Error Channel al Chart.
Guid symbolId = this.AddChartDrawing(new ErrorChannel());
Proprietà:
X1
- Coordinata X del primo punto di controllo del canale;X2
- Coordinata X del secondo punto di controllo del canale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Flat Top/Bottom
Esempio: aggiungere un Flat Top/Bottom al Chart.
Guid symbolId = this.AddChartDrawing(new FlatTopBottom());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;FlatLineYValue
- Valore sull’asse Y della linea orizzontale del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;ChannelAlpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Gann Fan
Esempio: aggiungere un Gann Fan al Chart.
Guid symbolId = this.AddChartDrawing(new GannFan());
Proprietà:
Origin
- Origine del Gann Fan;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del fan, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Quadrant Lines
Esempio: aggiungere un Quadrant Lines al Chart.
Guid symbolId = this.AddChartDrawing(new QuadrantLines());
Proprietà:
X1
- Coordinata X del primo punto di controllo del canale;X2
- Coordinata X del secondo punto di controllo del canale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Parallel Channel
Esempio: aggiungere un Parallel Channel al Chart.
Guid symbolId = this.AddChartDrawing(new ParallelChannel());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;ChannelHeight
- Altezza del canale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;ChannelAlpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Pitchfork
Esempio: aggiungere un Pitchfork al Chart.
Guid symbolId = this.AddChartDrawing(new Pitchfork());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;Point3
- Punto di controllo 3 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;PitchforkAlpha
- Trasparenza dell’area del pitchfork, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Raff Regression
Esempio: aggiungere una Raff Regression al Chart.
Guid symbolId = this.AddChartDrawing(new RaffRegression());
Proprietà:
X1
- Coordinata X del primo punto di controllo del canale;X2
- Coordinata X del secondo punto di controllo del canale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Speed Lines
Esempio: aggiungere un Speed Lines al Chart.
Guid symbolId = this.AddChartDrawing(new SpeedLines());
Proprietà:
Origin
- Origine del Speed Lines;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del fan, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Tirone Levels
Esempio: aggiungere un Tirone Levels al Chart.
Guid symbolId = this.AddChartDrawing(new TironeLevels());
Proprietà:
X1
- Coordinata X del primo punto di controllo del canale;X2
- Coordinata X del secondo punto di controllo del canale;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Fibonacci Arcs
Esempio: aggiungere un Fibonacci Arcs al Chart.
Guid symbolId = this.AddChartDrawing(new FibonacciArcs());
Proprietà:
Origin
- Origine del Fibonacci Arcs;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;SecondaryLinesColor
- Colore delle linee secondarie degli archi;AreaAlpha
- Trasparenza dell’area degli archi, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Fibonacci Fan
Esempio: aggiungere un Fibonacci Fan al Chart.
Guid symbolId = this.AddChartDrawing(new FibonacciFan());
Proprietà:
Origin
- Origine del Fibonacci Fan;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;Alpha
- Trasparenza dell’area del fan, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Fibonacci Retracements
Esempio: aggiungere un Fibonacci Retracements al Chart.
Guid symbolId = this.AddChartDrawing(new FibonacciRetracements());
Proprietà:
Point1
- Punto di controllo 1 del Drawing;Point2
- Punto di controllo 2 del Drawing;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore;ChannelAlpha
- Trasparenza dell’area del canale, valore compreso tra 0 e 255, dove 0 significa completamente trasparente e 255 significa completamente opaco.
Fibonacci Time Zones
Esempio: aggiungere un Fibonacci Time Zones al Chart.
Guid symbolId = this.AddChartDrawing(new FibonacciTimeZones());
Proprietà:
X1
- Coordinata X del primo punto di controllo del Fibonacci Time Zones;X2
- Coordinata X del secondo punto di controllo del Fibonacci Time Zones;PlotSettings
- Impostazioni relative alla modalità di disegno del Drawing, quali tipo di linea, colore e spessore.
Disegno personalizzato delle uscite
public virtual void OnCustomPaint(CustomPaintIndicatorEventArgs args)
MarvelChart consente di personalizzare completamente il disegno delle uscite degli indicatori, implementando l’override del metodo OnCustomPaint
. L’accesso alle funzioni di disegno e la relativa documentazione può avvenire tramite il parametro args
di tipo CustomPaintIndicatorEventArgs
. Il parametro args
consente di calcolare le coordinate X ed Y dei punti sul pannello del Chart, di ottenere le dimensioni in pixels del pannello, e di utilizzare tutte le funzioni di disegno disponibili. Il disegno degli indicatori avviene attraverso l’utilizzo di chiamate Direct2D Immediate Mode che sfruttano l’accelerazione hardware qualora sia disponibile.
Trading Systems
MarvelChart permette di creare trading systems personalizzati tramite l’utilizzo di Class Libraries .NET Core 8.0. Ogni trading system è costituito da una classe .NET, che per essere individuata come tale deve derivare dalla classe Signal
fornita da MarvelChart nel namespace NetScript
. E’ possibile creare nuovi trading system sia seguendo la procedura guidata integrata in MarvelChart, ma anche realizzando una Class Library in modo autonomo, posizionando l’assembly risultante nella cartella
Procedura guidata per nuovi Trading System
La procedura guidata per la creazione di nuovi Trading System è composta da una finestra che richiede le informazioni essenziali relative al nuovo trading system.
La finestra presenta nella parte superiore i campi per inserire i valori che identificano il nuovo trading system, mentre nella parte centrale è divisa in diverse sezioni. Le informazioni che identificano il nuovo trading system sono costituite dai campi:
Class Name - Nome della classe del nuovo trading system, deve essere un testo univoco;
Signal Name - Nome del nuovo trading system, che rappresenta il testo che sarà visibile nella finestra di impostazione dei Signal di MarvelChart;
Folder Name - Nome della cartella all’interno della quale aggiungere la voce del nuovo trading system nella finestra di impostazione dei Signal di MarvelChart.
Le sezioni nella parte centrale della finestra raggruppano le impostazioni relative a:
Inputs - Parametri di ingresso del trading system;
Orders - Definizione degli ordini che il trading system può generare;
Child Indicators - Eventuali indicatori che il nuovo trading system usa nell’algoritmo di calcolo.
Una volta completate tutte le impostazioni, cliccando sul pulsante Create File and Open in Editor, MarvelChart creerà il nuovo file del trading system in linguaggio C# ed aprirà l’ambiente di sviluppo dove sarà possibile scriverne il codice.
Inputs
In questa sezione possono essere definiti i parametri di ingresso del trading system. Per ogni parametro di ingresso è necessario definire nella tabella i seguenti valori:
Variable Name - Nome della variabile usata all’interno del codice del nuovo trading system per contenere il valore del parametro di ingresso. Deve essere un testo univoco all’interno del trading system;
Name - Nome visualizzato nelle finestre di MarvelChart per individuare il parametro di ingresso del trading system;
Type - Casella a discesa dove selezionare il tipo di dati associato al parametro di ingresso;
Default Value - Valore di default del parametro di ingresso, automaticamente assegnato alla corrispondente variabile quando il trading system viene inizializzato per un Backtest o per il sistema Auto-Trade.
Orders
In questa sezione possono essere definiti gli ordini che il trading system può generare. Per ogni ordine è necessario definire nella tabella i seguenti valori:
Variable Name - Nome della variabile usata all’interno del codice del nuovo trading system per identificare l’ordine. Deve essere un testo univoco all’interno del trading system;
Order Type - Casella a discesa dove selezionare il tipo di ordine;
Child Indicators
In questa sezione possono essere definiti i Child Indicators, cioè gli indicatori e le relative funzioni di calcolo che il nuovo trading system che si sta creando utilizzerà nel proprio algoritmo. Per ogni Child Indicator è necessario definire nella tabella i seguenti valori:
Indicator Type - Casella a discesa dove selezionare il tipo di Child Indicator che si intende utilizzare nel calcolo del nuovo trading system;
Variable Name - Nome della variabile associata al Child Indicator. Deve essere un testo univoco all’interno del trading system;
Metodi della classe Signal
Nella creazione di nuovi trading system è generalmente sufficiente implementare tramite override solo due metodi della classe Signal
, OnCreate
e OnCalculate
.
OnCreate
void OnCreate(IScriptData data, IVariablesFactory variablesFactory, IPlotFactory plotFactory, ISignalOrderFactory orderFactory)
Questo metodo viene richiamato da MarvelChart quando il trading system viene aggiunto al Chart, o comunque quando è necessario inizializzare una nuova istanza del trading system. Può essere utilizzato per inizializzare variabili, Inputs (in particolare le serie storiche usate negli Inputs), Child Indicators ed in genere qualsiasi altro oggetto utilizzato nel trading ststem che necessiti di inizializzazione. Il metodo ha i parametri:
data
- Contiene i dati di lavoro del trading system, come ad esempio le serie storiche ed il simbolo del Chart;variablesFactory
- Utilizzato per inizializzare variabili che contengono serie di dati;plotFactory
- Utilizzato per inizializzare plots e strip lines;ordersFactory
- Utilizzato per inizializzare gli ordini.
Inizializzazione delle variabili
Se nel trading system sono necessarie variabili che memorizzano i valori barra per barra, è possibile utilizzare oggetti di tipo IVariableSeries<T>
, inizializzandole nel metodo OnCreate
, come nell’esempio seguente:
this.m_variable = variablesFactory.CreateVariableSeries<double>(this);
Inizializzazione degli Inputs
Quando il trading system prevede degli Inputs i loro valori possono essere inizializzati nel metodo OnCreate
. E’ consigliabile inizializzare sempre gli Inputs relativi a serie storiche, come nell’esempio seguente:
if (this.Price == null) this.Price = data?.Bars?.Close;
Inizializzazione dei Child Indicators
L’inizializzazione dei Child Indicators consiste semplicemente nella chiamata del costruttore della relativa classe, passando come parametro parent
il valore this
, come nell’esempio seguente:
this.m_ma = new VariableTypeMovingAverage(this);
I Child Indicators nei trading system devono essere rilasciati manualmente implementando un override del metodo OnDestroy
.
Inizializzazione degli ordini
Per ogni ordine utilizzato nel trading system è necessario eseguirne l’inizializzazione nel metodo OnCreate
, come nell’esempio seguente:
this.m_buy = orderFactory?.Create(this, SignalOrderType.BuyMarket);
OnCalculate
public virtual void OnCalculate(IScriptData data)
Il metodo OnCalculate
è quello che MarvelChart utilizza per eseguire l’algoritmo del trading system. E’ il metodo principale di ogni trading system.
OnNewBar
public virtual void OnNewBar(IScriptData data)
Questo metodo viene richiamato da MarvelChart ogni volta che nella serie storica viene aggiunta una nuova barra. Normalmente non è necessario implementare un override di questo metodo, in quanto MarvelChart estende automaticamente la lunghezza delle serie di dati relative alle ed ai Child Indicators inizializzati nel metodo
OnCreate passando come parametro parent
il valore this
.
OnDestroy
void OnDestroy(IScriptsContext context)
Questo metodo viene richiamato da MarvelChart quando il trading system viene eliminato dal Chart o comunque quando l’istanza viene rilasciata. E’ necessario implementare un override di questo metodo se il trading system utilizza dei Child Indicators, che dovranno essere rilasciati manualmente. Esempio:
Per ogni Child Indicator utilizzato, è necessario eseguire una chiamata al metodo context.ReleaseScript
per liberare le risorse utilizzate.
Take-Profit e Stop-Loss
La classe Signal
dalla quale derivano i trading system rende disponibile l’impostazione di ordini di uscita Take-Profit e Stop-Loss tramite appositi metodi e proprietà.
SetTakeProfit
void SetTakeProfit(TakeProfitStopLossMode takeProfitMode, double takeProfitValue)
Imposta i parametri per l’ordine di uscita Take-Profit. Il parametro takeProfitMode
determina come deve essere calcolato il prezzo dell’ordine di uscita. I valori ammessi sono:
None
- Nessun ordine di uscita Take-Profit;Points
- Il prezzo è calcolato come distanza, in punti, dal prezzo dell’Open Position. La distanza in punti è specificata nel parametrotakeProfitValue
;Percentage
- Il prezzo è calcolato come distanza, in percentuale, dal prezzo dell’Open Position. La distanza in percentuale è specificata nel parametrotakeProfitValue
;Amount
- Il prezzo è calcolato in modo che l’uscita avvenga con un Profit pari al valore impostato nel parametrotakeProfitValue
. Il prezzo di uscita dipenderà quindi non solo dal prezzo dell’Open Position, ma anche dalla quantità e dalle caratteristiche del simbolo;ExactPrice
- Il prezzo di uscita sarà pari al valore impostato nel parametrotakeProfitValue
.
SetStopLoss
void SetStopLoss(TakeProfitStopLossMode stopLossMode, double stopLossValue)
Imposta i parametri per l’ordine di uscita Stop-Loss. Il parametro stopLossMode
determina come deve essere calcolato il prezzo dell’ordine di uscita. I valori ammessi sono:
None
- Nessun ordine di uscita Stop-Loss;Points
- Il prezzo è calcolato come distanza, in punti, dal prezzo dell’Open Position. La distanza in punti è specificata nel parametrostopLossValue
;Percentage
- Il prezzo è calcolato come distanza, in percentuale, dal prezzo dell’Open Position. La distanza in percentuale è specificata nel parametrostopLossValue
;Amount
- Il prezzo è calcolato in modo che l’uscita avvenga con un Loss pari al valore impostato nel parametrostopLossValue
. Il prezzo di uscita dipenderà quindi non solo dal prezzo dell’Open Position, ma anche dalla quantità e dalle caratteristiche del simbolo;ExactPrice
- Il prezzo di uscita sarà pari al valore impostato nel parametrostopLossValue
.
ClearTakeProfit
void ClearTakeProfit()
Azzera tutte le impostazioni relative all’ordine di uscita Take-Profit.
ClearStopLoss
void ClearStopLoss()
Azzera tutte le impostazioni relative all’ordine di uscita Stop-Loss.
Proprietà TakeProfit
TakeProfitSettings TakeProfit { get; }
Proprietà in sola lettura che permette di accedere alle impostazioni attuali dell’ordine di uscita Take-Profit.
Proprietà StopLoss
StopLossSettings StopLoss { get; }
Proprietà in sola lettura che permette di accedere alle impostazioni attuali dell’ordine di uscita Stop-Loss
Cancellazione degli ordini
Se il trading system prevede l’utilizzo di ordini che richiedono periodi di tempi lunghi per essere completamente eseguiti, può accadere che l’algoritmo calcoli che sia necessario immettere un nuovo ordine mentre uno precedente non è ancora completato. Per questi casi, la classe Signal
rende disponibile il metodo CancelOrder
per cancellare un ordine non ancora completato.
void CancelOrder(Order order, IScriptData data)
Il parametro order
specifica quale ordine deve essere cancellato, mentre il parametro data
contiene i dati di lavoro del trading system.
Dynamic Indicators
Nei trading system è possibile creare dei Dynamic Indicators. I Dynamic Indicators sono degli indicatori che il trading system aggiunge autonomamente al Chart quando viene avviato.
L’utilizzo dei Dynamic Indicators prevede l’utilizzo della proprietà IndicatorsFactory
della classe Signal
, che espone i metodi CreateIndicator
e RemoveIndicator
, usati rispettivamente per aggiungere un Dynamic Indicator al Chart e per rimuoverlo.
IndicatorsFactory.CreateIndicator
Guid CreateIndicator(IScript owner, Type indicatorType, Dictionary<string, object> indicatorInputParametersValues, Dictionary<string, PlotSettings> indicatorOutputs)
Aggiunge un Dynamic Indicator al Chart, e restituisce un valore di tipo Guid che lo identifica in MarvelChart. I parametri in ingresso sono:
owner
-Signal
proprietario del Dynamic Indicator, normalmente valorizzato athis
;indicatorType
- Tipo di indicatore;indicatorInputParametersValues
- Parametri di ingresso dell’indicatore. Se uno degli Inputs dell’indicatore non viene specificato in questo parametro, l’indicatore userà il valore di default.indicatorOutputs
- Impostazioni delle uscite dell’indicatore.
Esempio di utilizzo:
IndicatorsFactory.RemoveIndicator
void RemoveIndicator(Guid indicatorId)
Rimuove un Dynamic Indicator dal Chart, identificato tramite il parametro indicatorId
, il cui valore deve essere pari al valore restituito dalla chiamata al metodo IndicatorsFactory.CreateIndicator
.
Output su Backtest Multi-Simbolo
Quando si utilizza un trading system nella funzionalità Backtest Multi-Simbolo è possibile rendere disponibili delle informazioni aggiuntive che verranno visualizzate nell’elenco dei messaggi di stato durante l’esecuzione del Backtest. La classe Signal
mette a disposizione il metodo OutputInfo
per aggiungere informazioni sull’elenco dei messaggi. Nell’elenco dei messaggi viene aggiunta una riga ogni volta che viene generato un ordine. Sulla riga, usando la funzione OutputInfo
, è possibile aggiungere delle colonne contenenti le informazioni aggiuntive che si desidera rendere visibili nella finestra del Backtest.
void OutputInfo(string name, object value, Color? foregroundColor = null, Color? backgroundColor = null, int fontSizeDelta = 0, FontStyle fontStyleDelta = FontStyle.Regular)
name
- Intestazione della colonna da aggiungere nell’elenco dei messaggi;value
- Valore da visualizzare nella cella individuata dalla colonna specificata dal parametro name e dalla riga attuale dell’elenco dei messaggi;foregroundColor
- Opzionale. Colore del testo;backgroundColor
- Opzionale. Colore di sfondo della cella;fontSizeDelta
- Opzionale. Differenza di dimensione del font della cella rispetto al font standard, in punti;fontStyleDelta
- Opzionale. Differenza di stile del font della cella rispetto al font standard.
Importazione ed esportazione di Indicatori e Trading Systems
In MarvelChart usando le apposite voci di menù nella scelta degli indicatori o dei trading system è possibile avviare la procedura di importazione/esportazione. La procedura non distingue tra indicatori e trading system, e presenta un’unica finestra per entrambe le funzionalità.
Importazione di Indicatori e Trading System tramite codice sorgente
L’importazione tramite codice sorgente avviene selezionando la scheda Import lungo il bordo sinistro della finestra, quindi attivando la vista Source Code nella parte superiore della scheda. La vista di importazione tramite codice sorgente richiede un solo parametro, il nome del file sorgente da importare. Una volta selezionato il file, cliccando sul pulsante OK verrà avviata l’importazione del file (tramite copia), avviando anche l’ambiente di sviluppo per la modifica del file importato.
Importazione di Indicatori e Trading System tramite file compilato binario
L’importazione tramite file compilato binario avviene selezionando la scheda Import lungo il bordo sinistro della finestra, quindi attivando la vista Binary File nella parte superiore della scheda. La vista di importazione tramite file compilato binario richiede un solo parametro, il nome del file da importare. Una volta selezionato il file, cliccando sul pulsante OK verrà avviata l’importazione del file (tramite copia), rendendo immediatamente disponibili in MarvelChart gli indicatori e trading system presenti nel file importato.
Esportazione di Indicatori e Trading System tramite codice sorgente
L’esportazione tramite codice sorgente avviene selezionando la scheda Export lungo il bordo sinistro della finestra, quindi attivando la vista Source Code nella parte superiore della scheda. La vista di esportazione tramite codice sorgente richiede un solo parametro, il nome del file sorgente da esportare. Una volta selezionato il file, cliccando sul pulsante OK verrà avviata l’esportazione del file (tramite copia), richiedendo il nome da assegnare al file esportato.
Esportazione di Indicatori e Trading System tramite file compilato binario
L’esportazione tramite file compilato binario avviene selezionando la scheda Export lungo il bordo sinistro della finestra, quindi attivando la vista Binary File nella parte superiore della scheda. La vista di esportazione tramite file compilato binario richiede un solo parametro, il nome del file da esportare. Una volta selezionato il file, cliccando sul pulsante OK verrà avviata l’esportazione del file (tramite copia), richiedendo il nome da assegnare al file esportato.
Creare estensioni senza usare le procedure guidate
Per creare estensioni senza usare le procedure guidate di MarvelChart è sufficiente creare nel proprio ambiente di sviluppo preferito un nuovo progetto Class Library per .NET Core 6, in qualsiasi linguaggio, ed all’interno del progetto creare una nuova classe per ogni nuovo Indicatore o Trading System che si vuole implementare. Le classi che implementano un nuovo Indicatore devono derivare dalla classe NETScript.Indicator
, mentre le classi che implementano un nuovo Trading System devono derivare dalla classe NETScript.Signal
. E’ pertanto necessario nel progetto aggiungere un riferimento all’assembly NETScript
che si trova nella cartella di installazione di MarvelChart, tipicamente
L’assembly risultante dalla compilazione del progetto deve essere copiata nella cartella dove MarvelChart ricerca i file di estensione, tipicamente