Мой подход. Ядро - Движок. - страница 129

 
Вставлю свои 5 копеек. Сейчас как-то не досуг. Но есть такая задумка реализовать подобную панель у себя. Так я думаю не просто делать крестик на закрытие позиции (хотя и он нужен) но так-же сделать отметку, указание лота и этим сделать оптовое закрытие. Что даст более гибкую работу с позициями, а так-же их частичное закрытие.
 
Vasiliy Sokolov:

Поработай с той версией движка что ты прикрепил в качестве демонстрации. 

Вроде все просто. Если твой подход работает как я думаю, то не вижу ни каких проблем ни с динамической таблицей ни с обновлением значений позиций через таймер. Петр, так зачем было горбатого лепить с самого начала?;)

Василий, главное не торопится с выводами. Ни тебе, ни мне.))

 
Konstantin Nikitin:
Вставлю свои 5 копеек. Сейчас как-то не досуг. Но есть такая задумка реализовать подобную панель у себя. Так я думаю не просто делать крестик на закрытие позиции (хотя и он нужен) но так-же сделать отметку, указание лота и этим сделать оптовое закрытие. Что даст более гибкую работу с позициями, а так-же их частичное закрытие.

Можно.

 
Vasiliy Sokolov:

Петр, сделай в таймере цикл for, который бы перебирал открытые ордера и посылал изменения в списке ордеров в твою таблицу. Также сделай так, что бы профит ордера  в твоей таблице также менялся динамически.

Василий, вставь пожалуйста этот код в файл тестового советника (функция тика и таймера. Вместо прежних)

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //---------------------------------------------
   //Количество ордеров не менялось.
   //---------------------------------------------      
   if(ArraySize(Orders) == OrdersTotal())
     {
      for(int a1 = 0; a1 < OrdersTotal(); a1++)
        {
         if(OrderSelect(a1,SELECT_BY_POS))
           {
            E_Main_form_1__PnL(OrderTicket(),OrderProfit()); 
           }
        }
     }        
  }
//--------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  { 
   //---------------------------------------------
   //Ордер открылся.
   //---------------------------------------------     
   if(ArraySize(Orders) < OrdersTotal())
     {Alert("Ордер открылся!");
      ArrayResize(Orders,OrdersTotal());
      
      //---------------------------------------
      if(OrderSelect(OrdersTotal() - 1,SELECT_BY_POS))
        {
         if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES))
           {
            //----------------------------------------------------
            E_Main_form_1__Order(OrderTicket(),OrderTicket());
            E_Main_form_1__Opening_Time(OrderTicket(),TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
            E_Main_form_1__Volume(OrderTicket(),OrderLots());
            E_Main_form_1__Symbol(OrderTicket(), OrderSymbol());
            E_Main_form_1__Price(OrderTicket(), OrderOpenPrice());
            E_Main_form_1__Comission(OrderTicket(), OrderCommission());
            E_Main_form_1__Swap(OrderTicket(), OrderSwap());
            E_Main_form_1__PnL(OrderTicket(), OrderProfit());
            E_Main_form_1__Type(OrderTicket(),OrderType()); 
            //----------------------------------------------------
           }
          //--------------------------------------  
          ArrayResize(Orders,OrdersTotal());
          Orders[OrdersTotal() - 1] = OrderTicket();   
          //--------------------------------------
        }
      //---------------------------------------  
     }
   //---------------------------------------------
   //Ордер закрылся.
   //---------------------------------------------  
   if(ArraySize(Orders) > OrdersTotal())
     {
      for(int a1 = 0; a1 < 100; a1++)
        {
         if(OrderSelect(Orders[a1],SELECT_BY_TICKET) && OrderCloseTime())
           {Alert("Ордер закрылся!");
            //--------------------------------------------------
            for(int a3 = 0; a3 < 100; a3++)
              { 
               if(Orders[a3] == OrderTicket())
                 {
                  E_Main_form_1_CLOSE_ROW___Orders_table(OrderTicket());
                  Orders[a3] = 0;
                  //--------------------------------------------------
                  int deleted = 0,q = 0;
                  //--------------------
                  for(int a2 = 0; a2 < ArraySize(Orders); a2++)
                    {
                     if(deleted)Orders[q] = Orders[q+deleted];
                     if(!Orders[q]){deleted++; q--;}
                     q++;
                    }
                  //--------------------------------------------------  
                  ArrayResize(Orders,q);
                  //--------------------------------------------------                      
                 } 
              } 
          }
      }         
 }

}
      
