ドキュメントとユーザーガイド

インスピレーションを与えるチュートリアルで、基礎を学ぶ、またはスキルを磨きましょう。.

最終更新日: 2022年8月10日 (マーク・フリック)

タスク設定をプログラムで変更する

重要な注意 – この例はビルド136以降でのみ機能します

この記事では、カスタム分析スニペットを使用して、カスタムプロジェクト内のタスクの設定をプログラムで変更する方法を紹介します。.

考え方としては、カスタムプロジェクトのワークフロー内で何らかのループを作成し、そのタスクの一つとしてCA(コード解析など)のコード片を配置することで、ループごとにプロジェクト内の別のビルド、再テスト、最適化といったタスクの設定を変更できるようにするというものです。.

このようにして、例えばデータの移動範囲で戦略を再テストまたは再最適化することができます。.

我々はこれを再度CustomAnalysisスニペットとして実装します。実装は以下になります: processDatabank() 方法.

 

UIでの見え方

以下の簡単なプロジェクトのスクリーンショットをご覧ください。タスクはわずか2つだけです:

  1. カスタム分析タスク – 次の「ビルド戦略」タスクの日付範囲を変更する新しいCAスニペットを実行します
  2. ビルド戦略タスク – これはCAスニペットによって設定が変更されるタスクです

これはほんの原始的な例に過ぎず、何ができるのかを示すデモンストレーションである。.

このサンプルカスタムプロジェクトは、この記事に添付されています。.

 

それでは、それを実行するCaのスニペットを見てみましょう。.

 

プロジェクトとタスクの取得

これが現在のプロジェクトと希望するタスクを取得する方法です。

public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) throws Exception {

    // 現在のプロジェクトを取得する
    SQProject sqProject = ProjectEngine.get(project);

    // 名前でタスクを取得する
    ISQTask buildTask = sqProject.getTaskByName("Build strategies");
    if(buildTask == null) {
        throw new Exception("そのようなタスクは存在しません!");
    }
    // あるいは、sqProject.getTasks() を使用してすべてのタスクのリストを取得し、
    // その中から目的のタスクを検索することもできます

 

タスクから設定を取得中

このタスクの現在の構成を取得するのも同様に簡単です。単に呼び出すだけです getConfig() タスクの手法:

// これは新しい方法でタスク設定のXMLを取得するコードです(SQ 136以降)
// タスクの全設定を含むJDOM XML Elementを返します
Element elConfig = buildTask.getConfig();

// クローンを作成して新しい設定を作成します。クローンを作成することが重要です。
// そうしないと、新しい設定が適用されません
Element elNewConfig = elConfig.clone();

 

注意: getConfig() タスク構成のXMLを含むJDOM Elementを返します。それを変更するには、新しい要素にクローンする必要があります。.

タスクのXML構造はこの記事の範囲外ですが、タスクを保存すると、すべてのタスクのXML設定を簡単に確認できます。 .cfx フォーマットするか、またはご覧いただけます /user/projects/Your_Project/project.cfx

.cfx ファイルは ZIP アーカイブであり、通常は以下の方法で開くことができます。 WinZip または WinRAR.

開くと、プロジェクト内のタスクごとに個別のXMLファイルが含まれていることがわかります。.

できます 表示 タスクXMLの正確な構造を確認するためです。.

 

タスク設定の変更

それはあなたの希望次第ですが、XMLの構造が特定のタスクに対して有効である限り、XML内のものは何でも変更できます。.

この例では、最初の要素(メインのバックテストのシンボル設定が格納されている場所)を取得し、その「開始日」と「終了日」を変更します。.

// ここで新しい設定の任意の箇所を変更する
Element data = XMLUtil.getChildElem(elNewConfig, "Data");
Element setups = data.getChild("Setups");
List setupList = setups.getChildren("Setup");

if (setupList.size() > 0) {
    Element firstSetup = (Element) setupList.get(0);

    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");

    firstSetup.setAttribute("dateFrom", SQTime.formatDate(SQTime.toLong(2007, 1, 1), formatter));
    firstSetup.setAttribute("dateTo",SQTime.formatDate(SQTime.toLong(2017, 1, 1), formatter));
}

 

準備されたファイルから読み込むことによる設定変更の代替手段

タスクに別の設定を適用する方法はもう1つあります。まずファイルとして用意し、それをスニペット内のElementに読み込ませるだけです:

// または、準備されたファイルから新しいタスク設定を読み込むこともできます
Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

 

設定をタスクに適用しています

最後のステップは、設定をタスクに適用することです。これは単に呼び出すことで実行されます。 setConfig() 方法

// 変更された設定をタスクに適用する
buildTask.setConfig(elNewConfig, true);

 

これにより、変更された設定が指定されたタスクに適用され、そのタスクで使用されるようになります。.

すべてうまく機能します。唯一の問題は、この変更はバックグラウンドでのみ行われるため、UIには変更が反映されない点です。.

UIでも表示させたい場合は、プロジェクト設定の更新をリクエストする最後のステップを1つ実行する必要があります。

// this notifies UI to load che changed config and apply it to the UI.
// Without this it would still work but you'll not see the changes in the UI
JSONObject jsonData = new JSONObject().put("projectConfig",  sqProject.toJSON());
DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData);
SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

 

 

