Overall Statistics |
Total Trades 301 Average Win 0.19% Average Loss -0.11% Annual Return 0.556% Drawdown 4.100% Expectancy 0.027 Net Profit 0.806% Sharpe Ratio 0.2 Loss Rate 63% Win Rate 37% Profit-Loss Ratio 1.78 Trade Frequency Daily trades |
using System; using System.Collections; using System.Collections.Generic; namespace QuantConnect { using QuantConnect.Securities; using QuantConnect.Models; public partial class BasicTemplateAlgorithm : QCAlgorithm, IAlgorithm { string symbol = "EURUSD"; decimal brickSize = .001m; decimal greed = .5m; decimal renkoPrice; int trendConfirm = 4; int[] sign; bool initialized = false; //Initialize the data and resolution you require for your strategy: public override void Initialize() { //Initialize the start, end dates for simulation; cash and data required. SetStartDate(2013, 01, 01); SetEndDate(2014, 01, 01); SetCash(30000); //Starting Cash in USD. AddSecurity(SecurityType.Forex, symbol, Resolution.Tick); //Minute, Second or Tick SetRunMode(RunMode.Series); //Series or Parallel for intraday strategies. } //Handle Tick Events - Only when you're requesting tick data public override void OnTick(Dictionary<string, List<Tick>> ticks) { foreach (Tick tick in ticks[symbol]) { if (initialized) { if (tick.Price > renkoPrice + brickSize) { while (renkoPrice < tick.Price - brickSize) { renkoPrice += brickSize; for (int i = 0; i < trendConfirm - 1; i++) { sign[i] = sign[i+1]; } sign[trendConfirm - 1] = 1; } } else if (tick.Price < renkoPrice - brickSize) { while (renkoPrice > tick.Price + brickSize) { renkoPrice -= brickSize; for (int i = 0; i < trendConfirm - 1; i++) { sign[i] = sign[i+1]; } sign[trendConfirm - 1] = -1; } } bool allNegative = true; bool allPositive = true; for (int i = 0; i < trendConfirm; i++) { if (sign[i] != -1) { allNegative = false; } else if (sign[i] != 1) { allPositive = false; } } if (allPositive && tick.Price < renkoPrice - greed * brickSize) { if (Portfolio[symbol].HoldStock && Portfolio[symbol].Quantity < 0) { Order(symbol, -2*Portfolio[symbol].Quantity); } else if (!Portfolio[symbol].HoldStock) { Order(symbol, 10000); } } else if (allNegative && tick.Price > renkoPrice + greed * brickSize) { if (Portfolio[symbol].HoldStock && Portfolio[symbol].Quantity > 0) { Order(symbol, -2*Portfolio[symbol].Quantity); } else if (!Portfolio[symbol].HoldStock) { Order(symbol, -10000); } } } else { renkoPrice = tick.Price; sign = new int[trendConfirm]; initialized = true; } } } } }