//---------------------------------------------

А также, в файле External Connection нужно заменить строку 68 и строку 114

E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));

Там немного напутал. Вместо OrderOpenTime() поставил OrderOpenPrice().


Должно работать нормально. Проверь.

 
Обрати внимание, я немного подправил код выше (если ты уже поставил).
 

Эх, нет, чтобы поступить по канонам - отделить данные(model) от представлений(view) и воспользоваться паттерном observer для подписки конкретных view на изменения model или определенные поля model.

Но для этого потребуется, чтобы пользователь такой библиотеки, мыслил объектно и данные своего советника засовывал в предлагаемую объектную структуру (да-да, нужно изучить методы этой библиотеки/фреймворка, чтобы построить интерфейс). А многие в ООП ни бум бум. 

А вот Петр говорит, не надо ничего изучать! Просто возьмите и суйте ваши глобальные переменные в готовую портянку из сгенерированных обработчиков и интерфейс заработает. Да это находка ребята! Это не "выпили дощечки для полочки, соедини их по инструкции и расставь книги", а "нарисуй свою полочку и расставь на нее свои книги". Code Less Do More ( (c)/JQuery есличе)


Понятно, что с позиционированием продукта есть проблемы. А если так? Эй, программист! Хочешь заработать? Продается, то что красиво смотрится! Возьми сотню-других советников без интерфейса и продай их с интерфейсом. хахах ))


Ну и вылез недостаток файла сопряжения в котором "торчат" обработчики контролов он - статический. Придется немного поломать голову и ваять новый тип обработчика, который будет выполнять роль шаблона и принимать пользовательские/программные данные через входные параметры.

 
Igor Volodin:

Эх, нет, чтобы поступить по канонам ...

Да всё нормально, Реter поступит по Konowам. )))

 
Igor Volodin:

Эх, нет, чтобы поступить по канонам - отделить данные(model) от представлений(view) и воспользоваться паттерном observer для подписки конкретных view на изменения model или определенные поля model.

Но для этого потребуется, чтобы пользователь такой библиотеки, мыслил объектно и данные своего советника засовывал в предлагаемую объектную структуру (да-да, нужно изучить методы этой библиотеки/фреймворка, чтобы построить интерфейс). А многие в ООП ни бум бум. 

А вот Петр говорит, не надо ничего изучать! Просто возьмите и суйте ваши глобальные переменные в готовую портянку из сгенерированных обработчиков и интерфейс заработает. Да это находка ребята! Это не "выпили дощечки для полочки, соедини их по инструкции и расставь книги", а "нарисуй свою полочку и расставь на нее свои книги". Code Less Do More ( (c)/JQuery есличе)


Понятно, что с позиционированием продукта есть проблемы. А если так? Эй, программист! Хочешь заработать? Продается, то что красиво смотрится! Возьми сотню-других советников без интерфейса и продай их с интерфейсом. хахах ))


Ну и вылез недостаток файла сопряжения в котором "торчат" обработчики контролов он - статический. Придется немного поломать голову и ваять новый тип обработчика, который будет выполнять роль шаблона и принимать пользовательские/программные данные через входные параметры.

Cначала подумал, это очередная порция негатива, потом вчитался получше, оказалось нет. Просто эмоции. 

Конструктор предназначается для людей, по настоящему увлеченных алготрейдингом. Для них есть смысл в не терять время на изучение граф.библиотек, а просто взять и составить такой код:

