对于这样的作品,可能会在 mql5 上竖立一座纪念碑,后人)))一个 4k 行的 defines.mqh 文件价值几何?如果你看看 70 个部分和 131个部分 之间的差别,就会惊叹工作量之大 )))
我发现了一个小错误,在文件trading.mqh 中,SetPrices 的 可见性为 private,而非 protected,因此后代无法使用该函数。 在文件 TradingControl.mqh 中,CreatePReqClose() 存在使用错误。
private: template <typename PR,typename SL,typename TP,typename PL> bool SetPrices(const ENUM_ORDER_TYPE action,const PR price,const SL sl,const TP tp,const PL limit,const string source_method,CSymbol *symbol_obj);
对于这样的作品,可能会在 mql5 上竖立一座纪念碑,后人)))一个 4k 行的 defines.mqh 文件价值几何?如果你看看 70 个部分和 131个部分 之间的差别,就会惊叹工作量之大 )))
我发现了一个小错误,在文件trading.mqh 中,SetPrices 的 可见性为 private,而非 protected,因此后代无法使用该函数。 在文件 TradingControl.mqh 中,CreatePReqClose() 存在使用错误。
是的,这个错误是我的疏忽和旧编译器的错误造成的。在最新版本的编译器中,该错误已被检测到并得到修复。在最新版本的库中,这些方法位于受保护部分,而不是私有部分
创建一个结构并将字符串转化为 CharArray 数组不是更好吗?
ulong m_ticket; // 所选订单/交易的票据(MQL5) long m_long_prop[ORDER_PROP_INTEGER_TOTAL]; // 整数属性 double m_double_prop[ORDER_PROP_DOUBLE_TOTAL]; // 大量财产 string m_string_prop[ORDER_PROP_STRING_TOTAL]; // 字符串属性
//--- 创建新图表对象,返回指向图表控制对象的指针 CChartObjectsControl *CreateNewStdGraphObjectAndGetCtrlObj(const long chart_id, const string name, int subwindow, const ENUM_OBJECT type_object, const datetime time1, const double price1, const datetime time2=0, const double price2=0, const datetime time3=0, const double price3=0, const datetime time4=0, const double price4=0, const datetime time5=0, const double price5=0) { //--- 如果图表 ID 和名称的对象已存在于集合中,则报告并返回 NULL if(this.IsPresentGraphObjInList(chart_id,name)) { ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_GR_OBJ_ALREADY_EXISTS)," ChartID ",(string)chart_id,", ",name); return NULL; } //--- 如果无法创建新的标准图形对象--报告并返回 NULL if(!CreateNewStdGraphObject(chart_id,name,type_object,subwindow,time1,price1,time2,price2,time3,price3,time4,price4,time5,price5)) { ::Print(DFUN,CMessage::Text(MSG_GRAPH_STD_OBJ_ERR_FAILED_CREATE_STD_GRAPH_OBJ),StdGraphObjectTypeDescription(type_object)); CMessage::ToLog(::GetLastError(),true); return NULL; } //--- 如果无法获取计划表控制对象 - 报告它 CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id); if(ctrl==NULL) ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_FAILED_GET_CTRL_OBJ),(string)chart_id); //--- 返回指向日程表控制对象的指针,如果接收错误,则返回 NULL return ctrl; }
我试图创建一个简单的对象(文本标签),但没有成功。
在 CreateNewStdGraphObject() 之后,创建的对象 应如何进入 m_list_charts_control 以在下一次调用中获得一个非零对象?
CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
//--- 创建图形对象 "文本标签" bool CreateTextLabel(const long chart_id,const string name,const int subwindow,const bool extended, const int x,const int y, const string text,const int size,const ENUM_BASE_CORNER corner, const ENUM_ANCHOR_POINT anchor_point,const double angle) { string nm=this.m_name_program+"_"+name; ENUM_OBJECT type_object=OBJ_LABEL; CChartObjectsControl *ctrl=this.CreateNewStdGraphObjectAndGetCtrlObj(chart_id,nm,subwindow,type_object,0,0); if(ctrl==NULL) return false;
在到达属性设置之前返回 false。
//+------------------------------------------------------------------+ //| 返回时间序列中按时间排列的条形图对象。 //+------------------------------------------------------------------+ CBar *CSeriesDE::GetBar(const datetime time) { CBar *obj=new CBar(); if(obj==NULL) return NULL; obj.SetSymbolPeriod(this.m_symbol,this.m_timeframe,time); this.m_list_series.Sort(SORT_BY_BAR_TIME); int index=this.m_list_series.Search(obj); delete obj; return this.m_list_series.At(index); }
这里的时间序列没有为我排序....CArray 中的 Sort() 方法应该在继承类中单独实现,以便对对象进行排序,不是吗?
新文章 DoEasy. 控件(第三十一部分):滚动条控件内内容的滚动已发布:
在本文中,我将实现通过按钮滚动水平滚动条容器内容的功能。
编译 EA,并在图表上启动它:
如您所见,由箭头按钮管理的滚动效果良好。 当尝试用鼠标移动滑块时,它会“抗拒”,这是很自然的 — 我们仍未处理滑块移位,但我们已经重新计算了它的尺寸和坐标。 故此,当我们尝试用鼠标移动滑块时,设置其坐标的方法会返回到与其可见区域中容器内容的位置相对应的位置。 此行为将在后续文章中终结。
作者:Artyom Trishkin