StrategyQuant
AI asistent QAlgoCloudQuantAnalyzerQuantDataManager
Bezplatný kurzO společnosti
BlogDokumentaceFórumKontaktujte nás
BlogTržiště
Přihlásit se
Vytvořit účet zdarma

Produkt

  • Ceny a licence
  • Vzdělávání
  • Tržiště
  • Vyzkoušet zdarma

Právní informace

  • Podmínky služby
  • Zásady ochrany osobních údajů
  • Cookies

Kontakt

[email protected]

Společnost

StrategyQuant s.r.o.

Korunní 2569/108, Vinohrady, 101 00 Praha 10, Česká republika, EU

IČ: 04000498

DIČ: CZ04000498

Sociální sítě

  • Právní doložka | ZPRACOVÁNÍ A OCHRANA OSOBNÍCH ÚDAJŮ

    Minulá výkonnost není zárukou budoucího úspěchu. Všechny informace by měly být chápány výhradně jako vzdělávací

    Upozornění vyžadované vládou USA – Komise pro obchodování s komoditními futures (CFTC) uvádí: Obchodování s futures a opcemi s sebou nese vysoké potenciální výnosy, ale také vysoké potenciální riziko. Pro investování na trzích s futures a opcemi si musíte být vědomi těchto rizik a být ochotni je přijmout. Neobchodujte s penězi, které si nemůžete dovolit ztratit. Toto není výzva ani nabídka k nákupu/prodeji futures, akcií či opcí na ně. Nijak se neprohlašuje, že jakýkoli účet dosáhne nebo pravděpodobně dosáhne zisků či ztrát podobných těm, které jsou probírány v tomto dokumentu. Minulá výkonnost jakéhokoli obchodního systému nebo metodiky nemusí nutně vypovídat o budoucích výsledcích.

    PRAVIDLO CFTC 4.41 – HYPOTETICKÉ ČI SIMULOVANÉ VÝSLEDKY VÝKONNOSTI MAJÍ URČITÁ OMEZENÍ. NA ROZDÍL OD ZÁZNAMU SKUTEČNÉ VÝKONNOSTI NEPŘEDSTAVUJÍ SIMULOVANÉ VÝSLEDKY SKUTEČNÉ OBCHODOVÁNÍ. VZHLEDEM K TOMU, ŽE OBCHODY NEBYLY REÁLNĚ PROVEDENY, MOHOU VÝSLEDKY ZKRESLOVAT VLIV URČITÝCH TRŽNÍCH FAKTORŮ, JAKO JE NAPŘÍKLAD NEDOSTATEK LIKVIDITY. SIMULOVANÉ OBCHODNÍ PROGRAMY OBECNĚ PODLÉHAJÍ TAKÉ TOMU, ŽE JSOU NAVRHOVÁNY SE ZNALOSTÍ VÝVOJE TRHU ZPĚTNĚ. NEEXISTUJE ŽÁDNÁ ZÁRUKA ANI TVRZENÍ, ŽE JAKÝKOLI ÚČET DOSÁHNE NEBO PRAVDĚPODOBNĚ DOSÁHNE ZISKŮ ČI ZTRÁT PODOBNÝCH TĚM, KTERÉ JSOU ZDE ZOBRAZENY.

    NIJAK SE NEPROHLAŠUJE, ŽE JAKÝKOLI ÚČET DOSÁHNE NEBO PRAVDĚPODOBNĚ DOSÁHNE ZISKŮ ČI ZTRÁT PODOBNÝCH TĚM, O KTERÝCH SE PÍŠE NA TĚCHTO STRÁNKÁCH. POKUD SE ROZHODNETE INVESTOVAT SKUTEČNÉ PENÍZE, VEŠKERÁ OBCHODNÍ ROZHODNUTÍ NA FINANČNÍCH TRZÍCH MUSÍ BÝT POUZE VAŠE VLASTNÍ.

    © StrategyQuant 2026

    Běží na Klaudie.ai

    Zpět na tržištěDIGITAL

    Největší MAE při více obchodech

    StrategyQuantPluginy
    Největší MAE při více obchodech

    Počítá nejhorší kombinovanou maximální nepříznivou odchylku (MAE), když je současně otevřeno více pozic, a pomáhá tak kvantifikovat drawdowny u strategií se vstupem po koších (basket entry).

    Největší MAE – užitečné pro analýzu strategií s jedním nebo více příkazy.

    Více příkazů vs. jeden příkaz

    Efektivnější je rozložit riziko mezi koš příkazů než použít jediný příkaz. Vícenásobné vstupní pozice poskytují větší flexibilitu, aniž by vyžadovaly naprosto přesné načasování jediného vstupu.

    Při otevírání více příkazů současně ve stejném směru spočítejte celkový MAE všech otevřených pozic. Pokud jsou pozice v opačných směrech (hedging), odečtěte MFE opačných pozic od většího MAE a získejte globální MAE.

    Čtyři snippety

    BiggestMAEallTrade – Největší MAE na jeden kontrakt, normalizovaný na kontrakt pro přesné výsledky, i když strategie během backtestování zvyšuje velikost kontraktu.

    package SQ.Columns.Databanks;
    import com.strategyquant.lib.L;
    import com.strategyquant.lib.SQUtils;
    import com.strategyquant.lib.SettingsMap;
    import com.strategyquant.tradinglib.*;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.*;
    import java.lang.*;  
    // Mode in France by Emmanuel Evrard for the StrategyQuantX Community :)
    public class BiggestMAEallTrade extends DatabankColumn 
    {
        public BiggestMAEallTrade() 
        {
            super(L.tsq("Biggest Multiple MAE"), DatabankColumn.Decimal2PL, ValueTypes.Minimize, 0, 0, 100);
            setWidth(140);
            setTooltip(L.tsq("Biggest Multiple MAE - is the worst Maximum Adverse Excursion of all trades open at once"));
        }
        //------------------------------------------------------------------------
        @Override
        public double compute(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) throws Exception 
        {
            double worstMAE = -Double.MAX_VALUE;
            Date date = new Date();
            Date dateTemp = new Date();
            double Total1 = 0;
            double Size1 = 0;
            for(int i = 0; i<ordersList.size(); i++) 
            {
                Order order = ordersList.get(i);
                dateTemp = new Date(order.CloseTime);
                Size1 = order.Size;
                if (Size1 == 0) { Size1 = 0.01; }
                if (dateTemp.equals(date))
                {
                    Total1 += order.MAE;
                }
                else
                {
                    date = new Date(order.CloseTime);
                    Total1 = order.MAE;
                }
                if((Total1 / Size1)  > worstMAE) 
                {
                    worstMAE = (Total1/order.Size);
                }
            }
            return -1*worstMAE;
        }
    }
    

    BiggestMAEallTradePct – Největší MAE jako procento ze zůstatku účtu. Ukazuje, zda strategie využívá přiměřené riziko vzhledem k účtu (např. při porovnání s maximální denní ztrátou 5 %).

    package SQ.Columns.Databanks;
    import com.strategyquant.lib.L;
    import com.strategyquant.lib.SQUtils;
    import com.strategyquant.lib.SettingsMap;
    import com.strategyquant.tradinglib.*;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.*;
    import java.lang.*;  
    // Mode in France by Emmanuel Evrard for the StrategyQuantX Community :)
    public class BiggestMAEallTradePct extends DatabankColumn 
    {
        public BiggestMAEallTradePct() 
        {
            super(L.tsq("Biggest Multiple MAE %"), DatabankColumn.Decimal2Pct, ValueTypes.Minimize, 0, 0, 100);
            setWidth(70);
            setTooltip(L.tsq("Biggest Multiple MAE % - is the worst Maximum Adverse Excursion of all trades open at once compared to AccountBalance"));
        }
        @Override
        public double compute(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) throws Exception 
        {
            double worstMAE = -Double.MAX_VALUE;
            Date date = new Date();
            Date dateTemp = new Date();
            double Total1 = 0;
            double Total2 = 0;
            for(int i = 0; i<ordersList.size(); i++) 
            {
                Order order = ordersList.get(i);
                dateTemp = new Date(order.CloseTime);
                if (dateTemp.equals(date))
                {
                    Total1 += order.MAE;
                }
                else
                {
                    date = new Date(order.CloseTime);
                    Total1 = order.MAE;
                }
                Total2 = SQUtils.safeDivide(Total1, order.AccountBalance - order.PL) * 100.0;
                if(Total2  > worstMAE) 
                {
                    worstMAE = Total2;
                }
            }
            return -1*worstMAE;
        }
    }
    

    BiggestMAEallHedgingTrade a BiggestMAEallHedgingTradePct – Pro hedgované pozice v opačných směrech. Vezme větší MAE a odečte MFE opačného směru. Funguje, když jsou během většího MAE otevřeny obchody v opačném směru.

    package SQ.Columns.Databanks;
    import com.strategyquant.lib.L;
    import com.strategyquant.lib.SQUtils;
    import com.strategyquant.lib.SettingsMap;
    import com.strategyquant.tradinglib.*;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.*;
    import java.lang.*;  
    // Mode in France by Emmanuel Evrard for the StrategyQuantX Community :)
    public class BiggestMAEallHedgingTrade extends DatabankColumn 
    {
        public BiggestMAEallHedgingTrade() 
        {
            super(L.tsq("Biggest Multiple Hedging MAE"), DatabankColumn.Decimal2PL, ValueTypes.Minimize, 0, 0, 100);
            setWidth(140);
            setTooltip(L.tsq("Biggest Multiple Hedging MAE - is the worst Maximum Adverse Excursion of all trades open at once"));
        }
        //------------------------------------------------------------------------
        @Override
        public double compute(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) throws Exception 
        {
            double worstMAE1= -Double.MAX_VALUE;
            double worstMAE2 = -Double.MAX_VALUE;
            double BesttMFE1= -Double.MAX_VALUE;
            Date date = new Date();
            Date dateTemp = new Date();
            double Total1 = 0;
            double Size1 = 0;
            int direction = 0;
            for(int i = 0; i < ordersList.size(); i++) 
            {
                Order order = ordersList.get(i);
                dateTemp = new Date(order.CloseTime);
                Size1 = order.Size;
                direction=order.getDirection();
                if (direction == 1)     								// Bullish positions
                {
                    if (Size1 == 0) { Size1 = 0.01; }
                    if (dateTemp.equals(date))
                    {
                        Total1 += order.MAE;
                    }
                    else
                    {
                        date = new Date(order.CloseTime);
                        Total1 = order.MAE;
                    }
                    if((Total1 / Size1)  > worstMAE1) 
                    {
                        worstMAE1 = (Total1/order.Size);
                    }
                }
            }
            Total1 = 0;
            for(int i = 0; i < ordersList.size(); i++) 
            {
                Order order = ordersList.get(i);
                dateTemp = new Date(order.CloseTime);
                Size1 = order.Size;
                direction=order.getDirection();
                if (direction == -1)     								// Bearish positions
                {
                    if (Size1 == 0) { Size1 = 0.01; }
                    if (dateTemp.equals(date))
                    {
                        Total1 += order.MAE;
                    }
                    else
                    {
                        date = new Date(order.CloseTime);
                        Total1 = order.MAE;
                    }
                    if((Total1 / Size1)  > worstMAE2) 
                    {
                        worstMAE2 = (Total1/order.Size);
                    }
                }
            }
            if (worstMAE1 >= worstMAE2)
            {
                Total1 = 0;
                for(int i = 0; i < ordersList.size(); i++) 
                {
                    Order order = ordersList.get(i);
                    dateTemp = new Date(order.CloseTime);
                    Size1 = order.Size;
                    direction=order.getDirection();
                    if (direction == -1)     								// Bearish positions
                    {
                        if (Size1 == 0) { Size1 = 0.01; }
                        if (dateTemp.equals(date))
                        {
                            Total1 += order.MFE;
                        }
                        else
                        {
                            date = new Date(order.CloseTime);
                            Total1 = order.MFE;
                        }
                        if((Total1 / Size1)  > BesttMFE1) 
                        {
                            BesttMFE1 = (Total1/order.Size);
                        }
                    }
                }
                return -1*(worstMAE1 - BesttMFE1);
            }
            else if (worstMAE2 > worstMAE1)
            {
                Total1 = 0;
                for(int i = 0; i < ordersList.size(); i++) 
                {
                    Order order = ordersList.get(i);
                    dateTemp = new Date(order.CloseTime);
                    Size1 = order.Size;
                    direction=order.getDirection();
                    if (direction == 1)     								// Bullish positions
                    {
                        if (Size1 == 0) { Size1 = 0.01; }
                        if (dateTemp.equals(date))
                        {
                            Total1 += order.MFE;
                        }
                        else
                        {
                            date = new Date(order.CloseTime);
                            Total1 = order.MFE;
                        }
                        if((Total1 / Size1)  > BesttMFE1) 
                        {
                            BesttMFE1 = (Total1/order.Size);
                        }
                    }
                }
                return -1*(worstMAE2 - BesttMFE1);
            }
            return 0;
        }
    }
    
    package SQ.Columns.Databanks;
    import com.strategyquant.lib.L;
    import com.strategyquant.lib.SQUtils;
    import com.strategyquant.lib.SettingsMap;
    import com.strategyquant.tradinglib.*;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.*;
    import java.lang.*;  
    // Mode in France by Emmanuel Evrard for the StrategyQuantX Community :)
    public class BiggestMAEallHedgingTradePct extends DatabankColumn 
    {
        public BiggestMAEallHedgingTradePct() 
        {
            super(L.tsq("Biggest Multiple Hedging MAE %"), DatabankColumn.Decimal2Pct, ValueTypes.Minimize, 0, 0, 100);
            setWidth(100);
            setTooltip(L.tsq("Biggest Multiple Hedging MAE % - is the worst Maximum Adverse Excursion of all trades open at once compared to AccountBalance"));
        }
        @Override
        public double compute(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) throws Exception 
        {
            double worstMAE1= -Double.MAX_VALUE;
            double worstMAE2 = -Double.MAX_VALUE;
            double BesttMFE1= -Double.MAX_VALUE;
            Date date = new Date();
            Date dateTemp = new Date();
            double Total1 = 0;
            double Total2 = 0;
            int direction = 0;
            for(int i = 0; i<ordersList.size(); i++) 
            {
                Order order = ordersList.get(i);
                dateTemp = new Date(order.CloseTime);
                direction=order.getDirection();
                if (direction == 1)      								// Bullish position
                {
                    if (dateTemp.equals(date))
                    {
                        Total1 += order.MAE;
                    }
                    else
                    {
                        date = new Date(order.CloseTime);
                        Total1 = order.MAE;
                    }
                    Total2 = SQUtils.safeDivide(Total1, order.AccountBalance - order.PL) * 100.0;
                    if(Total2  > worstMAE1) 
                    {
                        worstMAE1 = Total2;
                    }
                }
            }
            Total1 = 0;
            for(int i = 0; i<ordersList.size(); i++) 
            {
                Order order = ordersList.get(i);
                dateTemp = new Date(order.CloseTime);
                direction=order.getDirection();
                if (direction == -1)      								// Bearish position
                {
                    if (dateTemp.equals(date))
                    {
                        Total1 += order.MAE;
                    }
                    else
                    {
                        date = new Date(order.CloseTime);
                        Total1 = order.MAE;
                    }
                    Total2 = SQUtils.safeDivide(Total1, order.AccountBalance - order.PL) * 100.0;
                    if(Total2  > worstMAE2) 
                    {
                        worstMAE2 = Total2;
                    }
                }
            }
            if (worstMAE1 >= worstMAE2)
            {
                Total1 = 0;
                for(int i = 0; i<ordersList.size(); i++) 
                {
                    Order order = ordersList.get(i);
                    dateTemp = new Date(order.CloseTime);
                    direction=order.getDirection();
                    if (direction == -1)      								// Bearish position
                    {
                        if (dateTemp.equals(date))
                        {
                            Total1 += order.MFE;
                        }
                        else
                        {
                            date = new Date(order.CloseTime);
                            Total1 = order.MFE;
                        }
                        Total2 = SQUtils.safeDivide(Total1, order.AccountBalance - order.PL) * 100.0;
                        if(Total2  > BesttMFE1) 
                        {
                            BesttMFE1 = Total2;
                        }
                    }
                }
                return -1*(worstMAE1 - BesttMFE1);
            }
            else if (worstMAE2 > worstMAE1)
            {
                Total1 = 0;
                for(int i = 0; i<ordersList.size(); i++) 
                {
                    Order order = ordersList.get(i);
                    dateTemp = new Date(order.CloseTime);
                    direction=order.getDirection();
                    if (direction == 1)      								// Bullish position
                    {
                        if (dateTemp.equals(date))
                        {
                            Total1 += order.MFE;
                        }
                        else
                        {
                            date = new Date(order.CloseTime);
                            Total1 = order.MFE;
                        }
                        Total2 = SQUtils.safeDivide(Total1, order.AccountBalance - order.PL) * 100.0;
                        if(Total2  > BesttMFE1) 
                        {
                            BesttMFE1 = Total2;
                        }
                    }
                }
                return -1*(worstMAE2 - BesttMFE1);
            }
            return 0;
        }
    }
    
    Minulá výkonnost není zárukou budoucích výsledků. Všechny informace by měly být považovány pouze za vzdělávací Upozornění vyžadované vládou SPOJENÝCH STÁTŮ – Commodity Futures Trading Commission informuje: Obchodování s futures a opcemi přináší velký potenciální zisk, ale také velké potenciální riziko. Abyste mohli investovat na trzích s futures a opcemi, musíte si být vědomi těchto rizik a být ochotni je přijmout. Neobchodujte s penězi, které si nemůžete dovolit ztratit. Toto není výzva ani nabídka k nákupu/prodeji futures, akcií nebo opcí na ně. Žádné tvrzení nenaznačuje, že jakýkoli účet dosáhne nebo pravděpodobně dosáhne zisků či ztrát podobných těm, o kterých se hovoří v tomto dokumentu. Minulá výkonnost jakéhokoli obchodního systému nebo metodiky nemusí nutně vypovídat o budoucích výsledcích. PRAVIDLO CFTC 4.41 – VÝSLEDKY HYPOTETICKÉ ČI SIMULOVANÉ VÝKONNOSTI MAJÍ URČITÁ OMEZENÍ. NA ROZDÍL OD ZÁZNAMU SKUTEČNÉ VÝKONNOSTI SIMULOVANÉ VÝSLEDKY NEPŘEDSTAVUJÍ SKUTEČNÉ OBCHODOVÁNÍ. VZHLEDEM K TOMU, ŽE OBCHODY NEBYLY SKUTEČNĚ PROVEDENY, MOHOU VÝSLEDKY ZKRESLOVAT VLIV URČITÝCH TRŽNÍCH FAKTORŮ, JAKO JE NAPŘÍKLAD NEDOSTATEK LIKVIDITY. SIMULOVANÉ OBCHODNÍ PROGRAMY OBECNĚ PODLÉHAJÍ TAKÉ SKUTEČNOSTI, ŽE JSOU NAVRŽENY SE ZPĚTNÝM POHLEDEM NA HISTORICKÁ DATA. ŽÁDNÉ TVRZENÍ NENAZNAČUJE, ŽE JAKÝKOLI ÚČET DOSÁHNE NEBO PRAVDĚPODOBNĚ DOSÁHNE ZISKŮ ČI ZTRÁT PODOBNÝCH TĚM, KTERÉ JSOU ZDE UVEDENY. ŽÁDNÉ TVRZENÍ NENAZNAČUJE, ŽE JAKÝKOLI ÚČET DOSÁHNE NEBO PRAVDĚPODOBNĚ DOSÁHNE ZISKŮ ČI ZTRÁT PODOBNÝCH TĚM, O KTERÝCH SE HOVOŘÍ NA TĚCHTO STRÁNKÁCH. POKUD SE ROZHODNETE INVESTOVAT SKUTEČNÉ PENÍZE, VEŠKERÁ OBCHODNÍ ROZHODNUTÍ NA FINANČNÍCH TRZÍCH BY MĚLA BÝT POUZE VAŠE VLASTNÍ.
    Zdarma

    Soubory

    • Snippet-BiggestMAEonmultipletrades.sqm14 KBUzamčeno

    Stažení se odemkne po nákupu nebo s aktivním tierem.

    Podrobnosti
    Verze1.0.0
    Zveřejněno19. října 2026
    Poslední aktualizace2. listopadu 2026
    AppSQ
    TypeSnippet
    AuthorEmmanuel
    App version145.3058
    Codebase categoryDatabank / Filter