Esempio n. 1
0
 public bool SetReadOnly(bool value)
 {
     if (param.Contains(ReadOnlyParamName))
     {
         param[ReadOnlyParamName] = value ? 1 : 0;
         return(true);
     }
     return(false);
 }
        public double StandardOptimizationFunction(StrategyParameter sParam, string directory,
                                                   FxAdvisorCore.SimpleAdvisor advisor, ConfigReader configReader, out StrategyResultStatistics srResult)
        {
            srResult = new StrategyResultStatistics();
            if (!IsValid(sParam))
            {
                return(Double.MinValue);
            }

            string cacheKey = CreateKey(SampleData.Symbol, sParam, SampleData.Data.First().DateTime, SampleData.Data.Last().DateTime);

            if (cacheResult.ContainsKey(cacheKey))
            {
                return(cacheResult[cacheKey]);
            }

            using (Log4Smart.Logger logger = new Log4Smart.Logger(false))
            {
                string strategyName = System.Configuration.ConfigurationManager.AppSettings["ExportAdvisorName"];
                try
                {
                    Engine engine = new Engine(logger, logger);
                    advisor.TesterInit(sParam, logger);
                    Account acc = new Account(DefaultAccount.Balance, DefaultAccount.Commission);
                    engine.StartTest(SampleData, advisor, acc);
                    srResult = acc.Statistics;
                    if (!engine.IsTestSuccessfull)
                    {
                        if (string.IsNullOrEmpty(directory))
                        {
                            directory = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
                        }

                        string fullDir = directory + string.Format("/errors/{0}/{1}/{2}/", SampleData.Symbol, Guid.NewGuid().ToString(), StartTime.ToString("yyyyMMdd"));
                        configReader.SaveCurrentParameters(strategyName, sParam, fullDir);
                        logger.SaveLogToFile(fullDir, "error");
                        cacheResult[cacheKey] = Double.MinValue;

                        return(Double.MinValue);
                    }
                    if (sParam.Contains("MinAmountOrdersFLP") && acc.Statistics.NumberOrders < sParam["MinAmountOrdersFLP"] && string.IsNullOrEmpty(directory))
                    {
                        cacheResult[cacheKey] = Double.MinValue;
                        return(Double.MinValue);
                    }

                    if (!string.IsNullOrEmpty(directory))
                    {
                        string fullDir = directory + "/" + this.StartTime.ToString("yyyyMMdd") + "_" + (acc.Balance.ToString()) + "$";
                        configReader.SaveCurrentParameters(strategyName, sParam, fullDir);
                        logger.SaveLogToFile(fullDir, "allData");
                    }
                    if (DefaultAccount.Commission > 0)
                    {
                        cacheResult[cacheKey] = acc.Statistics.CalculateConfidenceIntervalLow;
                    }
                    else
                    {
                        cacheResult[cacheKey] = 10 - acc.Statistics.CalculateConfidenceIntervalHigh;
                    }

                    return(cacheResult[cacheKey]);
                }
                catch (Exception exc)
                {
                    (logger as Log4Smart.IStrategyLogger).AddMessage("{0}", exc.ToString());
                    if (string.IsNullOrEmpty(directory))
                    {
                        directory = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
                    }

                    string fullDir = directory + string.Format("/errors/{0}/{1}/", SampleData.Symbol, StartTime.ToString("yyyyMMdd"));
                    configReader.SaveCurrentParameters(strategyName, sParam, fullDir);
                    logger.SaveLogToFile(fullDir, "error");
                    cacheResult[cacheKey] = Double.MinValue;

                    return(Double.MinValue);
                }
            }
        }