期货软件开发 - 策略编辑

期货策略编辑窗口


一、整体定位

  • 类名: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. 通知系统更新策略 → 关闭窗口
相关推荐
尘世壹俗人7 小时前
前端如何自适应宽高
前端
JianZhen✓7 小时前
前端竞争力提升
前端
吃西瓜的年年7 小时前
react(五)路由
前端·react.js·前端框架
IT_陈寒7 小时前
JavaScript的闭包差点让我加班到凌晨
前端·人工智能·后端
JianZhen✓7 小时前
前端面试攻略
前端
CQU_JIAKE7 小时前
[q]4.25
java·开发语言·前端
涵涵(互关)7 小时前
语法大全-only-writer
开发语言·前端·vue.js·typescript
恋猫de小郭7 小时前
Flutter 3.41.8 又双叒修复调试问题,草台班子日常 hotfix
android·前端·flutter
接着奏乐接着舞7 小时前
Cesium 自定义纹理
前端
鹏程十八少7 小时前
9. 2026金三银四 面试官问不垮:Java VS Android 设计模式 16 讲
前端·后端·面试