期货软件开发 - 策略编辑

期货策略编辑窗口


一、整体定位

  • 类名:TFrmCeLueEdit策略编辑窗口
  • 作用:
    1. 加载 / 显示已有的期货策略数据
    2. 让用户编辑策略名称、合约、周期、脚本、下单量等
    3. 校验脚本语法、输入合法性
    4. 保存策略到 JSON 文件
    5. 通知全局管理器更新策略

二、核心成员变量

复制代码
// 策略文件的保存路径+文件名
public string m_strFileName;

// 策略数据实体类(存储所有策略配置信息)
_CeLueData_ m_data = new _CeLueData_();
  • m_strFileName:用来定位策略的 JSON 文件
  • m_data内存中的策略数据对象,所有界面展示 / 编辑的数据都存在这里

三、窗体加载:TFrmCeLueEdit_Load

窗口打开时自动执行,做初始化加载

复制代码
private void TFrmCeLueEdit_Load(object sender, EventArgs e)
{
    // 1. 加载合约列表(排除 AL 结尾的合约)
    foreach (var item in Common.gDictHeYue)
    {
        string bh = item.Value.bh;
        string strTail = bh.Right(2);
        if (strTail.ToUpper() != "AL")
        {
            cmbHeYue.Items.Add(item.Value.bh);
        }
    }

    // 2. 加载K线周期下拉框
    string[] periodAry = { "1m", "5m", "15m", "30m", "1H", "2H", "4H", "D", "M", "Y" };
    cmbPeriod.Items.AddRange(periodAry);

    // 3. 加载文件中的策略数据(回填到界面)
    InitData(m_strFileName);
}

关键解析

  1. 合约加载
    • 从全局公共数据 Common.gDictHeYue 读取所有合约
    • 过滤掉代码以 AL 结尾的合约
    • 把合规合约添加到下拉框 cmbHeYue
  2. 周期固定写死:1 分钟、5 分钟... 日、月、年
  3. 调用 InitData 加载已有策略

四、加载策略数据:InitData

从 JSON 文件读取策略 → 解析 → 回填到界面控件

复制代码
public void InitData(string strFileName)
{
    m_strFileName = strFileName;

    // 文件不存在直接返回
    if (File.Exists(m_strFileName) == false) return;

    // 读取文件全部文本
    string strContent = File.ReadAllText(m_strFileName);
    // 解析为 JSON 对象
    JObject jObject = JObject.Parse(strContent);
    if (jObject == null) return;

    // ======================
    // JSON → 内存数据对象
    // ======================
    m_data.strID = jObject["ID"].ToString();
    m_data.strName = jObject["Name"].ToString();
    m_data.strSymbol = jObject["Symbol"].ToString();
    m_data.strPeriod = jObject["Period"].ToString();
    m_data.strRemark = jObject["Remark"].ToString();
    m_data.strScript = jObject["Script"].ToString();
    m_data.strTime = jObject["Time"].ToString();
    m_data.strXDNum = jObject["XDNum"].ToString();
    m_data.strMaxChiCang = jObject["MaxChiCang"].ToString();

    // ======================
    // 内存数据 → 界面控件
    // ======================
    txtName.Text = m_data.strName;
    cmbHeYue.Text = m_data.strSymbol;
    cmbPeriod.Text = m_data.strPeriod;
    txtRemark.Text = m_data.strRemark;
    txtScript.Text = m_data.strScript;
    txtXDNum.Text = m_data.strXDNum;
    txtMaxCiCangNum.Text = m_data.strMaxChiCang;
}

核心逻辑

  • 文件读取 → JSON 解析 → 赋值给实体类 → 显示到文本框 / 下拉框
  • 这是编辑模式的核心:打开已有策略,自动填好所有内容

五、确定保存:btnOK_Click

用户点【确定】时执行 ,是整个窗口最核心的业务逻辑

1. 收集界面输入

