Documentación

Aplicaciones

Última actualización el 17. 4. 2025 by Emmanuel Evrard

Exportación de datos de estrategia a un archivo mediante una plantilla y un bloque de acción

Usando el Editor de Código, podemos crear y desarrollar fragmentos. En este ejemplo, exploraremos cómo exportar datos de una estrategia utilizando un bloque de acción.

Este Exportar datos nos ayuda a entender mejor el comportamiento de una estrategia y es especialmente útil cuando se depuran plantillas complejas que implican múltiples reglas.

En AlgoWizardpodemos construir una plantilla que funcione en dos modos:

  • Modo por defecto: Se utiliza durante la elaboración de la estrategia. No se exportan datos.

  • Modo Retester: Permite exportar datos a un archivo.

 

I. Creación de una plantilla

1. Instalación del snippet ExportData

  • Abra el Editor de código

  • Importar el archivo SQExtensionExportData2.sxp

  • Reinicie SQX para aplicar los cambios

 

2. Creación de una nueva plantilla

  • Crear una nueva plantilla

  • Añadir algunas condiciones básicas/aleatorias a la lógica

 

3. Añadir una regla "Exportar datos" para exportar valores de indicadores

Cree una regla denominada "Exportar datos" que se encarga de la exportación de datos.

En este ejemplo, exportaremos los valores de los indicadores en cada nueva entrada utilizando la regla "Exportar datos".

Esta regla recoge los valores especificados en Exportar datos y los escribe en un archivo.

Para ello:

  • Establezca la ruta del archivo donde se exportarán los datos

  • Definir las variables a exportar (si se establece un valor en 999999, se ignorará durante la exportación)

 

Dentro de una plantilla, puede exportar valores a la entrada de una operación, durante una operación o a la salida. Esto permite una observación detallada del comportamiento de la estrategia.

También puede preprocesar los valores (por ejemplo, calcular promedios) antes de exportarlos.

Puede utilizar varios ExportData bloques a través de diferentes reglas para exportar a varios archivos según sea necesario.

4. Añadir una variable de exportación

Crear una variable booleana denominada ExportData. Esta variable se utilizará para activar la regla de exportación cuando se ejecute en el Retester.

 

II. Creación a partir de la plantilla y exportación de datos

1. Generar estrategias con el Constructor

  • Una vez que la plantilla adjunta esté lista, ejecútela en la aplicación Constructor para generar estrategias.

  • Seleccione las estrategias generadas y envíelas al Retester.

 

 

 

2. Activación de la exportación de datos en el Retester

  • En el Retester, seleccione una estrategia

  • Editar el Exportar datos y configurarlo como Verdadero

  • Aplique la configuración y ejecute el Retester

Con el modo de exportación activado, la estrategia escribirá los datos en el archivo definido.

 

 

 

 

III. Código completo del fragmento

 

paquete SQ.Bloques.OtrasAcciones;

importar SQ.Internal.ActionBlock;

import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;

import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@BuildingBlock(name="(EXP) ExportData", display="ExportData", returnType = ReturnTypes.Action)
@Help("Exportar valores de datos a un archivo")
@OrdenOrden(100)
@CategoryOrder(400)
@IgnorarEnConstructor
public class ExportData extends ActionBlock
{

    @Parámetro
    public ChartData Gráfico;
    
    @Parámetro
    public int Desplazamiento;

    @Parámetro(defaultValue="C:\Temp\output.txt", category="Ruta" )
    @Help("Ruta del archivo")
    public String Ruta1;

    @Parameter(category="Valor", name="Valor1", minValue=-999999999, maxValue=999999999, defaultValue="999999", step=0.1)
    public double Valor1;

    @Parameter(category="Valor", name="Valor2", minValue=-999999999, maxValue=999999999, defaultValue="999999", step=0.1)
    public double Valor2;

    @Parameter(category="Valor", name="Valor3", minValue=-999999999, maxValue=999999999, defaultValue="999999", step=0.1)
    public double Valor3;

    @Parameter(category="Valor", name="Valor4", minValue=-999999999, maxValue=999999999, defaultValue="999999", step=0.1)
    public double Valor4;

    @Parameter(category="Valor", name="Valor5", minValue=-999999999, maxValue=999999999, defaultValue="999999", step=0.1)
    public double Valor5;
    
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------

    @Override
    public void OnAction() lanza TradingException
    {
        tiempo long;
        time = Chart.Time(Shift);
        Integer date1 = (SQTime.getYear(time)*10000 + SQTime.getMonthOriginal(time)*100 + SQTime.getDay(time));
        Integer time1 = (SQTime.getHour(time)*100 + SQTime.getMinute(time));
        double open1 = Chart.Open(Shift);
        double high1 = Chart.High(Shift);
        double low1 = Gráfico.Low(Turno);
        double cierre1 = Gráfico.Cierre(Turno);
        double Volumen1 = Gráfico.Volumen(Turno);
        String newline = System.getProperty("separador.línea");

        String filePath = Path1;

        if (Valor1 == 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1)); // + newline
        }
        else if (Value1 != 999999 && Value2 == 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1) + "," + Double.toString(Value1));
        }
        else if (Value2 != 999999 && Value3 == 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1) + "," + Double.toString(Value1) + "," + Double.toString(Value2));
        }
        else if (Value3 != 999999 && Value4 == 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1) + "," + Double.toString(Value1) + "," + Double.toString(Value2) + "," + Double.toString(Value3));
        }
        else if (Value4 != 999999 && Value5 == 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1) + "," + Double.toString(Value1) + "," + Double.toString(Value2) + "," + Double.toString(Value3)+ "," + Double.toString(Value4));
        }
        else if (Value4 != 999999 && Value5 != 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1) + "," + Double.toString(Value1) + "," + Double.toString(Value2) + "," + Double.toString(Value3) + "," + Double.toString(Value4)+ "," + Double.toString(Value5));
        }
    }
    public static void writeToFile(String path, String content)
    {
        try (FileWriter writer = new FileWriter(ruta, true))
        {
            writer.write(contenido + "\n");
           // System.out.println("Données écrites avec succès dans le fichier " + path);
        } catch (IOException e) {
           // System.out.println("Se ha producido un error al escribir el archivo");
            //e.printStackTrace();
        }
    }
}

Vea el vídeo paso a paso:

¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil

1 Comentario
Más antiguo
Más reciente Más votados
Comerciante de abejas
19. 4. 2025 2:34 pm

Gracias esta es una herramienta útil. Para la fecha yo sugeriría que usáramos algo como        
String fecha_formateada = SQTime.toString(hora, "MM/dd/aaaa") + + SQTime.toHHMMString(time);

La fecha entera no es suficientemente intuitiva 🙂 .