文章 "DoEasy. 控件(第三十一部分):滚动条控件内内容的滚动" - 页 3

 
#include <DoEasy\Engine.mqh>

CEngine        engine;

....

   int h=37,w=100;
   string name=prefix+"EDIT_BUY_LIMIT";
   x=309;
   y=124;
   if(!EditCreate(name,x,y,w-16,h,"",clrBlack,clrWhite))
     {
      Alert(TextByLanguage("Failed to create Edit element (创建编辑元素失败)"","Could not create Edit element \""),prefix+"EDIT_BUY_LIMIT"+", error: "+(string)GetLastError());
      return false;
     }


//+------------------------------------------------------------------+
//| 创建编辑|
//+------------------------------------------------------------------+
bool EditCreate(const string name,
                const int x,
                const int y,
                const int w,
                const int h,
                const string text,
                const color clr_txt,
                const color clr_bg,
                const string font="Calibri",
                const int font_size=11)
  {
   if(!engine.CreateEditField(0,name,0,false,x,y,w,h,font_size,CORNER_LEFT_LOWER,ALIGN_CENTER,false))
     {
      Print(DFUN,TextByLanguage("创建编辑元素失败!错误代码="","Could not Edit element! Error code="),GetLastError()); 
      return false;   // --- 在此返回 false
     }
 }
 
实际上,如何通过将编辑器链接到面板来创建编辑器?
 
哇,我画了面板,花了好多时间。结果发现无法创建编辑元素...
 
leonerd #:
哇,我画了面板,花了好多时间。结果发现你无法创建编辑元素...
请给我看看你的完全可编译示例。
 
Artyom Trishkin #:
请给我看看你的完全可编译示例。

如果没有这样的对象,还有什么可编译的。

有 GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON 和许多其他对象,但没有简单的编辑对象。通过引擎方法 CreateEditField(),我最终创建了一个字段,但请告诉我如何将其绑定到面板上?

CPanel *pnl=engine.CreateWFPanel("WFPanel",50,50,280,240,array_clr,200,true,true,false,-1,FRAME_STYLE_BEVEL,true,false);
if(pnl!=NULL)
  {
   if(!pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON,InpRbnShiftX+dist_rbtn_x*i,InpRbnShiftY,50,20,clrNONE,255,true,false))
     ..
  }

 
leonerd #:

那么,如果没有这样的对象,还编译什么呢?

有 GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON 和许多其他对象,但没有简单的编辑对象。通过引擎方法 CreateEditField(),我最终创建了一个字段,但请告诉我如何将其绑定到面板上?

该库仍在开发中。图形元素只完成了不到一半。目前还没有输入字段。只有一个标准字段,而你正在尝试制作它。

当 "输入框 "对象可用时,一切就都能正常工作了。现在将标准对象绑定到表单是不现实的,因为它不会参与表单对象的事件模型。

 

好的。

另外,这个方法不能正常工作

CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket);

它只返回最后一个订单。出于某种原因,在过滤订单时,它将这些订单视为已删除的待处理订单。

我给你提供一些信息。仓位上的第一个订单是用限制器(SELL STOP)打开的,通过更改 SL/TP 对仓位进行了多次更新。然后,我在 SL 上捕捉到了一个平仓事件。我试图找到平仓的 第一单,但上述方法无法正常工作。

CEngine engine

....

    if(event.TypeEvent()==TRADE_EVENT_POSITION_CLOSED_BY_SL)
        {
         
         ulong prev_pos_ticket=event.TicketPositionPrevious();  // 这里是正确的位置票 
         CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket); // 在这里,接收到的数组中只有最后一阶的位置 (sl)
        }
  
 
leonerd 平仓的 第一单,但上述方法无法正常工作。

仓单和仓位 ID 是完全不同的东西。您需要通过仓位 ID 进行搜索,而不是通过仓位单进行搜索,因为仓位单是不断变化的,它等于产生仓位变化交易的订单的仓位单。

您应该阅读有关 MetaTrader 5 订单系统的文章或帮助....。

 

在平仓()中,您甚至根本没有填写填充信息

在 Trading.mqh trade_obj.ClosePosition(ticket,comment,deviation)
中,trade_obj 已填入所需的内容,而进入 this.m_request.type_filling 方法则成为默认的 FOK。

 
leonerd ,comment,deviation)
中,trade_obj 已填入所需的内容,而进入 this.m_request.type_filling 方法则成为默认的 FOK。
我会研究一下。谢谢。