效果图

前段时间,因业务需要,写了这样一个软件,同样的页面已经是第2次写了,第1次大约5年前的事情了,因为代码遗失,于是重新写。页面看似复杂,实现起来非常简单。

第一步:参照通达信的公式管理器核心文件TCalc.dll,导出资源文件(TCalc.rc),这样界面基本上显现出来了,接下来就是把这些页面进行整合(页面调用)。

第二步:提取公式列表信息


enum formula_type : unsigned char {ftFrom,ftTechnical_Indicator_Formula,// 技术指标公式ftConditional_Sel_Stock_Formula,   // 自选股指标公式ftExpert_System_Formula,  // 系统专家公式ftColorful_Kline_Formula,  // 五彩K线公式ftTo,
};typedef struct _Formula_Parameter
{char _name[16];//参数union{char _value[4][16];struct  {char _min[16];//最小char _max[16];//最大char _default[16];//默认char _step[16];//步长};};
}Formula_Parameter;// 技术指标公式
typedef struct _Technical_Indicator_Formula
{bool is_system;//是否系统公式 1-是 0-否bool is_common;//是否系统公式 1-是 0-否char name[32];// 公式名称bool is_protected;//密码保护char password[16];//密码bool type_disable;char _type;//公式类型 /*技术指标公式0 - 大势型1 - 超买超卖型2 - 趋势性3 - 能量型4 - 成交量型5 - 均线型6 - 图表型7 - 路径型8 - 停损型9 - 交易型10 - 神系11 - 龙系12 - 鬼系13 - 其他系14 - 特色型15 - 其他类型条件选股公式0 - 指标条件1 - 基本面2 - 即时盘中3 - 走势特征4 - 形态特征5 - 其他类型专家系统公式0 -五彩K线公式*/bool draw_disable;char draw_line_method;//画线方法/*0 - 副图1 - 主图叠加2 - 副图(叠加K线)3 - 副图(叠加美国线)4 - 副图(叠加收盘站线)5 - 主图替换*/char desp[64];//公式描述char version[16];//公式版本char show_decimal;//显示小数/*0 - 缺省位数1 - 品种小数位数2 - 品种小数位数 + 13 - 固定0位4 - 固定1位5 - 固定2位6 - 固定3位7 - 固定4位*/Formula_Parameter parameters[16];//参数char formula_text[4096];//公式文本内容char trade_rules;//交易法则/*0 - 无1 - 左手2 - 右手*/bool coordinate_disable;char coordinate_position[64];//坐标线位置,最多6个,用分号分隔bool extract_disable;char extract_y_axis[4][16];//额外Y轴分界
}Technical_Indicator_Formula;//条件选股公式
typedef struct _Conditional_Sel_Stock_Formula
{bool is_system;//是否系统公式 1-是 0-否bool is_common;//是否系统公式 1-是 0-否char name[32];// 公式名称bool is_protected;//密码保护char password[16];//密码char _type;//公式类型 /*条件选股公式0 - 指标条件1 - 基本面2 - 即时盘中3 - 走势特征4 - 形态特征5 - 其他类型*/char right_to_use;//使用复权/*0 - 缺省设置1 - 恒不复权*/char desp[64];//公式描述char version[16];//公式版本Formula_Parameter parameters[16];//参数char formula_text[4096];//公式文本内容
}Conditional_Sel_Stock_Formula;//专家系统公式
typedef struct _Expert_System_Formula
{bool is_system;//是否系统公式 1-是 0-否bool is_common;//是否系统公式 1-是 0-否char name[32];// 公式名称bool is_protected;//密码保护char password[16];//密码char desp[64];//公式描述char version[16];//公式版本Formula_Parameter parameters[16];//参数char formula_text[4096];//公式文本内容
}Expert_System_Formula;//五彩K线公式
typedef struct _Colorful_Kline_Formula
{bool is_system;//是否系统公式 1-是 0-否bool is_common;//是否系统公式 1-是 0-否char name[32];// 公式名称bool is_protected;//密码保护char password[16];//密码char desp[64];//公式描述char version[16];//公式版本Formula_Parameter parameters[16];//参数char formula_text[4096];//公式文本内容
}Colorful_Kline_Formula;
class formula
{
public:formula();~formula();std::vector<Formula_Struct*> m_queFormulas;private:void init();
};void formula::init()
{// 技术指标公式Formula_Struct formula_Struct;//0 - 大势型memset(&formula_Struct, 0, sizeof(formula_Struct));formula_Struct.is_root = true;strcpy_s(formula_Struct.name, "大势型");// 公式名称formula_Struct.subtype = 1;formula_Struct.formulatype = formula_type::ftTechnical_Indicator_Formula;m_queFormulas.push_back(formula_Struct.clone());memset(&formula_Struct, 0, sizeof(formula_Struct));formula_Struct.subtype = 0;formula_Struct.is_system = true;strcpy_s(formula_Struct.name, "ABI");// 公式名称formula_Struct.is_protected = false;//密码保护formula_Struct.draw_line_method  = 0;//画线方法strcpy_s(formula_Struct.desp, "绝对广量指标");//公式描述strcpy_s(formula_Struct.version, "0");//公式版本formula_Struct.show_decimal = 0;//显示小数strcpy_s(formula_Struct.formula_text, "ABI:100*ABS(ADVANCE-DECLINE)/(ADVANCE+DECLINE);\n");//公式文本内容strcat_s(formula_Struct.formula_text, "MAABI:EMA(ABI,M);");strcpy_s(formula_Struct.parameters[0]._name, "M");//参数strcpy_s(formula_Struct.parameters[0]._min, _T("2.00"));strcpy_s(formula_Struct.parameters[0]._max, _T("100.00"));strcpy_s(formula_Struct.parameters[0]._default, _T("10.00"));   formula_Struct.trade_rules = 1;//交易法则strcpy_s(formula_Struct.coordinate_position, "自动");//坐标线位置,最多6个,用分号分隔formula_Struct.formulatype = formula_type::ftTechnical_Indicator_Formula;m_queFormulas.push_back(formula_Struct.clone());memset(&formula_Struct, 0, sizeof(formula_Struct));formula_Struct.subtype = 0;formula_Struct.is_system = true;strcpy_s(formula_Struct.name, "ADL");// 公式名称formula_Struct.is_protected = false;//密码保护formula_Struct.draw_line_method = 0;//画线方法strcpy_s(formula_Struct.desp, "腾落指标");//公式描述strcpy_s(formula_Struct.version, "0");//公式版本formula_Struct.show_decimal = 0;//显示小数strcpy_s(formula_Struct.formula_text, "ADL:SUM(ADVANCE-DECLINE,0);\n");//公式文本内容strcat_s(formula_Struct.formula_text, "MAADL:MA(ADL,M);");strcpy_s(formula_Struct.parameters[0]._name, "M");//参数strcpy_s(formula_Struct.parameters[0]._min, _T("2.00f"));strcpy_s(formula_Struct.parameters[0]._max, _T("60.00f"));strcpy_s(formula_Struct.parameters[0]._default, _T("7.00f")); formula_Struct.trade_rules = 1;//交易法则strcpy_s(formula_Struct.coordinate_position, "自动");//坐标线位置,最多6个,用分号分隔formula_Struct.formulatype = formula_type::ftTechnical_Indicator_Formula;m_queFormulas.push_back(formula_Struct.clone());memset(&formula_Struct, 0, sizeof(formula_Struct));formula_Struct.subtype = 0;formula_Struct.is_system = true;strcpy_s(formula_Struct.name, "ADR");// 公式名称formula_Struct.is_protected = false;//密码保护formula_Struct.draw_line_method = 0;//画线方法strcpy_s(formula_Struct.desp, "涨跌比率");//公式描述strcpy_s(formula_Struct.version, "0");//公式版本formula_Struct.show_decimal = 0;//显示小数strcpy_s(formula_Struct.formula_text, "ADR:SUM(ADVANCE,N)/SUM(DECLINE,N);\n");//公式文本内容strcat_s(formula_Struct.formula_text, "MAADR:MA(ADR,M);");strcpy_s(formula_Struct.parameters[0]._name, "N");//参数strcpy_s(formula_Struct.parameters[0]._min, _T("2.00f"));strcpy_s(formula_Struct.parameters[0]._max, _T("100.00f"));strcpy_s(formula_Struct.parameters[0]._default, _T("10.00f"));strcpy_s(formula_Struct.parameters[1]._name, "M");//参数strcpy_s(formula_Struct.parameters[1]._min, _T("2.00f"));strcpy_s(formula_Struct.parameters[1]._max, _T("60.00"));strcpy_s(formula_Struct.parameters[1]._default, _T("6.00"));formula_Struct.trade_rules = 1;//交易法则strcpy_s(formula_Struct.coordinate_position, "自动");//坐标线位置,最多6个,用分号分隔strcpy_s(formula_Struct.extract_y_axis[0], "0.50");strcpy_s(formula_Struct.extract_y_axis[1], "1.00");strcpy_s(formula_Struct.extract_y_axis[2], "1.50");formula_Struct.formulatype = formula_type::ftTechnical_Indicator_Formula;m_queFormulas.push_back(formula_Struct.clone());......
}

