Documentação

Aplicações

Última atualização em 17. 4. 2025 por Emmanuel Evrard

Exportação de dados de estratégia para um arquivo usando um modelo e um bloco de ação

Usando o Code Editor, podemos criar e desenvolver snippets. Neste exemplo, exploraremos como exportar dados de uma estratégia usando um bloco de ação.

Isso Exportar dados nos ajuda a entender melhor o comportamento de uma estratégia e é especialmente útil na depuração de modelos complexos que envolvem várias regras.

Em AlgoWizardPodemos criar um modelo que seja executado em dois modos:

  • Modo padrão: Usado durante a criação da estratégia. Nenhum dado é exportado.

  • Modo retester: Permite exportar dados para um arquivo.

 

I. Criação de um modelo

1. Instalando o snippet ExportData

  • Abra o Editor de código

  • Importar o arquivo SQExtensionExportData2.sxp

  • Reinicie SQX para aplicar as alterações

 

2. Criação de um novo modelo

  • Criar um novo modelo

  • Adicione algumas condições básicas/aleatórias à lógica

 

3. Adição de uma regra "Exportar dados" para exportar valores de indicadores

Crie uma regra chamada "Exportar dados" que lida com a exportação de dados.

Neste exemplo, exportaremos valores de indicadores a cada nova entrada usando a regra "Exportar dados".

Essa regra coleta os valores especificados no Exportar dados e as grava em um arquivo.

Para fazer isso:

  • Defina o caminho do arquivo para onde os dados serão exportados

  • Definir as variáveis a serem exportadas (se um valor for definido como 999999, ele será ignorado durante a exportação)

 

Em um modelo, você pode exportar valores na entrada da negociação, durante uma negociação ou na saída. Isso permite a observação detalhada do comportamento da estratégia.

Você também pode pré-processar os valores (por exemplo, calcular as médias) antes de exportá-los.

Você pode usar vários ExportData blocos em diferentes regras para exportar para vários arquivos, conforme necessário.

4. Adição de uma variável de exportação

Crie uma variável booleana chamada ExportData. Essa variável será usada para ativar a regra de exportação ao ser executada no Retester.

 

II. Criação a partir do modelo e exportação de dados

1. Gerar estratégias usando o Builder

  • Quando o modelo anexado estiver pronto, execute-o no Construtor para gerar estratégias.

  • Selecione as estratégias geradas e envie-as para o Retester.

 

 

 

2. Ativação da exportação de dados no testador

  • No Retester, selecione uma estratégia

  • Editar o Exportar dados e o define como Verdadeiro

  • Aplique a configuração e execute o Retester

Com o modo de exportação ativado, a estratégia gravará os dados no arquivo definido.

 

 

 

 

III. Código completo do snippet

 

pacote SQ.Blocks.OtherActions;

import SQ.Internal.ActionBlock;

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

import java.io.FileWriter;
Importar 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 dados para um arquivo")
@SortOrder(100)
@CategoryOrder(400)
@IgnoreInBuilder
public class ExportData extends ActionBlock
{

    @Parameter
    public ChartData Chart;
    
    @Parameter
    public int Shift;

    @Parameter(defaultValue="C:\\Temp\\output.txt", category="Path" )
    @Help("Caminho do arquivo")
    public String Path1;

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

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

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

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

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

    @Override
    public void OnAction() throws TradingException
    {
        long time;
        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 = Chart.Low(Shift);
        double close1 = Chart.Close(Shift);
        double Volume1 = Chart.Volume(Shift);
        String newline = System.getProperty("line.separator");

        String filePath = Path1;

        Se (Value1 == 999999)
        {
            writeToFile(filePath, Integer.toString(date1) + "," + Integer.toString(time1) + "," + Double.toString(open1) + "," + Double.toString(high1) + "," + Double.toString(low1) + "," + Double.toString(close1) + "," + Double.toString(Volume1)); // + nova linha
        }
        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(path, true))
        {
            writer.write(content + "\n");
           // System.out.println("Données écrites avec succès dans le fichier " + path);
        } catch (IOException e) {
           // System.out.println("Une erreur s'est produite lors de l'écriture du fichier.");
            //e.printStackTrace();
        }
    }
}

Veja o vídeo passo a passo:

Este artigo foi útil? O artigo foi útil O artigo não foi útil

1 Comentário
mais antigos
mais recentes Mais votado
Comerciante de abelhas
19. 4. 2025 2:34 pm

Obrigado, essa é uma ferramenta útil. Para a data, eu sugeriria usar algo como        
String formatted_date = SQTime.toString(time, "MM/dd/yyyy") + “,” + SQTime.toHHMMString(time);

A data inteira não é intuitiva o suficiente. 🙂