复制代码
string strName = txtName.Text;
string strHeYue = cmbHeYue.Text;
string strPeriod = cmbPeriod.Text;
string strRemark = txtRemark.Text.Trim();
string strScript = txtScript.Text.Trim();
string strXDNum = txtXDNum.Text.Trim();
string strMaxChiCangNum = txtMaxCiCangNum.Text.Trim();

2. 非空校验(必填项检查)

  • 策略名称不能为空
  • 合约、周期必须选择
  • 策略脚本不能为空
  • 下单数量、最大持仓数量不能为空

3. 数字合法性校验

复制代码
int nXDNum = int.Parse(strXDNum.Trim());
if (nXDNum <= 0)
{
    MessageBox.Show("下单数量必须大于0!");
    return;
}
  • 确保下单量、最大持仓是正整数
  • try-catch 捕获输入非数字的异常

4. 脚本语法检查

复制代码
if (!CheckYuFa()) return;
  • 语法不通过,不允许保存

5. 组装 JSON 并写入文件

复制代码
JObject jObject = new JObject();
jObject["ID"] = m_data.strID;
jObject["Name"] = strName;
jObject["Symbol"] = strHeYue;
...

// 写入文件(自动创建 Strategy 文件夹)
File.WriteAllText(m_strFileName, strJobject);

6. 通知全局管理器更新策略

复制代码
Common.gCeLueObjManage.EditCeLue(...)
  • 告诉系统:这个策略已经被修改,你要刷新

7. 关闭窗口

复制代码
this.Close();

六、取消按钮:btnCancel_Click

复制代码
private void btnCancel_Click(object sender, EventArgs e)
{
    this.Close();
}
  • 直接关闭窗口,不保存任何修改

七、语法检查:btnCheck_Click + CheckYuFa

1. 按钮点击

复制代码
private void btnCheck_Click(object sender, EventArgs e)
{
    if (CheckYuFa())
    {
        MessageBox.Show("脚本语法检查通过");
    }
}

2. 真正的语法检查函数 CheckYuFa

复制代码
public bool CheckYuFa()
{
    string strScript = txtScript.Text.Trim();
    if (strScript == "")
    {
        MessageBox.Show("请输入策略脚本");
        return false;
    }

    // 调用全局管理器检查语法
    JObject jObject = Common.gCeLueObjManage.CheckCeLueYuFa(...);

    bool bResult = (bool)jObject["result"];
    if (!bResult)
    {
        string str = jObject["message"].ToString();
        MessageBox.Show("语法错误:\n" + str);
        return false;
    }
    return true;
}
  • 脚本非空校验
  • 调用系统内置的策略语法检查器
  • 返回检查结果:成功 / 失败 + 错误信息

流程总结

  1. 打开窗口 → 加载合约、周期
  2. 读取策略 JSON → 显示到界面
  3. 用户编辑信息
  4. 点击【确定】/【检查】
  5. 校验输入 + 校验脚本语法
  6. 校验通过 → 写入 JSON 文件
  7. 通知系统更新策略 → 关闭窗口
相关推荐
奔跑的呱呱牛2 小时前
前端/Node.js操作Excel实战:使用@giszhc/xlsx(导入+导出全流程)
前端·node.js·excel·xlsx·sheetjs
之歆2 小时前
Composition API 深度解析 - 重新理解 Vue 的组件化编程
前端·javascript·vue.js
踩着两条虫2 小时前
从一行代码到一个生态:VTJ.PRO的创作之路
前端·低代码·ai编程
幼儿园技术家3 小时前
嵌套 H5 的跨端通信:iOS / Android / 小程序 / 浏览器
前端·js or ts
一只小阿乐3 小时前
TypeScript中的React开发
前端·javascript·typescript·react
用户9714171814273 小时前
vite项目开发环境启动白屏
前端
Highcharts.js3 小时前
Highcharts客户端导出使用文档说明|图表导出模块讲解
前端·javascript·pdf·highcharts·图表导出
上山打牛3 小时前
cornerstone3D 通过二进制渲染影像
前端
一只小阿乐3 小时前
react路由中使用context
前端·javascript·react.js·context 上下文