CAChangeTaskConfigスニペットの完全なコード:

package SQ.CustomAnalysis;

import com.strategyquant.lib.SQTime;
import com.strategyquant.lib.XMLUtil;
import com.strategyquant.lib.constants.SQConst;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
import com.strategyquant.tradinglib.ResultsGroup;
import com.strategyquant.tradinglib.project.ProjectEngine;
import com.strategyquant.tradinglib.project.SQProject;
import com.strategyquant.tradinglib.project.websocket.DataToSend;
import com.strategyquant.tradinglib.project.websocket.SQWebSocketManager;
import com.strategyquant.tradinglib.project.websocket.WebSocketConst;
import com.strategyquant.tradinglib.taskImpl.ISQTask;
import org.jdom2.Element;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.json.JSONObject;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class CAChangeTaskConfig extends CustomAnalysisMethod {

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------

    public CAChangeTaskConfig() {
        super("CAChangeTaskConfig", TYPE_PROCESS_DATABANK);
    }

    //------------------------------------------------------------------------

    @Override
    public ArrayList<ResultsGroup> processDatabank(String project, String task, String databankName, ArrayList<ResultsGroup> databankRG) throws Exception {

        // get current project
        SQProject sqProject = ProjectEngine.get(project);

        // get task by name
        ISQTask buildTask = sqProject.getTaskByName("Build strategies");
        if(buildTask == null) {
            throw new Exception("No such task exists!");
        }
        // alternatively you can use sqProject.getTasks() to get a list of all tasks
        // and go through them to get the one you want


        // this is how you get task settings XML in the new way (SQ 136 up)
        // It returns JDOM XML Element with full task configuration
        Element elConfig = buildTask.getConfig();
        // create a new config by cloning it - it is important to make a clone,
        // otherwise your new config will be not applied
        Element elNewConfig = elConfig.clone();

        // now change anything in the new config
        Element data = XMLUtil.getChildElem(elNewConfig, "Data");
        Element setups = data.getChild("Setups");
        List setupList = setups.getChildren("Setup");

        if (setupList.size() > 0) {
            Element firstSetup = (Element) setupList.get(0);

            DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");

            firstSetup.setAttribute("dateFrom", SQTime.formatDate(SQTime.toLong(2007, 1, 1), formatter));
            firstSetup.setAttribute("dateTo",SQTime.formatDate(SQTime.toLong(2017, 1, 1), formatter));
        }

        // alternatively you can load the new task config from prepared file
        //Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

        // Apply the modified config to the task
        buildTask.setConfig(elNewConfig, true);

        // this notifies UI to load che changed config and apply it to the UI.
        // Without this it would still work but you'll not see the changes in the UI
        JSONObject jsonData = new JSONObject().put("projectConfig",  sqProject.toJSON());
        DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData);
        SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

        return databankRG;
    }
}

 

 

 

 

 

 

 

 

 

この記事は参考になりましたか? この記事は役に立った この記事は役に立たなかった

0 コメント
最古の
最新 最も投票された