StrategyQuant
Asystent Q AIAlgoCloudQuantAnalyzerQuantDataManager
Darmowy kursFirma
BlogDokumentacjaForumKontakt
BlogMarketplace
Zaloguj się
Załóż bezpłatne konto

Produkt

  • Cennik i licencje
  • Baza wiedzy
  • Marketplace
  • Rozpocznij darmowy okres próbny

Informacje prawne

  • Regulamin
  • Polityka prywatności
  • Pliki cookie

Kontakt

[email protected]

Firma

StrategyQuant s.r.o.

Korunní 2569/108, Vinohrady, 101 00 Praha 10, Czech Republic, EU

IČ: 04000498

DIČ: CZ04000498

Media społecznościowe

  • Nota prawna | PRZETWARZANIE I OCHRONA DANYCH OSOBOWYCH

    Dotychczasowe wyniki nie stanowią gwarancji przyszłych sukcesów. Wszelkie informacje należy traktować wyłącznie jako materiały edukacyjne

    STANY ZJEDNOCZONE Zastrzeżenie prawne wymagane przez Rząd - Commodity Futures Trading Commission informuje: Handel kontraktami futures i opcjami wiąże się z dużymi potencjalnymi zyskami, ale także z ogromnym potencjalnym ryzykiem. Musisz być świadomy tego ryzyka i gotów je zaakceptować, aby inwestować na rynkach kontraktów futures i opcji. Nie handluj środkami, na których utratę nie możesz sobie pozwolić. Nie stanowi to ani zachęty, ani oferty kupna/sprzedaży kontraktów futures, akcji lub opcji na nie. Nie składa się żadnych oświadczeń, że jakiekolwiek konto osiągnie lub ma prawdopodobieństwo osiągnięcia zysków lub strat podobnych do tych omówionych w tym dokumencie. Wyniki osiągane w przeszłości przez jakikolwiek system lub metodologię handlową niekoniecznie wskazują na przyszłe rezultaty.

    REGUŁA CFTC 4.41 - HIPOTETYCZNE LUB SYMULOWANE WYNIKI MAJĄ PEWNE OGRANICZENIA. W PRZECIWIEŃSTWIE DO HISTORII RZECZYWISTYCH WYNIKÓW, WYNIKI SYMULOWANE NIE PRZEDSTAWIAJĄ RZECZYWISTEGO HANDLU. PONADTO, PONIEWAŻ TRANSAKCJE NIE ZOSTAŁY FAKTYCZNIE ZAWARTE, WYNIKI MOGĄ NIE UWZGLĘDNIAĆ WPŁYWU OKREŚLONYCH CZYNNIKÓW RYNKOWYCH, TAKICH JAK BRAK PŁYNNOŚCI. PROGRAMY DO SYMULACJI TRANSAKCJI GENERALNIE PROJEKTUJE SIĘ RÓWNIEŻ Z KORZYŚCIĄ WIEDZY PO FAKCIE (Z PERSPEKTYWY CZASU). NIE SKŁADA SIĘ ŻADNYCH OŚWIADCZEŃ, ŻE JAKIEKOLWIEK KONTO OSIĄGNIE LUB MA PRAWDOPODOBIEŃSTWO OSIĄGNIĘCIA ZYSKÓW LUB STRAT PODOBNYCH DO PRZEDSTAWIONYCH.

    NIE SKŁADA SIĘ ŻADNYCH OŚWIADCZEŃ, ŻE JAKIEKOLWIEK KONTO OSIĄGNIE LUB MA PRAWDOPODOBIEŃSTWO OSIĄGNIĘCIA ZYSKÓW LUB STRAT PODOBNYCH DO TYCH OMÓWIONYCH W TEJ WITRYNIE. JEŚLI ZDECYDUJESZ SIĘ ZAINWESTOWAĆ PRAWDZIWE PIENIĄDZE, WSZYSTKIE DECYZJE HANDLOWE NA RYNKACH FINANSOWYCH POWINNY BYĆ TWOIMI WŁASNYMI.

    © StrategyQuant 2026

    Obsługiwane przez Klaudie.ai

    Wróć do MarketplaceDIGITAL

    Czytnik ustawień strategii XML

    StrategyQuantWtyczki
    Czytnik ustawień strategii XML

    Parsuj pliki XML strategii, aby wyodrębnić ustawienia, zmienne, reguły i parametry, w tym poziomy stop loss oraz take profit, na potrzeby niestandardowych analiz i automatyzacji.

    Dzięki dokumentacji przeglądania i modyfikowania parametrów strategii możemy odczytywać zmienne strategii.

    Ten przykładowy kod odczytuje kod XML strategii, zmienne i reguły.

    1. Przegląd strategii

    • Kod XML strategii można odczytać za pomocą XMLUtil.elementToString().

    Uruchom analizę niestandardową XmlStrategyToFile lub XmlStrategyToFileSym (dla strategii symetrycznych), aby wyeksportować dane z Databanku na dysk. Otwórz pliki XML w dowolnym edytorze XML, np. https://jsonformatter.org/xml-editor.

    • Strategie zawierają reguły i zmienne.

    W rozszerzeniu SQ.utils.Bouillant extension funkcja toBuildingBlocksName wskazuje dwa obszary: Variables i Rules.

    2. Klasa XMLUtil i element JDOM

    Dokumentacja API XMLUtil

    3. Odczytywanie zmiennych strategii

    Pobierz wartości zmiennych:

    • getVariableValueToBoolean
    • getVariableValueToInt
    • getVariableValueToDouble

    4. Przykład: wyodrębnienie Stop Loss i Profit Target

    Analiza niestandardowa CA_StrategySettings lub CA_StrategySettingsSym:

    @Override
    public boolean filterStrategy(String project, String task, String databankName, ResultsGroup rg) throws Exception 
    {
        Bouillant BouilltParaObj1 = new Bouillant();
        int IntTemp = BouilltParaObj1.getVariableValueToInt(rg, false,"LongProfitTarget"); 
        rg.specialValues().set("CA_Long_ProfitTarget", IntTemp);
        IntTemp = BouilltParaObj1.getVariableValueToInt(rg, false,"ShortProfitTarget"); 
        rg.specialValues().set("CA_Short_ProfitTarget", IntTemp);
        IntTemp = BouilltParaObj1.getVariableValueToInt(rg, false,"LongStopLoss"); 
        rg.specialValues().set("CA_Long_StopLoss", IntTemp);
        IntTemp = BouilltParaObj1.getVariableValueToInt(rg, false,"ShortStopLoss"); 
        rg.specialValues().set("CA_Short_StopLoss", IntTemp);
        IntTemp = BouilltParaObj1.getVariableValueToInt(rg, false,"LongTrailingStop"); 
        rg.specialValues().set("CA_Long_TrailingStop", IntTemp);
        IntTemp = BouilltParaObj1.getVariableValueToInt(rg, false,"ShortTrailingStop"); 
        rg.specialValues().set("CA_Short_TrailingStop", IntTemp);
        return true;
    }

    5. Odczytywanie pliku XML strategii krok po kroku

    A. Pobierz element główny (root):

    StrategyBase strategyBase = getStrategyBase(strategyRG, symmetricVariables);
    Element Strategie1 = strategyBase.getStrategyXml();

    B. Pobierz konkretny element podrzędny:

    Element elParams = Strategie1.getChild("Strategy").getChild("Variables");
    elParams = Strategie1.getChild("Strategy").getChild("Rules").getChild("Events");

    C. Pobierz elementy podrzędne do listy (List):

    List<Element> paramElems = elParams.getChildren();

    D. Odczytaj NodeValue:

    for (i = 0; i < paramElems.size(); i++) {
        Element elParam = paramElems.get(i);
        String name = XMLUtil.getNodeValue(elParam,"name");
        String id = XMLUtil.getNodeValue(elParam,"id");
    }

    E. Pobierz AttributeValue:

    String elParamKey = elParam.getAttributeValue("key");

    F. Przekonwertuj element na ciąg znaków (String):

    String String1 = XMLUtil.elementToString(elParam);

    6. Zastosowanie: wywołanie funkcji

    Fragment kodu kolumny w DataBanku:

    Bouillant BouilltParaObj1 = new Bouillant();
    String StringTotal = BouilltParaObj1.toBuildingBlocksName(results,false, "LongEntrySignal",100);

    Wybierz sygnały wejścia/wyjścia (LongEntrySignal, ShortEntrySignal, LongExitSignal, ShortExitSignal itp.).

    package SQ.Columns.Databanks;
    import SQ.Utils.Bouillant;
    import com.strategyquant.lib.L;
    import com.strategyquant.tradinglib.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    public class StrategyBuildingBlocks extends DatabankColumn 
    {
        public static final Logger Log = LoggerFactory.getLogger(StrategyBuildingBlocks.class);
        public StrategyBuildingBlocks() {
            super(L.tsq("Strategy Building Blocks"), DatabankColumn.Text, ValueTypes.Maximize, 0, 0, 1);
            setWidth(1000);
        }
        @Override
        public double getNumericValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception {
            return 0;
        }
        @Override
        public String getValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception 
        {
            try 
            {
                String StringTotal = "";
                Bouillant BouilltParaObj1 = new Bouillant();
                String String1 = BouilltParaObj1.toBuildingBlocksName(results,false, "LongEntrySignal",100);
                BouilltParaObj1 = new Bouillant();
                String String2 = BouilltParaObj1.toBuildingBlocksName(results,false, "ShortEntrySignal",100);
                if (String1 == null || String2 == null) { return "";}
                int maxLength = (String1.length() < 100)?String1.length():100;
                String1 = String1.substring(0, maxLength);
                maxLength = (String2.length() < 100)?String2.length():100;
                String2 = String2.substring(0, maxLength);
                if (!String1.equals("") && !String2.equals("")) {
                    StringTotal += String1 + "," + String2;
                } else if (!String1.equals("")) {
                    StringTotal += String1;
                } else if (!String2.equals("")) {
                    StringTotal += String2;
                }
                return StringTotal;
            } catch(Exception e) {
                Log.error("Error StrategyBuildingBlocks", e);
                return "";
            }
        }
    }

    7. Nazwy bloków konstrukcyjnych (Building Blocks) w DataBanku

    8. Funkcja toBuildingBlocksName

    Odczytuje zmienne i reguły, zwracając nazwy bloków konstrukcyjnych (Building Blocks):

    public String toBuildingBlocksName(ResultsGroup strategyRG, boolean symmetricVariables, String TradingSignalName, int breakdownLevelMax) throws Exception 
    {
        try 
        {
            String SignalID = "";
            String strName = strategyRG.getName();
            if(strName.startsWith("Filtered portfolio") || strName.startsWith("Portfolio")) { return ""; }
            StrategyBase strategyBase = getStrategyBase(strategyRG, symmetricVariables);
            Element Strategie1 = strategyBase.getStrategyXml();
            if (Strategie1 != null) 
            {
                Element elParams = Strategie1.getChild("Strategy").getChild("Variables");
                if (elParams != null) 
                {
                    List<Element> paramElems = elParams.getChildren(); 
                    VariableValues = new HashMap<String, String>();
                    VariableID = new HashMap<String, String>();
                    VariableType = new HashMap<String, String>();
                    for (int i = 0; i < paramElems.size(); i++) 
                    {
                        Element elParam = paramElems.get(i);
                        if (elParam != null) 
                        {
                            String name = XMLUtil.getNodeValue(elParam,"name");
                            String id = XMLUtil.getNodeValue(elParam,"id");
                            String value = XMLUtil.getNodeValue(elParam,"value");
                            String Type = XMLUtil.getNodeValue(elParam,"type");
                            VariableID.put(name, id);
                            VariableValues.put(name, value);
                            VariableType.put(name, Type);
                            if (name.equals(TradingSignalName)) { SignalID = id; }
                        }
                    }
                }
                elParams = Strategie1.getChild("Strategy").getChild("Rules").getChild("Events");
                if (elParams != null) 
                {
                    List<Element> paramElems = elParams.getChildren(); 
                    for (int i = 0; i < paramElems.size(); i++) 
                    {
                        Element elParam2 = paramElems.get(i);
                        if (elParam2 != null) {
                            String elParamKey2 = elParam2.getAttributeValue("key");
                            if (elParamKey2.equals("OnBarUpdate")) {
                                List<Element> paramElems3 = elParam2.getChildren(); 
                                for (int i2 = 0; i2 < paramElems3.size(); i2++) {
                                    Element elParam3 = paramElems3.get(i2);
                                    if (elParam3 != null) {
                                        String elParamKey3 = elParam3.getAttributeValue("name");
                                        if (elParamKey3.equals("Trading signals")) {
                                            Element elParams4 = elParam3.getChild("signals");
                                            List<Element> paramElems4 = elParams4.getChildren(); 
                                            for (int i3 = 0; i3 < paramElems4.size(); i3++) {
                                                Element elParam4 = paramElems4.get(i3);
                                                if (elParam4 != null) {
                                                    String elParamKey4 = elParam4.getAttributeValue("variable");
                                                    if (elParamKey4.equals(SignalID)) {
                                                        Element elParams5 = elParam4.getChild("Item");
                                                        if (elParams5 != null) {
                                                            String key = elParams5.getAttributeValue("key");
                                                            if (!key.equals("Boolean")) {
                                                                ArrayListElemsAll = new ArrayList<Element>(); 
                                                                UpdateNodesValues(strategyRG, symmetricVariables, elParams5, breakdownLevelMax, 0);
                                                                AddToList(strategyRG, symmetricVariables, elParams5, breakdownLevelMax, 0);
                                                                StringBuilder sb = new StringBuilder();
                                                                if (ArrayListElemsAll.size()>=1) {
                                                                    for (int i5 = 0; i5 < ArrayListElemsAll.size(); i5++) {
                                                                        Element elParam6Temp = ArrayListElemsAll.get(i5);
                                                                        if (elParam6Temp != null) {
                                                                            String elParamKey8Temp = elParam6Temp.getAttributeValue("name");
                                                                            sb.append(elParamKey8Temp);
                                                                            sb.append(ParamDelimiter);
                                                                        }
                                                                    }
                                                                }
                                                                return sb.toString();
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return "";
        } catch (Exception e) {
            Log.error("Error toBuildingBlocksName", e);
            return "";
        }
    }

    9. Funkcje rekurencyjne: UpdateNodesValues i AddToList

    public void UpdateNodesValues(ResultsGroup strategyRG, boolean symmetricVariables, Element element, int breakdownLevelMax, int breakdownLevel) throws Exception 
    {
        if (element != null) {
            breakdownLevel++;
            List<Element> element1 = element.getChildren();
            for (int i = 0; i < element1.size(); i++) {
                Element element11 = element1.get(i);
                if (element11 != null) { UpdateNodesValues(strategyRG, symmetricVariables, element11, breakdownLevelMax, breakdownLevel); }
            }
        }
        if (element != null) {
            List<Element> listParams = element.getChildren("Param");
            for (int i = 0; i < listParams.size(); i++) {
                Element courant = listParams.get(i);
                if (courant != null) {
                    String elParamKey5 = courant.getAttributeValue("key");
                    String elParamVariable3 = courant.getAttributeValue("variable");
                    if (elParamKey5.startsWith("#") && elParamVariable3=="true") {
                        String Temp1 = VariableValues.get(courant.getText());
                        if (Temp1 != null) { courant.setText(Temp1); }
                    }
                }
            }
        }
    }
    public void AddToList(ResultsGroup strategyRG, boolean symmetricVariables, Element element, int breakdownLevelMax, int breakdownLevel) throws Exception 
    {
        boolean Condition1 = false;
        if (element != null) {
            breakdownLevel++;
            String elParamKey = element.getAttributeValue("key");
            String categoryType = element.getAttributeValue("categoryType");
            if (categoryType == null) { categoryType = ""; }
            if (breakdownLevelMax < 100) { Condition1 = (elParamKey.equals("IsRising") || elParamKey.equals("IsFalling") || elParamKey.equals("IsLowerCount") || elParamKey.equals("IsGreaterCount") || elParamKey.equals("IsLower") || elParamKey.equals("IsLowerOrEqual") || elParamKey.equals("IsGreater") || elParamKey.equals("IsGreaterOrEqual") || elParamKey.equals("CrossesAbove") || elParamKey.equals("CrossesBelow") || elParamKey.startsWith("CBlock")); }
            if (!Condition1) {
                List<Element> element1 = element.getChildren();
                for (int i = 0; i < element1.size(); i++) {
                    Element element11 = element1.get(i);
                    if (element11 != null) { AddToList(strategyRG, symmetricVariables, element11, breakdownLevelMax, breakdownLevel); }
                }
            }
            List<Element> listParams = element.getChildren("Param");
            if (listParams.size() >= 1 || Condition1) {
                Element elementCopy = (Element)element.clone();
                elParamKey = elementCopy.getAttributeValue("key");
                listParams = elementCopy.getChildren("Param");
                List<Element> listParamsBlock = element.getChildren("Block");
                if (listParamsBlock.size() == 0 || Condition1) {
                    if ((listParams.size() == 1 && !elParamKey.equals("Number")) || !elParamKey.equals("Number")) {
                        if (breakdownLevel <= breakdownLevelMax) { ArrayListElemsAll.add(elementCopy); }
                    }
                }
            }
        }
    }

    10. Podsumowanie

    Zacznij od odczytania struktury XML za pomocą XMLUtil.elementToString(), a następnie skorzystaj z funkcji A–F powyżej. Więcej informacji znajdziesz w dokumentacji API XMLUtil.

    Materiały źródłowe: Viewing and Changing Strategy Parameters, W3Schools XML, Java JDOM Parse Document

    Autor: Emmanuel Bouillant-Evrard, inżynier specjalizujący się w finansach z 24-letnim doświadczeniem w badaniach i rozwoju (R&D) w USA, Kanadzie i Francji.

    Dotychczasowe wyniki nie stanowią gwarancji przyszłych zysków. Wszelkie informacje należy traktować wyłącznie jako materiały edukacyjne Zastrzeżenie wymagane przez rząd STANÓW ZJEDNOCZONYCH – Commodity Futures Trading Commission informuje: Handel kontraktami futures i opcjami wiąże się z potencjalnie wysokimi zyskami, ale także z ogromnym ryzykiem. Należy być świadomym ryzyka i być gotowym je zaakceptować, aby inwestować na rynkach kontraktów futures i opcji. Nie inwestuj pieniędzy, na których stratę nie możesz sobie pozwolić. Niniejszy dokument nie stanowi zachęty ani oferty kupna/sprzedaży kontraktów futures, akcji ani powiązanych z nimi opcji. Nie składa się żadnych oświadczeń, że jakiekolwiek konto osiągnie lub ma szansę osiągnąć zyski lub straty podobne do omówionych w tym dokumencie. Wyniki osiągnięte w przeszłości przez jakikolwiek system lub metodologię handlową niekoniecznie wskazują na przyszłe rezultaty. REGUŁA CFTC 4.41 – HIPOTETYCZNE LUB SYMULOWANE WYNIKI MAJĄ PEWNE OGRANICZENIA. W PRZECIWIEŃSTWIE DO HISTORII RZECZYWISTYCH WYNIKÓW, WYNIKI SYMULOWANE NIE ODZWIERCIEDLAJĄ RZECZYWISTEGO HANDLU. PONADTO, PONIEWAŻ TRANSAKCJE NIE ZOSTAŁY FAKTYCZNIE ZAWARTE, WYNIKI MOGĄ NIE UWZGLĘDNIAĆ WPŁYWU PEWNYCH CZYNNIKÓW RYNKOWYCH, TAKICH JAK BRAK PŁYNNOŚCI. SYMULOWANE PROGRAMY HANDLOWE Z REGUŁY CECHUJE RÓWNIEŻ TO, ŻE SĄ PROJEKTOWANE Z PERSPEKTYWY CZASU. NIE SKŁADA SIĘ ŻADNYCH OŚWIADCZEŃ, ŻE JAKIEKOLWIEK KONTO OSIĄGNIE LUB MA SZANSĘ OSIĄGNĄĆ ZYSKI LUB STRATY PODOBNE DO PRZEDSTAWIONYCH. NIE SKŁADA SIĘ ŻADNYCH OŚWIADCZEŃ, ŻE JAKIEKOLWIEK KONTO OSIĄGNIE LUB MA SZANSĘ OSIĄGNĄĆ ZYSKI LUB STRATY PODOBNE DO OMÓWIONYCH W TYM SERWISIE. W PRZYPADKU DECYZJI O INWESTOWANIU PRAWDZIWYCH PIENIĘDZY, WSZYSTKIE DECYZJE HANDLOWE NA RYNKACH FINANSOWYCH POWINNY BYĆ PODEJMOWANE SAMODZIELNIE.
    Bezpłatne

    Pliki

    • Snippet-StrategyXMLSettingsReader.sqm130 KBZablokowane

    Pobieranie odblokuje się po zakupie lub z aktywnym poziomem członkostwa.

    Szczegóły
    Wersja1.0.0
    Opublikowano19 października 2026
    Ostatnia aktualizacja2 listopada 2026
    AppSQ
    TypeSnippet
    AuthorEmmanuel
    App version145.3058
    Codebase categoryCustom Analysis