Editor di codice

Questo manuale spiega come creare, aprire e modificare il codice sorgente di una strategia, di un indicatore o di un plugin utilizzando l'Editor di codice integrato in JForex4, e come compilare e salvare le modifiche.

Rinominato: questo strumento in precedenza si chiamava "Strategy Editor". Ora si chiama Editor di codice, poiché viene utilizzato non solo per modificare le strategie, ma anche gli indicatori e i plugin.


1. Aprire l'editor

È possibile accedere all'Editor di codice in due modi:

  • Creare nuovo codice: nel pannello Navigator (in basso a sinistra), fare clic con il pulsante destro del mouse sul nodo pertinente — Strategies, Indicators, Plugins (o i rispettivi sotto-nodi Custom) — e selezionare New Strategy, New Indicator o New Plugin. La piattaforma genera un nuovo file .java con lo scheletro appropriato e lo apre direttamente nell'editor.
  • Modificare codice esistente: fare clic con il pulsante destro del mouse su una strategia, un indicatore o un plugin nel Navigator o nel relativo pannello e selezionare Edit. In questo modo si apre il file sorgente (.java) nell'editor. Se è presente solo un file .jfx compilato (senza codice sorgente), la modifica non è possibile — sarebbe necessario il file .java originale.

Nota: i nuovi file vengono salvati per impostazione predefinita su JCloud. Se si salva il file con un nome personalizzato, ricordarsi di rinominare anche il nome della classe Java all'interno del file affinché corrisponda — il nome della classe e il nome del file devono coincidere affinché la compilazione abbia successo.

2. Comprendere lo scheletro del codice

Lo scheletro generato dipende da ciò che si è scelto di creare:

  • New Strategy genera una classe che implementa IStrategy.
  • New Indicator genera una classe che implementa IIndicator.
  • New Plugin genera una classe che implementa IPlugin.

Il resto di questo manuale si concentra sulla modifica delle strategie come esempio principale, ma lo stesso flusso di lavoro dell'editor (aprire, modificare, compilare, salvare) si applica anche a indicatori e plugin — cambia solo il modo in cui ciascuno viene avviato in seguito (vedere la Sezione 6).

Ogni strategia è una classe Java che implementa IStrategy, con un insieme minimo di metodi richiesti per la compilazione:

package jforex;
import com.dukascopy.api.*;

public class Strategy1 implements IStrategy {
    public void onStart(IContext context) throws JFException {}
    public void onAccount(IAccount account) throws JFException {}
    public void onMessage(IMessage message) throws JFException {}
    public void onStop() throws JFException {}
    public void onTick(Instrument instr, ITick tick) throws JFException {}
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}
Metodo Scopo
onStart Viene eseguito una volta all'avvio della strategia — inizializzazione, sottoscrizione degli strumenti, memorizzazione di IContext/IConsole.
onTick Viene eseguito a ogni tick in arrivo per gli strumenti sottoscritti.
onBar Viene eseguito ogni volta che si chiude una nuova barra per gli strumenti/periodi sottoscritti.
onAccount Viene eseguito ai cambiamenti di stato del conto (saldo, equity, margine).
onMessage Viene eseguito agli eventi del ciclo di vita di ordini/posizioni (esecuzioni, rifiuti, ecc.).
onStop Viene eseguito una volta all'arresto della strategia — logica di pulizia.

Indicatori e plugin hanno i propri metodi dell'interfaccia richiesti (ad esempio calculate() per IIndicator). L'Editor di codice genera automaticamente gli stub di metodo corretti in base all'opzione "New ..." selezionata al passaggio 1.

3. Modificare il codice

Lavorare direttamente nel riquadro dell'editor, aggiungendo la propria logica all'interno dei metodi del ciclo di vita pertinenti. Ad esempio, per stampare i tick in arrivo nel log all'interno di una strategia:

package jforex;
import com.dukascopy.api.*;

public class Strategy1 implements IStrategy {
    private IConsole con = null;

    public void onStart(IContext context) throws JFException {
        // store the console for printing to the Messages tab
        this.con = context.getConsole();
    }

    public void onAccount(IAccount account) throws JFException {}
    public void onMessage(IMessage message) throws JFException {}
    public void onStop() throws JFException {}

    public void onTick(Instrument instr, ITick tick) throws JFException {
        con.getOut().println(instr + " " + tick.getAsk() + "/" + tick.getBid());
    }

    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}

Le modifiche più comuni in questa fase includono:

  • Aggiungere campi pubblici con annotazione @Configurable in modo che i parametri siano esposti nella finestra di dialogo Define Parameters quando si esegue la strategia, l'indicatore o il plugin.
  • Aggiungere la logica degli ordini (ordini di mercato/condizionati, stop loss/take profit) all'interno di onTick, onBar o onStart (per le strategie).
  • Aggiungere calcoli di indicatori personalizzati o riferimenti a indicatori integrati.