第三步:将提取的公式结构填充显示到列表树

void CTCalcDlg::InitFormulaGroupTree()
{CTreeCtrl* pTree = reinterpret_cast<CTreeCtrl*>(GetDlgItem(IDC_TREE_2001));pTree->LockWindowUpdate();pTree->DeleteAllItems();HTREEITEM hRoot = pTree->InsertItem(_T("技术指标公式"), 32, 32);pTree->SetItemData(hRoot, ftTechnical_Indicator_Formula * 1000);std::vector<Formula_Struct*>::iterator iter = globalFormula.m_queFormulas.begin();for (; iter != globalFormula.m_queFormulas.end(); iter++){Formula_Struct* pFormula = *iter;if (pFormula->is_root && pFormula->formulatype == ftTechnical_Indicator_Formula){
label_100:HTREEITEM hChild = pTree->InsertItem(pFormula->name, 3, 3, hRoot);pTree->SetItemData(hChild, (DWORD)pFormula);for (++iter; iter != globalFormula.m_queFormulas.end(); iter++){pFormula = *iter;if (pFormula->formulatype != ftTechnical_Indicator_Formula)break;if (pFormula->is_root)goto label_100;CString sItemText;if (pFormula->is_system)sItemText.Format(_T("%s %s(系统)"), pFormula->name, pFormula->desp);elsesItemText.Format(_T("%s %s(用户)"), pFormula->name, pFormula->desp);HTREEITEM hSubChild = NULL;if (pFormula->is_common)hSubChild = pTree->InsertItem(sItemText, 30, 30, hChild);else if (pFormula->is_protected)hSubChild = pTree->InsertItem(sItemText, 17, 17, hChild);elsehSubChild = pTree->InsertItem(sItemText, 15, 15, hChild);pTree->SetItemData(hSubChild, (DWORD)pFormula);}break;}}pTree->Expand(hRoot, TVM_EXPAND);hRoot = pTree->InsertItem(_T("条件选股公式"), 32, 32);pTree->SetItemData(hRoot, ftConditional_Sel_Stock_Formula * 1000);iter = globalFormula.m_queFormulas.begin();for (; iter != globalFormula.m_queFormulas.end(); iter++){Formula_Struct* pFormula = *iter;if (pFormula->is_root && pFormula->formulatype == ftConditional_Sel_Stock_Formula){
label_101:HTREEITEM hChild = pTree->InsertItem(pFormula->name, 3, 3, hRoot);pTree->SetItemData(hChild, (DWORD)pFormula);for (++iter; iter != globalFormula.m_queFormulas.end(); iter++){pFormula = *iter;if (pFormula->formulatype != ftConditional_Sel_Stock_Formula)break;if (pFormula->is_root)goto label_101;CString sItemText;if (pFormula->is_system)sItemText.Format(_T("%s %s(系统)"), pFormula->name, pFormula->desp);elsesItemText.Format(_T("%s %s(用户)"), pFormula->name, pFormula->desp);HTREEITEM hSubChild = NULL;if (pFormula->is_common)hSubChild = pTree->InsertItem(sItemText, 30, 30, hChild);else if (pFormula->is_protected)hSubChild = pTree->InsertItem(sItemText, 17, 17, hChild);elsehSubChild = pTree->InsertItem(sItemText, 15, 15, hChild);pTree->SetItemData(hSubChild, (DWORD)pFormula);}break;}}hRoot = pTree->InsertItem(_T("专家系统公式"), 32, 32);pTree->SetItemData(hRoot, ftExpert_System_Formula * 1000);iter = globalFormula.m_queFormulas.begin();for (; iter != globalFormula.m_queFormulas.end(); iter++){Formula_Struct* pFormula = *iter;if (pFormula->formulatype == ftExpert_System_Formula){for (; iter != globalFormula.m_queFormulas.end(); iter++){Formula_Struct* pFormula = *iter;if (pFormula->formulatype != ftExpert_System_Formula)break;CString sItemText;if (pFormula->is_system)sItemText.Format(_T("%s %s(系统)"), pFormula->name, pFormula->desp);elsesItemText.Format(_T("%s %s(用户)"), pFormula->name, pFormula->desp);HTREEITEM hChild = NULL;if (pFormula->is_common)hChild = pTree->InsertItem(sItemText, 30, 30, hRoot);else if (pFormula->is_protected)hChild = pTree->InsertItem(sItemText, 17, 17, hRoot);elsehChild = pTree->InsertItem(sItemText, 15, 15, hRoot);pTree->SetItemData(hChild, (DWORD)pFormula);}break;}}hRoot = pTree->InsertItem(_T("五彩K线公式"), 32, 32);pTree->SetItemData(hRoot, ftColorful_Kline_Formula * 1000);iter = globalFormula.m_queFormulas.begin();for (; iter != globalFormula.m_queFormulas.end(); iter++){Formula_Struct* pFormula = *iter;if (pFormula->formulatype == ftColorful_Kline_Formula){for (; iter != globalFormula.m_queFormulas.end(); iter++){Formula_Struct* pFormula = *iter;if (pFormula->formulatype != ftColorful_Kline_Formula)break;CString sItemText;if (pFormula->is_system)sItemText.Format(_T("%s %s(系统)"), pFormula->name, pFormula->desp);elsesItemText.Format(_T("%s %s(用户)"), pFormula->name, pFormula->desp);HTREEITEM hChild = NULL;if (pFormula->is_common)hChild = pTree->InsertItem(sItemText, 30, 30, hRoot);else if (pFormula->is_protected)hChild = pTree->InsertItem(sItemText, 17, 17, hRoot);elsehChild = pTree->InsertItem(sItemText, 15, 15, hRoot);pTree->SetItemData(hChild, (DWORD)pFormula);}break;}}pTree->UnlockWindowUpdate();
}

