Documentation
Applications
Last updated on 28. 11. 2021 by clonex / Ivan Hudec
Trade Analysis – Avg Edge Ratio by hour
Page contents
Trade Analysis Charts is a part of StrategQuant X results that allows us to visually analyze some properties of a strategy. In the following tutorial, we will show you how to create an analytical snippet that visually shows us the average edge ratio of a strategy as a function of the opening hour of the trade.
You can download finished snippet here.
Step 1 – Open Code Editor
Click on the Code editor icon to switch to Editor.
Step 2 – Create new Trade column
Open CodeEditor, click on Create new and choose Trade analysis chart option- Name it AvgEdgeRatioByHour. This will create a new snippet AvgEdgeRatioByHour.java in folder User/Snippets/SQ/TradeAnalysis In the constructor we define the name to be displayed.
public class AvgEdgeRatioByHour extends TradeAnalysisChart { public AvgEdgeRatioByHour() { this.name = L.tsq("Avg.Edge Ratio By Hour"); }
Step 3 – Modify draw method
In this method we specify the type of graph we want to create. We can choose from the following options
- BarChart
- ScatterChart
- PriceChart
Then you create an array into which you insert the data from the computeData array. Use the for loop to add the values calculated in the computeData array to the chart.
@Override public AbstractChart draw(OrdersList orders, byte plType, byte tradePeriod) { // creating new instance of chart BarChart chart = new BarChart(); chart.invertIfNegative(true); if(orders==null) { return chart; } // creating array here we store data computed in computeData method double[] hours = computeData(orders, plType, tradePeriod); // fill chart with array values for(int hour=0; hour<hours.length; hour++) { chart.addValue(L.tsq("Avg.Edge Ratio By Hour"), hour, hours[hour]/hoursCount[hour]); } return chart; }
Step 4 – Implement computeData array
private double[] computeData(OrdersList orders, byte plType, byte tradePeriod) { double[] hours = new double[24]; for(int hour=0; hour<hours.length; hour++) { hours[hour]=0; } int hour; // here we work with orderslist for(int i = 0; i < orders.size(); i++) { Order order = orders.get(i); hour = SQTime.getHour(order.getTimeByPeriodType(tradePeriod)); //0-23 double mae = order.PipsMAE; //get order MAE in pips double mfe = order.PipsMFE; // get order MAE in pips double atrOnOpen = order.ATROnOpen; // get order ATR in pips double normMAE = mae/atrOnOpen; // get normalized MAE double normMFE = mfe/atrOnOpen; // get normalized MFE double eRTrade = SQUtils.safeDivide(normMFE,normMAE); // SQUtils.safeDivide preceds null zero divide exception hours[hour]+= eRTrade; hoursCount[hour]+=1; }
Step 5 – Using Avg. Edge Ratio By Hour in Strategy Quant X
After compiling the snippet and restarting Code Editor and StrategyQUant X we can work with the newly created snippet.
Commented Code
package SQ.TradeAnalysis; import com.strategyquant.lib.*; import com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; public class AvgEdgeRatioByHour extends TradeAnalysisChart { // Class constructor where we define snippet name public AvgEdgeRatioByHour() { this.name = L.tsq("Avg.Edge Ratio By Hour"); } @Override public AbstractChart draw(OrdersList orders, byte plType, byte tradePeriod) { // creating new instance of chart BarChart chart = new BarChart(); chart.invertIfNegative(true); if(orders==null) { return chart; } // create array where we store data computed in computeData method double[] hours = computeData(orders, plType, tradePeriod); // fill chart with array values for(int hour=0; hour<hours.length; hour++) { // hours[hour]/hoursCount[hour] we compute average Edge Ratio per hour chart.addValue(L.tsq("Avg.Edge Ratio By Hour"), hour, hours[hour]/hoursCount[hour]); } return chart; } // create array for counting trades int [] hoursCount = new int[24]; private double[] computeData(OrdersList orders, byte plType, byte tradePeriod) { //create array where we store computed resultu double[] hours = new double[24]; // set values do default state 0 for(int hour=0; hour<hours.length; hour++) { hours[hour]=0; } int hour; // here we work with OrdersList orders for(int i = 0; i < orders.size(); i++) { Order order = orders.get(i); hour = SQTime.getHour(order.getTimeByPeriodType(tradePeriod)); //0-23 double mae = order.PipsMAE; //get order MAE in pips double mfe = order.PipsMFE; // get order MAE in pips double atrOnOpen = order.ATROnOpen; // get order ATR in pips double normMAE = mae/atrOnOpen; // get normalized MAE double normMFE = mfe/atrOnOpen; // get normalized MFE double eRTrade = SQUtils.safeDivide(normMFE,normMAE); // SQUtils.safeDivide preceds null zero divide exception // store edge ratio for every hour hours[hour]+= eRTrade; // count number of trades for every hour hoursCount[hour]+=1; } return hours; } }
Was this article helpful? The article was useful The article was not useful