Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar"" - страница 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("Не удалось создать Edit элемент \"","Could not create Edit element \""),prefix+"EDIT_BUY_LIMIT"+", error: "+(string)GetLastError());
      return false;
     }


//+------------------------------------------------------------------+
//| Создаёт Edit                                                     |
//+------------------------------------------------------------------+
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("не удалось создать Edit элемент! Код ошибки=","Could not Edit element! Error code="),GetLastError()); 
      return false;   // --- тут возвращает false
     }
 }
 
А действительно, как создать Edit, привязав его к панели?
 
Мдаа, нарисовал панель, столько времени потратил. А оказывается, нельзя Edit элемент создать... 
 
leonerd #:
Мдаа, нарисовал панель, столько времени потратил. А оказывается, нельзя Edit элемент создать... 
Покажите полностью компилируемый Ваш пример, пожалуйста. 
 
Artyom Trishkin #:
Покажите полностью компилируемый Ваш пример, пожалуйста. 

дак а что там компилировать, если нет такого объекта. 

GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON есть и еще множество других, а простого Edit нет. Через engine метод 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 есть и еще множество других, а простого Edit нет. Через engine метод 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 #:

Ок.

Ещё вот этот метод у вас неправильно работает

Возвращает мне последний ордер только. Почему-то, отфильтровывая ордера, он их воспринимает как удаленные пендинги.

Я вводные просто дам. Первый ордер по позиции открывался лимитником (SELL STOP), было несколько апдейтов позиции путем изменения SL/TP. Потом я отловил эвент закрытия по SL. Пытаюсь найти первый ордер закрытой позиции, но не работает правильно метод, указанный выше.

Тикет позиции и её идентификатор - совершенно разные вещи. Искать нужно по идентификатору позиции, а не по её тикету, который постоянно меняется, и становится равным тикету ордера, породившему сделку, изменившую позицию.

Вам бы почитать статьи или справку про ордерную систему в MetaTrader 5...

 

На ClosePosition() даже вовсе filling не заполняете

В Trading.mqh trade_obj.ClosePosition(ticket,comment,deviation)
trade_obj имеет нужный филинг, а переходит внутрь метода this.m_request.type_filling становится дефолтным FOK

 
leonerd #:

На ClosePosition() даже вовсе filling не заполняете

В Trading.mqh trade_obj.ClosePosition(ticket,comment,deviation)
trade_obj имеет нужный филинг, а переходит внутрь метода this.m_request.type_filling становится дефолтным FOK

Разберусь. Спасибо.