Suggerimento: le classi degli indicatori personalizzati utilizzate da una strategia devono essere definite nello stesso file se si intende eseguire la strategia in modalità remota (remote) — l'ambiente remoto non può caricare file di classe locali separati. Questo vale anche per le classi ausiliarie utilizzate da indicatori o plugin.

4. Compilare le modifiche

Dopo la modifica, compilare il file utilizzando uno dei seguenti metodi:

  • il pulsante Compile nella barra degli strumenti dell'Editor di codice, oppure
  • la scorciatoia da tastiera F5, oppure
  • facendo clic con il pulsante destro del mouse sulla strategia, sull'indicatore o sul plugin nell'elenco Navigator corrispondente e selezionando Compile.

L'output della compilazione appare nella scheda Messages:

  • Compiling... OK — il codice è stato compilato correttamente e un file .jfx corrispondente viene salvato accanto al file sorgente .java.
  • Dettagli degli errori — se la compilazione fallisce, la scheda Messages elenca gli errori specifici (numeri di riga, problemi di sintassi, ecc.) in modo da poterli individuare e correggere nell'editor.

5. Salvare il proprio lavoro

  • Il salvataggio standard (Ctrl+S o il pulsante Save nella barra degli strumenti) scrive le modifiche nel file sorgente .java.
  • Se si utilizza Save As con un nuovo nome di file, aprire successivamente il file e rinominare la dichiarazione public class in modo che corrisponda al nuovo nome del file — Java richiede che il nome della classe pubblica e il nome del file siano identici.

6. Eseguire il codice modificato

Il modo in cui si avvia il codice modificato una volta compilato dipende dal tipo di elemento modificato — Strategia, Indicatore o Plugin hanno ciascuno un meccanismo di avvio diverso in JForex4:

  • Le strategie vengono avviate tramite Local run o Remote run:

    1. Fare clic con il pulsante sinistro del mouse sulla strategia nel Navigator, oppure selezionarla nel pannello Strategies.
    2. Scegliere Local run o Remote run (vedere le differenze tra le modalità di seguito).
    3. Configurare i parametri nella finestra di dialogo Define Parameters, se richiesto, quindi fare clic su Run.
    Modalità Note per il codice modificato
    Local run Accesso completo ai file locali, ad altre classi Java e ai grafici — comodo durante il debug attivo.
    Remote run Viene eseguito sul server Dukascopy. Nessun accesso al file system, nessun accesso ai grafici (IContext.getChart() restituisce null); tutti gli strumenti devono essere sottoscritti esplicitamente in onStart, e gli indicatori personalizzati devono essere autonomi all'interno del file della strategia.

    Solo le strategie supportano il Remote run sul server Dukascopy. Indicatori e plugin non dispongono di una modalità di esecuzione remota.

  • Gli indicatori non vengono "eseguiti" come le strategie — vengono invece aggiunti a un grafico. Selezionare l'indicatore compilato nel Navigator o nel pannello Indicators e aggiungerlo a un grafico aperto (ad esempio tramite trascinamento, doppio clic o il menu degli indicatori del grafico) per vederlo calcolare e tracciare i dati sui prezzi in tempo reale o storici. Configurare i suoi parametri @Configurable nella finestra di dialogo delle impostazioni dell'indicatore sul grafico.

  • I plugin vengono avviati all'interno della piattaforma stessa, anziché essere collegati a un grafico o eseguiti da remoto. Selezionare il plugin compilato nel Navigator o nel pannello Plugins e avviarlo direttamente; verrà eseguito all'interno dell'applicazione JForex4, integrandosi con l'interfaccia della piattaforma o con l'area di lavoro come previsto.


Best practice per la modifica

  • Utilizzare un IDE esterno per uno sviluppo serio. L'Editor di codice integrato di JForex4 è comodo per piccole modifiche, ma un IDE (Eclipse, IntelliJ IDEA, NetBeans) offre il controllo degli errori in tempo reale, l'autocompletamento e strumenti di refactoring che individuano gli errori prima ancora di tentare la compilazione.
  • Ricompilare dopo ogni modifica rilevante e controllare la scheda Messages — non dare per scontato che un salvataggio sia andato a buon fine senza eseguire una compilazione.
  • Testare prima su un conto demo. Dopo aver modificato la logica di una strategia che influisce sull'esecuzione degli ordini o sui parametri di rischio, eseguire sempre un backtest (tramite lo Historical Tester) e un test in demo prima di passare al conto reale.
  • Conservare un backup delle versioni funzionanti prima di modifiche importanti, poiché l'editor sovrascrive direttamente il file .java al salvataggio.
  • Far corrispondere il nome del file e il nome della classe ogni volta che si rinomina o si duplica un file di strategia, indicatore o plugin, per evitare errori di compilazione.
common.disclaimer