期货策略编辑窗口

一、整体定位
- 类名:
TFrmCeLueEdit→ 策略编辑窗口 - 作用:
- 加载 / 显示已有的期货策略数据
- 让用户编辑策略名称、合约、周期、脚本、下单量等
- 校验脚本语法、输入合法性
- 保存策略到 JSON 文件
- 通知全局管理器更新策略
二、核心成员变量
// 策略文件的保存路径+文件名
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);
}
关键解析
- 合约加载
- 从全局公共数据
Common.gDictHeYue读取所有合约 - 过滤掉代码以 AL 结尾的合约
- 把合规合约添加到下拉框
cmbHeYue
- 从全局公共数据
- 周期固定写死:1 分钟、5 分钟... 日、月、年
- 调用
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;
}
- 脚本非空校验
- 调用系统内置的策略语法检查器
- 返回检查结果:成功 / 失败 + 错误信息
流程总结
- 打开窗口 → 加载合约、周期
- 读取策略 JSON → 显示到界面
- 用户编辑信息
- 点击【确定】/【检查】
- 校验输入 + 校验脚本语法
- 校验通过 → 写入 JSON 文件
- 通知系统更新策略 → 关闭窗口