Custom Optimization Criteria (TakeProfit and StopLoss)

Carlos Duarte's avatar
Carlos Duarte since: 16 Jan 2015; 
 26 Feb 2015, 01:20
Custom Optimization Criteria (TakeProfit and StopLoss)
Know tell me that it is correct ?
I wish the takeprofit and the stoploss function as selection criteria
 protected override double GetFitness(GetFitnessArgs args)
        {
            //maximize count of winning trades and minimize count of losing trades
            return (args.NetProfit * args.WinningTrades * TakeProfit) / (args.MaxEquityDrawdownPercentages * StopLoss);
        }
Robots do not cry!
Carlos Duarte's avatar
Carlos Duarte since: 16 Jan 2015; 
 26 Feb 2015, 03:31
I discovered how powerful custom criteria .
The example below was exactly what I was looking for optimization.
Test and tell me what you think ?
protected override double GetFitness(GetFitnessArgs args)
        {
            //maximize count of winning trades and minimize count of losing trades
            return (Math.Pow(args.NetProfit, 3) * Math.Pow(args.WinningTrades, 2) * TakeProfit) / (Math.Pow(args.MaxEquityDrawdownPercentages, 2) * Math.Pow(StopLoss, 2) * args.MaxEquityDrawdown);
            //return (args.NetProfit * args.WinningTrades) / (args.MaxEquityDrawdownPercentages * StopLoss);
        }
Robots do not cry!
Carlos Duarte's avatar
Carlos Duarte since: 16 Jan 2015; 
 26 Feb 2015, 13:30

Always found problems in optimization keep Takprofit greater than the stoploss and still have a consistent gain. The modification below by dividing the (takeprofit / stoploss), he seeks the best results tend to keep esssa major / minor relationship. And put the end to keep both (if possible) lower, as in my case use in M15.

It Works ...

Robots do not cry!
Carlos Duarte's avatar
Carlos Duarte since: 16 Jan 2015; 
 26 Feb 2015, 13:30
protected override double GetFitness(GetFitnessArgs args)
        {
            //maximize count of winning trades and minimize count of losing trades
            return (Math.Pow(args.NetProfit, 3) * Math.Pow(args.WinningTrades, 2) * (TakeProfit/StopLoss)) / (Math.Pow(args.MaxEquityDrawdownPercentages, 2) * TakeProfit * StopLoss * args.MaxEquityDrawdown);
            //return (args.NetProfit * args.WinningTrades) / (args.MaxEquityDrawdownPercentages * StopLoss);
        }
Robots do not cry!
modarkat's avatar
modarkat since: 25 Dec 2013; 
 27 Feb 2015, 15:10

There are other interesting functions you can implement in GetFitness:

http://tradinggame.com.au/introduction-to-backtesting-metrics-part-2/

My favorite one is PROM.

Carlos Duarte's avatar
Carlos Duarte since: 16 Jan 2015; 
 28 Feb 2015, 05:16
RE:

Thanks for the info. Looking more about it, I found this code.
I will implement it as a test.

modarkat said:

There are other interesting functions you can implement in GetFitness:

http://tradinggame.com.au/introduction-to-backtesting-metrics-part-2/

My favorite one is PROM.

Robots do not cry!
Carlos Duarte's avatar
Carlos Duarte since: 16 Jan 2015; 
 28 Feb 2015, 05:16
// MultiCharts Custom Criteria: Pessimistic Return on Margin (PROM) by Robert Pardo

// Change the value below to your account size
var AccountSize = 10000;

/* The code below can be left untouched  */

// check for errors / wrong values
if (AccountSize < 1 || StrategyPerformance.WinningTrades == 0 ||
    StrategyPerformance.LosingTrades == 0) {
    return 0;
}

var sqrtWins = Math.sqrt(StrategyPerformance.WinningTrades);
var sqrtLosses = Math.sqrt(StrategyPerformance.LosingTrades);

return ( ((StrategyPerformance.AvgWinningTrade * (StrategyPerformance.WinningTrades - sqrtWins) ) -
    ( -StrategyPerformance.AvgLosingTrade * (StrategyPerformance.LosingTrades + sqrtLosses) )) /
    AccountSize) * 100;
Robots do not cry!
prof.edson.nascimento's avatar
prof.edson.nascimento since: 25 Nov 2015; 
 25 Nov 2015, 20:56
RE:

How I call this method and what arguments I will put to them?

protected override double GetFitness(GetFitnessArgs args)

cjdduarte said:

I discovered how powerful custom criteria .
The example below was exactly what I was looking for optimization.
Test and tell me what you think ?
protected override double GetFitness(GetFitnessArgs args)
        {
            //maximize count of winning trades and minimize count of losing trades
            return (Math.Pow(args.NetProfit, 3) * Math.Pow(args.WinningTrades, 2) * TakeProfit) / (Math.Pow(args.MaxEquityDrawdownPercentages, 2) * Math.Pow(StopLoss, 2) * args.MaxEquityDrawdown);
            //return (args.NetProfit * args.WinningTrades) / (args.MaxEquityDrawdownPercentages * StopLoss);
        }
cTrader Team's avatar
cTrader Team since: 23 Sep 2013; 
 25 Nov 2015, 23:26

Dear Trader,

Please have a look at the Optimization Criteria section of cAlgo support site.

TRADERS FIRSTâ„¢ Vote for your favorite features: http://vote.spotware.com/
davidp13 since: 06 May 2014; 
 02 Dec 2016, 10:56
RE:

Hi. How will you go about calculating the AvgWinning or AvgLosing trade?

cjdduarte said:

// MultiCharts Custom Criteria: Pessimistic Return on Margin (PROM) by Robert Pardo

// Change the value below to your account size
var AccountSize = 10000;

/* The code below can be left untouched  */

// check for errors / wrong values
if (AccountSize < 1 || StrategyPerformance.WinningTrades == 0 ||
    StrategyPerformance.LosingTrades == 0) {
    return 0;
}

var sqrtWins = Math.sqrt(StrategyPerformance.WinningTrades);
var sqrtLosses = Math.sqrt(StrategyPerformance.LosingTrades);

return ( ((StrategyPerformance.AvgWinningTrade * (StrategyPerformance.WinningTrades - sqrtWins) ) -
    ( -StrategyPerformance.AvgLosingTrade * (StrategyPerformance.LosingTrades + sqrtLosses) )) /
    AccountSize) * 100;