用 MQL 编写的用户界面图库 - 页 77 1...70717273747576777879808182 新评论 Doerk Hilger 2024.12.11 13:33 #761 为了更好地理解,这是任何 EA 或指标实现后的基类。 class CEAMain : public CObject { public: CEAMain() { m_classname="CEAMain"; SubscribeToCycle(EA_CYCLE_LOAD); SubscribeToCycle(EA_CYCLE_PARAMS); SubscribeToCycle(EA_CYCLE_INIT); SubscribeToCycle(EA_CYCLE_ACTIVATE); SubscribeToCycle(EA_CYCLE_TICK); SubscribeToCycle(EA_CYCLE_DEINIT); SubscribeToCycle(EA_CYCLE_UNLOAD); } //+------------------------------------------------------------------+ //| Cycles handler | //+------------------------------------------------------------------+ public: virtual void OnEACycle(CEACycleParams * cpm) { switch (cpm.Cycle) { case EA_CYCLE_LOAD: cpm.CycleResult(OnEALoad(PTR(cpm.Init))); break; case EA_CYCLE_PARAMS: cpm.CycleResult(OnEAParams()); break; case EA_CYCLE_INIT: cpm.CycleResult(OnEAInit(PTR(cpm.Init))); break; case EA_CYCLE_ACTIVATE: OnEAActivate(); break; case EA_CYCLE_DEINIT: OnEADeinit(PTR(cpm.Deinit)); break; case EA_CYCLE_UNLOAD: OnEAUnload(PTR(cpm.Deinit)); break; case EA_CYCLE_BOOKEVENT: OnEABookEvent(PTR(cpm.BookEvent)); break; } } //+------------------------------------------------------------------+ //| Cycles override | //+------------------------------------------------------------------+ protected: virtual bool OnEALoad(CEAInitParams * ipm) { return true; } protected: virtual bool OnEAParams(void) { return true; } protected: virtual bool OnEAInit(CEAInitParams * ipm) { return true; } protected: virtual void OnEAActivate(void) {} protected: virtual void OnEADeinit(CEADeinitParams * dpm) {} protected: virtual void OnEAUnload(CEADeinitParams * dpm) {} protected: virtual void OnEAChartEvent(CEAChartEventParams * cep) {} protected: virtual void OnEABookEvent(CEABookEventParams * cpm) {} }; 最终的 EA 是这样的: class CMain : public CEAMain { public: CMain() { m_classname="MainEA"; } public: ~CMain() { } //+------------------------------------------------------------------+ //| Load | //+------------------------------------------------------------------+ protected: virtual bool OnEALoad(CEAInitParams * ipm) { Print("Welcome :)"); return true; } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ protected: virtual bool OnEAInit(CEAInitParams * ipm) { if (ipm.IsFirstInit) return true; //--- Account changed init if (ipm.IsAccountChanged) { } //--- Symbol change init else if (ipm.IsSymbolChanged) { } return true; } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ protected: virtual void OnEADeinit(CEADeinitParams * dpm) { } protected: virtual void OnEAUnload(CEADeinitParams * dpm) { DeInit(); Print("Bye."); } ... ... }; // Create the main EA object on a global scope. CMain __MainEA; Doerk Hilger 2024.12.11 13:39 #762 当然,加载/卸载/激活等都是自定义的,但由于您有了这个事件核心,您就拥有了比没有事件核心时更大的灵活性,对所有事情的控制能力 也更强。 如果我有时间,我会写一篇文章并提供资料来源。这不是什么秘密,也没有什么神奇之处。 Реter Konow 2024.12.11 13:42 #763 Doerk Hilger 控制能力 也更强了。 看了你创建的图形用户界面。我非常喜欢。告诉我,是你自己编写的,还是使用了一些 MQL 库? Doerk Hilger 2024.12.11 13:45 #764 Реter Konow #: 看了你创建的图形用户界面。我非常喜欢。告诉我,你是自己写的还是用了一些 MQL 库? 谢谢。 没有,没有使用库。我自己从头开始设计。实际上,只有 CCanvas 是根据原始版本改编的,其他的都没有。 Реter Konow 2024.12.11 13:57 #765 Doerk Hilger #:谢谢 不,没有图书馆。我是自己从零开始开发的。实际上,只有 CCanvas 是根据原始库改编的,其他都不是。 做这样的东西并不容易。)据我所知,标准的 Ccanvas 类中没有绘制颜色渐变的功能,您是如何解决 GUI 中的渐变问题的? Doerk Hilger 2024.12.11 14:21 #766 Реter Konow #: 要做出这样的东西并不容易。) 据我所知,在标准的 Ccanvas 类中没有绘制颜色渐变的功能,您是如何解决 GUI 中的渐变问题的? 你是说光效?如前所述,CCanvas 也只是在基本功能和结构上进行了调整,而不是在细节上。 //+------------------------------------------------------------------+ //| Macro to generate color | //+------------------------------------------------------------------+ #define XRGB(r,g,b) (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b)) #define ARGB(a,r,g,b) ((uchar(a)<<24)|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b)) #define TRGB(a,rgb) ((uchar(a)<<24)|(rgb)) #define GETRGB(clr) ((clr)&0xFFFFFF) #define GETRGBA(clr) uchar((clr)>>24) #define GETRGBR(clr) uchar((clr)>>16) #define GETRGBG(clr) uchar((clr)>>8) #define GETRGBB(clr) uchar(clr) #define COLOR2RGB(clr) (0xFF000000|(uchar(clr)<<16)|(uchar((clr)>>8)<<8)|uchar((clr)>>16)) #define RGB2COLOR(rgb) ((uchar(rgb)<<16)|(uchar((rgb)>>8)<<8)|uchar((rgb)>>16)) //+------------------------------------------------------------------+ //| Add light to rectangular area | //+------------------------------------------------------------------+ void CCanvasExt::AddLight(int x1, int y1, int x2, int y2, bool updown=true, double intensity=.5, int isoftedge=20, color lightcolor=C'255,255,255') { if (intensity==0) return; int tmp; //--- sort vertexes if(x2<x1) { tmp=x1; x1 =x2; x2 =tmp; } if(y2<y1) { tmp=y1; y1 =y2; y2 =tmp; } //--- out of screen boundaries if(x2<0 || y2<0 || x1>=m_width || y1>=m_height) return; //--- stay withing screen boundaries if(x1<0) x1=0; if(y1<0) y1=0; if(x2>=m_width) x2=m_width -1; if(y2>=m_height) y2=m_height-1; //--- calculate softedge isoftedge=MIN(100,isoftedge); int softedge=isoftedge>0 ? isoftedge*(y2-y1)/100 : 0; //--- correct height y2-=(y2-y1)/2; y2+=(softedge/2); y2++; y2=MIN(m_height-1,y2); //--- prepare COLOR_RGBA rgb=_ColorLumaMult(lightcolor,ABS(intensity)); double r=(int)GETRGBR(rgb); double g=(int)GETRGBG(rgb); double b=(int)GETRGBB(rgb); if (intensity<0) { r=0-r; g=0-g; b=0-b; } uint pixel; int istart; int iend; int i; //--- check direction if (updown) { //--- add main light for(;y1<y2-softedge;y1++) { istart=y1*m_width+x1; iend=istart+(x2-x1); for (i=istart;i<=iend;i++) { pixel=m_pixels[i]; m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b); //m_pixels[i]|=rgb; } } if (softedge==0) return; //-- Add soft edge double decr=r/softedge; double decg=g/softedge; double decb=b/softedge; //--- Loop rows separate and adjust color each row for (;y1<=y2;y1++) { r-=decr; r=MAX(0,r); g-=decg; g=MAX(0,g); b-=decb; b=MAX(0,b); istart=y1*m_width+x1; iend=istart+(x2-x1); for (i=istart;i<=iend;i++) { pixel=m_pixels[i]; m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b); } } } } Реter Konow 2024.12.11 14:47 #767 Doerk Hilger #: 你是说灯光效果?嗯,是灯光效果:D 如前所述,CCanvas 也只是在基础和结构上进行了调整,但在细节上并没有调整。 我明白了,谢谢。) Doerk Hilger 2024.12.11 19:09 #768 Реter Konow #: 我明白了,谢谢。) 请随意使用它:) PS:据我所知,updown 实际上是无用的。无论如何,光线通常来自上方 Реter Konow 2024.12.11 19:33 #769 Doerk Hilger #:请随意使用:) PS:就我所见,updown 其实是无用的。无论如何,光线通常来自上方。是的,你有一个有趣的选择,我会试试看:)我的光线分布是反过来的--从给定的原色到较浅的颜色。让我来解释一下:颜色分割算法本身工作正常,可以向数组写入 256 种色调。也就是说,函数接受的每种颜色的全部范围。但是绘制算法只在元素表面沿一个方向绘制渐变。很长时间以来,我一直想增加一些功能,制作多方向的渐变,这样就可以得到体积和复杂的平面元素。原则上,这并不是一件难事。但是,前面还有许多更重要的任务)。 Yu Zhang 2024.12.12 02:24 #770 朋友,如果您能想出在回溯测试 EA 时如何使用图形用户界面,我将不胜感激。 1...70717273747576777879808182 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
最终的 EA 是这样的:
如果我有时间,我会写一篇文章并提供资料来源。这不是什么秘密,也没有什么神奇之处。
看了你创建的图形用户界面。我非常喜欢。告诉我,你是自己写的还是用了一些 MQL 库?
谢谢。
没有,没有使用库。我自己从头开始设计。实际上,只有 CCanvas 是根据原始版本改编的,其他的都没有。
谢谢
不,没有图书馆。我是自己从零开始开发的。实际上,只有 CCanvas 是根据原始库改编的,其他都不是。
要做出这样的东西并不容易。)
你是说光效?如前所述,CCanvas 也只是在基本功能和结构上进行了调整,而不是在细节上。
我明白了,谢谢。)
请随意使用它:)
PS:据我所知,updown 实际上是无用的。无论如何,光线通常来自上方
请随意使用:)
PS:就我所见,updown 其实是无用的。无论如何,光线通常来自上方。