打开项目,找到 CProgram 基类,并在其私密部分中添加两个方法。 该方法将负责加载和保存品种模板。 bool SaveSymbolSet(string file_name); bool LoadSymbolSet(string file_name);以下是这些方法如何被实现的。 //+------------------------------------------------------------------+//| Save template to a file |//+------------------------------------------------------------------+bool CProgram::SaveSymbolSet(string file_name){ if(file_name=="") { MessageBox("Select the template name to record","Signal Monitor"); return(false); } int h=FileOpen("Signal Monitor\\"+file_name+".bin",FILE_WRITE|FILE_BIN); if(h==INVALID_HANDLE) { MessageBox("Failed to create a configuration file","Signal Monitor"); return(false); } else MessageBox("The "+file_name+" configuration has been successfully saved","Signal Monitor");//--- Save the selection of timeframes and patterns for(int i=0; i<m_all_symbols; i++) m_save.tf=m_checkbox.IsPressed();//--- FileWriteStruct(h,m_save); FileClose(h);//--- return(true);}//+------------------------------------------------------------------+//| Load data to a panel |//+------------------------------------------------------------------+bool CProgram::LoadSymbolSet(string file_name){ if(file_name=="") { MessageBox("Select the template name to load","Signal Monitor"); return(false); } int h=FileOpen("Signal Monitor\\"+file_name+".bin",FILE_READ|FILE_BIN); if(h==INVALID_HANDLE) { MessageBox("Configuration "+file_name+" not found","Signal Monitor"); return(false); } ZeroMemory(m_save); FileReadStruct(h,m_save);//--- Loading timeframes for(int i=0; i<m_all_symbols; i++) { m_checkbox.IsPressed(m_save.tf); m_checkbox.Update(true); }//--- FileClose(h);//--- return(true);}不过,若尝试立即编译项目,则将触发与 m_save 变量有关的错误。 该结构含有一个名为 tf 的布尔类型参数。 它可记住用户所选的文件。 故需在应用类中创建此结构,并将其实例添加到基类。//+------------------------------------------------------------------+//| Class for creating the application |//+------------------------------------------------------------------+struct SAVE{ bool tf[100];};class CProgram : public CWndEvents{... SAVE m_save;转到 OnEvent(),进入与按钮点击事件相关的部分,并在“第一步”条件中添加以下代码: //--- Save the template if(lparam==m_save_button.Id()) { SaveSymbolSet(m_text_edit.GetValue()); } //--- Load the template if(lparam==m_load_button.Id()) { LoadSymbolSet(m_text_edit.GetValue()); }另外,实现上述按钮的热键用法。 以相同的方法,为按键事件添加检查,并针对所用键添加代码。//--- Key press if(id==CHARTEVENT_KEYDOWN) { if(m_current_step==1) { short sym=TranslateKey((int)lparam); //--- if the entered character is successfully converted to Unicode if(sym>0) { if(ShortToString(sym)=="l" || ShortToString(sym)=="д") LoadSymbolSet(m_text_edit.GetValue()); if(ShortToString(sym)=="s" || ShortToString(sym)=="ы") SaveSymbolSet(m_text_edit.GetValue()); } } }编译项目。 若成功编译将产生以下结果。
/ e% d5 H5 H" Y/ S% k, R h3 D
. L& s' \4 Z+ X: a% b) h
添加图片注释,不超过 140 字(可选)
3 R8 R- M% D; A& j图例 2 保存和加载用户模板添加和编辑交易信号现在,转到应用程序的主要部分,该部分负责创建和编辑交易信号,以及进一步在监视器中跟踪它们。 信号创建和编辑的摸样如此这般。
" N g$ L) e9 L) l. O8 `$ M* q" M8 Y1 A1 B: d6 F
添加图片注释,不超过 140 字(可选) a" @8 k+ J& @( W/ v
图例 3 信号创建和编辑窗口。在当前阶段,该窗口显示各种控制参数的一组 GUI 元素。 然而,这些设置尚未在任何地方用到。 首先在界面上添加两个按钮。 它们是添加/保存交易信号。 另一个是取消创建/编辑按钮。 打开 Program.mqh ,并将这两个按钮的实现方法添加到基类中:bool CreateButton3(CButton &button,string text,const int x_gap,const int y_gap);两个 CButton 按钮的实例: CButton m_new_signal; CButton m_cancel_button; |