public void LiveForexAlgorithms_CanBeUsedWithFXCM_Successfully() { var user = Config.Get("fxcm-user-name"); var password = Config.Get("fxcm-password"); var account = Config.Get("fxcm-account-id"); var file = new List <ProjectFile> { new ProjectFile { Name = "main.cs", Code = File.ReadAllText("../../../Algorithm.CSharp/BasicTemplateForexAlgorithm.cs") } }; // Create a new project var project = _api.CreateProject("Test project - " + DateTime.Now, Language.CSharp); Assert.IsTrue(project.Success); // Update Project var update = _api.UpdateProject(project.ProjectId, file); Assert.IsTrue(update.Success); // Create compile var compile = _api.CreateCompile(project.ProjectId); Assert.IsTrue(compile.Success); // Create default algorithm settings var settings = new FXCMLiveAlgorithmSettings(user, password, BrokerageEnvironment.Paper, account); // Wait for project to compile Thread.Sleep(10000); // Create live default algorithm var createLiveAlgorithm = _api.CreateLiveAlgorithm(project.ProjectId, compile.CompileId, "server512", settings); Assert.IsTrue(createLiveAlgorithm.Success); if (stopLiveAlgos) { // Liquidate live algorithm var liquidateLive = _api.LiquidateLiveAlgorithm(project.ProjectId); Assert.IsTrue(liquidateLive.Success); // Stop live algorithm var stopLive = _api.StopLiveAlgorithm(project.ProjectId); Assert.IsTrue(stopLive.Success); // Delete the project var deleteProject = _api.DeleteProject(project.ProjectId); Assert.IsTrue(deleteProject.Success); } }
/// <summary> /// Runs the algorithm with the given settings and file /// </summary> /// <param name="settings">Settings for Lean</param> /// <param name="file">File to run</param> private void RunLiveAlgorithm(BaseLiveAlgorithmSettings settings, ProjectFile file) { // Create a new project var project = _api.CreateProject($"Test project - {DateTime.Now.ToStringInvariant()}", Language.CSharp); // Add Project Files var addProjectFile = _api.AddProjectFile(project.Projects.First().ProjectId, file.Name, file.Code); Assert.IsTrue(addProjectFile.Success); // Create compile var compile = _api.CreateCompile(project.Projects.First().ProjectId); Assert.IsTrue(compile.Success); // Wait at max 30 seconds for project to compile Compile compileCheck = WaitForCompilerResponse(project.Projects.First().ProjectId, compile.CompileId, 30); Assert.IsTrue(compileCheck.Success); Assert.IsTrue(compileCheck.State == CompileState.BuildSuccess); // Get a live node to launch the algorithm on var nodes = _api.ReadNodes(_testOrganization); Assert.IsTrue(nodes.Success); var freeNode = nodes.LiveNodes.Where(x => x.Busy == false); Assert.IsNotEmpty(freeNode, "No free Live Nodes found"); // Create live default algorithm var createLiveAlgorithm = _api.CreateLiveAlgorithm(project.Projects.First().ProjectId, compile.CompileId, freeNode.FirstOrDefault().Id, settings); Assert.IsTrue(createLiveAlgorithm.Success); if (stopLiveAlgos) { // Liquidate live algorithm; will also stop algorithm var liquidateLive = _api.LiquidateLiveAlgorithm(project.Projects.First().ProjectId); Assert.IsTrue(liquidateLive.Success); // Delete the project var deleteProject = _api.DeleteProject(project.Projects.First().ProjectId); Assert.IsTrue(deleteProject.Success); } }
private void Perform_CreateCompileBackTest_Tests(string projectName, Language language, string algorithmName, string code) { //Test create a new project successfully var project = _api.CreateProject(projectName, language); Assert.IsTrue(project.Success); Assert.IsTrue(project.Projects.First().ProjectId > 0); Assert.IsTrue(project.Projects.First().Name == projectName); // Make sure the project just created is now present var projects = _api.ListProjects(); Assert.IsTrue(projects.Success); Assert.IsTrue(projects.Projects.Any(p => p.ProjectId == project.Projects.First().ProjectId)); // Test read back the project we just created var readProject = _api.ReadProject(project.Projects.First().ProjectId); Assert.IsTrue(readProject.Success); Assert.IsTrue(readProject.Projects.First().Name == projectName); // Test set a project file for the project var file = new ProjectFile { Name = algorithmName, Code = code }; var addProjectFile = _api.AddProjectFile(project.Projects.First().ProjectId, file.Name, file.Code); Assert.IsTrue(addProjectFile.Success); // Download the project again to validate its got the new file var verifyRead = _api.ReadProject(project.Projects.First().ProjectId); Assert.IsTrue(verifyRead.Success); // Compile the project we've created var compileCreate = _api.CreateCompile(project.Projects.First().ProjectId); Assert.IsTrue(compileCreate.Success); Assert.IsTrue(compileCreate.State == CompileState.InQueue); // Read out the compile var compileSuccess = WaitForCompilerResponse(project.Projects.First().ProjectId, compileCreate.CompileId); Assert.IsTrue(compileSuccess.Success); Assert.IsTrue(compileSuccess.State == CompileState.BuildSuccess); // Update the file, create a build error, test we get build error file.Code += "[Jibberish at end of the file to cause a build error]"; _api.UpdateProjectFileContent(project.Projects.First().ProjectId, file.Name, file.Code); var compileError = _api.CreateCompile(project.Projects.First().ProjectId); compileError = WaitForCompilerResponse(project.Projects.First().ProjectId, compileError.CompileId); Assert.IsTrue(compileError.Success); // Successfully processed rest request. Assert.IsTrue(compileError.State == CompileState.BuildError); //Resulting in build fail. // Using our successful compile; launch a backtest! var backtestName = $"{DateTime.Now.ToStringInvariant("u")} API Backtest"; var backtest = _api.CreateBacktest(project.Projects.First().ProjectId, compileSuccess.CompileId, backtestName); Assert.IsTrue(backtest.Success); // Now read the backtest and wait for it to complete var backtestRead = WaitForBacktestCompletion(project.Projects.First().ProjectId, backtest.BacktestId); Assert.IsTrue(backtestRead.Success); Assert.IsTrue(backtestRead.Progress == 1); Assert.IsTrue(backtestRead.Name == backtestName); Assert.IsTrue(backtestRead.Result.Statistics["Total Trades"] == "1"); // Verify we have the backtest in our project var listBacktests = _api.ListBacktests(project.Projects.First().ProjectId); Assert.IsTrue(listBacktests.Success); Assert.IsTrue(listBacktests.Backtests.Count >= 1); Assert.IsTrue(listBacktests.Backtests[0].Name == backtestName); // Update the backtest name and test its been updated backtestName += "-Amendment"; var renameBacktest = _api.UpdateBacktest(project.Projects.First().ProjectId, backtest.BacktestId, backtestName); Assert.IsTrue(renameBacktest.Success); backtestRead = _api.ReadBacktest(project.Projects.First().ProjectId, backtest.BacktestId); Assert.IsTrue(backtestRead.Name == backtestName); //Update the note and make sure its been updated: var newNote = DateTime.Now.ToStringInvariant("u"); var noteBacktest = _api.UpdateBacktest(project.Projects.First().ProjectId, backtest.BacktestId, note: newNote); Assert.IsTrue(noteBacktest.Success); backtestRead = _api.ReadBacktest(project.Projects.First().ProjectId, backtest.BacktestId); Assert.IsTrue(backtestRead.Note == newNote); // Delete the backtest we just created var deleteBacktest = _api.DeleteBacktest(project.Projects.First().ProjectId, backtest.BacktestId); Assert.IsTrue(deleteBacktest.Success); // Test delete the project we just created var deleteProject = _api.DeleteProject(project.Projects.First().ProjectId); Assert.IsTrue(deleteProject.Success); }