#include <quant1x/quant1x.h>
#include <sstream>
#include "user/no0.h"
#include "user/strategy-no0.h"
#include <quant1x/command.h>
#include <quant1x/datasets.h>
#include <private/build-info.h>
#include <quant1x/runtime/config.h>
#include <quant1x/cache.h>
static std::string build_version_info() {
std::ostringstream oss;
oss << " quant1x project: "<< io::executable_name() << " - Build Info\n";
oss << "--------------------------------------------------------------------------------\n";
oss << " Version : " << VERSION_STRING << "\n";
oss << " Author : " << GIT_AUTHOR_NAME << " <" << GIT_AUTHOR_EMAIL << ">\n";
oss << " Commit Hash : " << GIT_COMMIT_HASH << "\n";
oss << " Latest Tag : " << GIT_LATEST_TAG << "\n";
oss << " Build Date : " << GIT_BUILD_DATE << "\n";
oss << "--------------------------------------------------------------------------------\n";
oss << " Operating System : " << CXX_OS << "\n";
oss << " Build System : " << CXX_SYSTEM << "\n";
oss << "Processor Architecture : " << CXX_ARCH << "\n";
oss << " C++ Standard : " << CXX_STANDARD << "\n";
oss << " C++ Standard Required : " << CXX_STANDARD_REQUIRED << "\n";
oss << " C++ Extensions : " << CXX_EXTENSIONS << "\n";
oss << " C++ Compiler ID : " << CXX_COMPILER_ID << "\n";
oss << " C++ Compiler version : " << CXX_COMPILER_VERSION << "\n";
oss << " C++ flags : " << CXX_FLAGS << "\n";
auto build_type = strings::to_lower(BUILD_TYPE);
if(build_type == "debug") {
oss << " C++ flags(Debug) : ";
oss << CXX_FLAGS_DEBUG << "\n";
oss << " Linker flags(Debug) : ";
oss << EXE_LINKER_FLAGS_DEBUG << "\n";
} else {
oss << " C++ flags(Release) : ";
oss << CXX_FLAGS_RELEASE << "\n";
oss << " Linker flags(Release) : ";
oss << EXE_LINKER_FLAGS_RELEASE << "\n";
}
oss << "Target Compile Options : " << TARGET_COMPILE_OPTIONS << "\n";
return oss.str();
}
int main(const int argc, const char *const argv[]) {
std::string program_name = io::executable_name();
std::string program_version = build_version_info();
argparse::ArgumentParser program(program_name, program_version);
bool verbose = false;
program.add_argument("--verbose")
.help("显示日志信息到终端")
.default_value(false)
.store_into(verbose)
.nargs(0);
bool debug = false;
program.add_argument("--debug")
.help("打开日志的调试模式")
.default_value(false)
.store_into(debug)
.nargs(0);
argparse::ArgumentParser service_command("service");
service_command.add_description("Manage the service.");
service_command.add_argument("action")
.help("install | uninstall | start | stop | status | run")
.choices("install", "uninstall", "start", "stop", "status", "run");
service_command.add_argument("--pipe");
program.add_subparser(service_command);
std::vector<std::unique_ptr<argparse::ArgumentParser>> subparsers;
std::map<std::string, argparse::ArgumentParser *> subparser_map;
runtime::global_init();
datasets::init();
{
auto const &config = config::TraderConfig();
(void)config;
}
for (auto &subcommand: quant1x::subcommands) {
auto sub_parser = std::make_unique<argparse::ArgumentParser>(subcommand.name);
sub_parser->add_description(subcommand.help);
for(auto flag : subcommand.args) {
sub_parser->add_argument(flag->use)
.help(flag->usage)
.default_value(flag->defaultValue)
.store_into(flag->value) ;
}
program.add_subparser(*sub_parser);
subparser_map[subcommand.name] = sub_parser.get(); subparsers.push_back(std::move(sub_parser));
}
try {
program.parse_args(argc, argv);
} catch (const std::runtime_error &err) {
std::cerr << err.what() << std::endl;
std::cerr << program;
return 1;
}
runtime::logger_set(verbose, debug);
quant1x::engine::init([] {
std::cout << "这里执行定制的初始化工作" << std::endl;
cache::Register(std::make_unique<DataNo0>());
StrategyManager& manager = StrategyManager::Instance();
StrategyPtr s0 = std::make_shared<No0Strategy>();
manager.Register(s0);
});
if(program.is_subcommand_used("service")) {
return quant1x::engine::daemon(service_command);
}
bool command_found = false;
for (const auto &subcommand: quant1x::subcommands) {
if (program.is_subcommand_used(subcommand.name)) {
command_found = true;
if (auto it = subparser_map.find(subcommand.name); it != subparser_map.end()) {
subcommand.handler(*(it->second)); spdlog::default_logger()->flush();
}
break; }
}
spdlog::default_logger()->flush();
if (!command_found) {
for(int i = 0; i< argc; ++i) {
std::cerr << argv[i]<< " ";
}
std::cerr<< std::endl;
std::cerr << "Error: No command provided." << std::endl;
std::cerr << program;
return 1;
}
return 0;
}