至此,列表数结构就显示出来了。

VC++ 源码实现通达信公式管理器相关推荐

  1. ​通达信量比捉牛股指标源码​_通达信公式

    JL5:=MA(V,5);     LB:=DYNAINFO(17);     历史量比:IF(DYNAINFO(4)=OANDDYNAINFO(5)=HANDDYNAINFO(6)=LANDDYNA ...

  2. 麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式

    做价值的传播者,一路同行,一起成长 问题:怎样才能每天都收到这类文章! 答案:只需点击上方<通达信公式指标> {通达信单阳不破}MA30: MA(C,30 ),COLORGREEN;MA3 ...

  3. 麟龙指标通达信指标公式源码_通达信指标公式源码波段极限副图源码

    做价值的传播者,一路同行,一起成长 问题:怎样才能每天都收到这类文章! 答案:只需点击上方<通达信公式指标> {买卖公式} AA:=(2*C+HIGH+LOW)/4; BB:=AA-REF ...

  4. 底量超顶量超级大黑马指标源码_通达信最准的买卖指标,超准短线暴涨指标源码...

    内容导航: Q1:通达信哪个抄底指标公式最准准确 所有指标包括kd macd均线,是根据已有价格计算得出,看指标落后于看价格分析,也就是k线.而价格是根据成交量变化,看k线分析落后看成交量分析,而成交 ...

  5. 麟龙指标通达信指标公式源码_通达信麟龙指标套二主图+副图指标 贴图

    好股票软件下载网(www.goodgupiao.com)提示:您正在下载的是:通达信麟龙指标套二主图+副图指标 贴图 麟龙指标是我以前和谐的,跟现在的麟龙至尊版有所区别,我把源码也公布出来,大家能用则 ...

  6. 麟龙指标通达信指标公式源码_通达信指标公式源码神龙指标公式

    DRAWGBK(O>C,RGB(160,32,240),RGB(56,94,15),0,'背景图',0);A01:=(WINNER((CLOSE*1))*100.000);A02:=(WINNE ...

  7. 量化指标公式源码_通达信指标公式源码线上阴线指标公式

    工作线:(EMA(C,14)),POINTDOT,LINETHICK3,COLOR22ACDE;生命线:(MA(C,25)),LINETHICK1,COLORMAGENTA;不惑线:(MA(C,40) ...

  8. 2018通达信l2服务器源码,分享通达信(L2) 主力资金线/主力资金流向 源码

    分享通达信(L2) 主力资金线/主力资金流向 源码 2018-12-26 仿大智慧做的资金线和资金流,新手小试牛刀,做得不好请高手指点修改. 通达信源码 {主力资金线} EYE:=(LARGEINTR ...

  9. 主力吸筹猛攻指标源码_通达信偷偷连续吸筹指标,主力吸筹猛攻指标源码

    通达信偷偷连续吸筹指标,主力吸筹猛攻指标源码: C5周:CCI(25),COLORSTICK,COLORYELLOW; 生命CCI线:=CCI(84),COLORWHITE; 底部线:=-100.00 ...

  10. c iostream.源码_通达信常用指标:「金手指 」指标源码

    通达信常用指标:[金手指 ]指标源码 强弱:=IF(C>=MA(C,18) AND (MA(C,18)>=REF(MA(C,18),1) OR (MA(C,18)<REF(MA(C, ...

最新文章

  1. 为什么我们很难看到代码 5 分钟前的样子?
  2. 利用FreeImage将gif图像转为opencv中的Mat
  3. 堆内存与栈内存的区别
  4. 装配bean的三种方式
  5. schema get_ddl
  6. 创建型模式——原型模式
  7. TIOBE 2 月编程语言排行榜:VB 又有人要了,Go 一直在跌!
  8. obs计算机丢失,安装obs时提醒没法启动此程序,因为计算机丢失
  9. 微软windows10易升_微软正式发布Win10的2020年5月更新
  10. Hive微博数据统计分析
  11. 苹果手机安兔兔压力测试软件,10款跑分软件压力测试(一)
  12. Mendeley--免费的文献管理工具,给论文自动插入参考文献
  13. 2019上半年教资综合素质——主观题
  14. python从入门到入土图片_Python爬虫入门【7】: 蜂鸟网图片爬取之二
  15. Ciprian Manolescu 解决了三角解剖猜想
  16. 《哪咤学python进阶篇》之选学案例三:白桦林的故事_(Python多媒体MV)
  17. Ubuntu Linux,及Python matplot,安装Times New Roman等字体,让图标签可以用Times New Roman等字体
  18. 不知原谅什么,诚觉世事尽可原谅
  19. 关于自行修改人人商城模板文件目录指引
  20. 转一位计算机牛人的心得,谈计算机和数学,很实用~

热门文章

  1. 达梦数据库Linux下配置odbc数据源
  2. 设置eclipse主题风格和取消黑色主题(详细)
  3. gjb150.16a-2009振动试验标准及介绍
  4. Python帮助文档
  5. web1:http协议简介和用netassist和py程序当http服务器
  6. 超级计算机比赛规则,介绍围棋的规则与玩法
  7. 中国纺织行业前景动态分析与投资战略研究报告2022-2028年
  8. ACC - 简介与解码
  9. 按键精灵html代码,最新按键精灵脚本代码大全 按键精灵命令运行方法
  10. Java核心技术卷1:基础知识(原书第10版)