//====================================================================================================================
NEW_WINDOW,  W_NAME, "Main form 1",  W_ICON, 12,  W_TYPE, SETTINGS, ALWAYS_ON_TOP,    OOI,
//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
GROUP, A,

__, BUTTON,"BUY",text,N_COLOR,(int)clrBlue, GAP,50,  BUTTON,"SELL", text,N_COLOR,(int)clrRed,

END_GROUP,
//-------------------------- 
i, AT, _X2X, "MF", 10, _Y2Y,"MF", 10,

i,BUTTONS, PARAM_TYPE,_BOOL, TEXT_FONT,"Times New Roman",  W,100, H,34, FONT_SIZE,11,   END,

//----------------------------------------------------------------------------------
GROUP, A,

__,V_BOX,"V1",W,860,  _,H,248,_,N_FRAME,1,_,NP_FRAME,1,

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y,"MF", 50,
//----------------------------------------------------------------------------------

//----------------------------------------------------------------------------------
//Объявляем таблицу:
//----------------------------------------------------------------------------------
GROUP,"Orders table", IS_TABLE,  

__,     T_HEADER, "#",W,20,_,H,30, C_HEADER, "Order",     C_HEADER, "Opening Time",W,90, C_HEADER, "Type", W,90,  C_HEADER, "Volume", W,90,  C_HEADER, "Symbol", W,90, 
                               C_HEADER, "Price",       W,90,    
                               C_HEADER, "Comission",   W,90, C_HEADER, "Swap", W,90,  C_HEADER, "PnL",    W,90,  C_HEADER, "Close",  W,40,

__,     R_HEADER,"1", CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A,     
__,     R_HEADER,"2",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"3",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"4",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"5",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"6",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"7",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"8",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"9",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"10",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"11",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"12",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"13",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"14",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"15",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"16",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"17",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"18",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"19",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"20",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"21",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
 
END_GROUP,
//------------------------------------
i,AT, LEFT_TOP, 0,0,
i, IN, "V1",
//-----------
i, Y_GAP,-1,
i, X_GAP,-1,
//-----------
i, IS_ZEBRA_STYLE,
i, DnD_RECIEVER,
i, R_HEADERS,   W,20, N_COLOR,(int)C'0,235,0', END,
i, C_HEADERS,   H,30,                          END,
i, CELLS,       H,25,                          END,
i, C_HEADERS,   DnD_ON, DnD_FUNCTION, ROTATE_COLOMNS, END,
i, I_BUTTONS, C_FUNCTION, DELETES_ROW,   text,HIDE,1, N_FRAME,1,A_FRAME,1, NP_FRAME,1, AP_FRAME,1, N_LABEL,745, END,
i, IS_DINAMIC,
//----------------------------------------------------------------------------------
"Order", H,30,
//----------------------------------------------------------------------------------
END_WINDOW,
//====================================================================================================================

И получить окно с дин.таблицей.


В файле сопряжения пользователь получит этот код:

//=====================================================================================================================
//WINDOW:   Main form 1 | element: BUTTON  | name: BUY  |  Location: Window's Main Frame
//=====================================================================================================================
case BUTTON3____BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Main form 1 | element: BUTTON  | name: SELL  |  Location: Window's Main Frame
//=====================================================================================================================
case BUTTON4____SELL:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Main form 1 | element: I_BUTTON  | name: 1_Close  |  Location: Window's Main Frame   | Table: 300000007
//=====================================================================================================================
case I_BUTTON14___Close:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
   }
}
//=================================================================================================================

И определит что и как делать на событиях нажатия на кнопки.

 

Cледующая динамичная таблица будет еще интереснее. В ячейках будут поля ввода, вып.списки, чекбоксы, кнопки, радио-кнопки, прогресс-бары, поля ввода с кнопками +/-.

Самое сложное заключается именно в динамичности такой таблицы. Ведь обращение к элементам и получение их значений не привязано к конкретным параметрам, а зависит от маджика ряда.

Причина обращения: