Mi enfoque. El núcleo es el motor. - página 129

 
Voy a poner mis cinco centavos. No tengo tiempo para ello en este momento. Pero existe la idea de implementar un panel similar en casa. Así que creo que no sólo hacer una cruz para cerrar una posición (aunque es necesario), sino también hacer una marca, especificar el lote y hacerlo al por mayor de cierre. Eso dará un trabajo más flexible con las posiciones, así como su cierre parcial.
 
Vasiliy Sokolov:

Trabaja con la versión del motor que adjuntaste como demostración.

Es bastante sencillo. Si tu planteamiento funciona como creo que lo hace, entonces no veo ningún problema ni con una tabla dinámica ni con la actualización de los valores de posición a través de un temporizador. Peter, ¿por qué hiciste un lío desde el principio?)

Vasiliy, lo principal es no apresurarse a sacar conclusiones. Ni para ti ni para mí)).

 
Konstantin Nikitin:
Voy a poner mis cinco centavos. No tengo tiempo para ello en este momento. Pero existe la idea de implementar un panel similar en casa. Así que creo que no solo hay que hacer un cruce para cerrar la posición (aunque es necesario), sino también hacer una marca, especificar el lote y hacer este cierre al por mayor. Eso dará un trabajo más flexible con las posiciones, así como su cierre parcial.

Puedo hacerlo.

 
Vasiliy Sokolov:

Peter, haz un bucle for en el temporizador, que recorra las órdenes abiertas y envíe los cambios en la lista de órdenes a tu tabla. Además, haga que el beneficio de la orden en su tabla también cambie dinámicamente.

Vasily, por favor, pega este código en el archivo de prueba del EA (las funciones de tick y timer en lugar de las antiguas)

//+------------------------------------------------------------------+
//| 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);
                  //--------------------------------------------------                      
                 } 
              } 
          }
      }         
 }

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

Y también, tienes que reemplazar la línea 68 y la línea 114 en el archivo de Conexión Externa.

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));

Un poco mezclado allí. En lugar deOrderOpenTime() pongaOrderOpenPrice().


Debería funcionar bien. Compruébalo.

 
Ojo, he retocado un poco el código de arriba (si ya lo has puesto).
 

Eh, no es la forma canónica - separar los datos (modelo) de las vistas y utilizar el patrón de observador para suscribir vistas específicas a los cambios del modelo o campos específicos del modelo.

Pero eso requeriría que el usuario de dicha biblioteca, pensara en orientación a objetos y metiera sus datos de EA en la estructura de objetos propuesta (sí, sí, hay que aprender los métodos de esa biblioteca/marco para construir una interfaz). Y mucha gente no sabe nada de OOP.

Pero Pedro dice que no tienes que aprender nada. Solo tienes que meter tus variables globales en el carrete de manejadores generados y la interfaz funcionará. No se trata de "hacer tablas para una estantería, conectarlas según las instrucciones y ordenar los libros", sino de "dibujar tu estantería y ordenar tus libros en ella". Code Less Do More ((c)/JQuery si lo es)


Está claro que hay un problema de posicionamiento del producto. ¿Y qué pasa si lo es? ¡Oye, programador! ¿Quieres ganar dinero? Puede vender lo que le parezca bien. Coge un centenar de Asesores Expertos sin interfaz y véndelos con interfaz. jajaja ))


Bueno, hay una desventaja del archivo de interfaz, en el que los manejadores de los controles "sobresalen" - es estático. Tendré que devanarme los sesos y crear un nuevo tipo de manejador que actúe como plantilla y acepte los datos del usuario/programa mediante parámetros de entrada.

 
Igor Volodin:

Eh, para no hacer el canon...

Está bien, Rehtag hará Konowam. )))

 
Igor Volodin:

Eh, no es lo canónico - separar los datos (modelo) de las vistas y utilizar el patrón de observador para suscribir vistas específicas a los cambios del modelo o campos específicos del modelo.

Pero eso requeriría que el usuario de dicha biblioteca, pensara en orientación a objetos y metiera sus datos de EA en la estructura de objetos propuesta (sí, sí, hay que aprender los métodos de esa biblioteca/marco para construir la interfaz). Y mucha gente no sabe nada de OOP.

Pero Pedro dice que no tienes que aprender nada. Solo tienes que meter tus variables globales en el carrete de manejadores generados y la interfaz funcionará. No se trata de "hacer tablas para una estantería, conectarlas según las instrucciones y ordenar los libros", sino de "dibujar tu estantería y ordenar tus libros en ella". Code Less Do More ((c)/JQuery si lo es)


Está claro que hay problemas de posicionamiento de los productos. ¿Y qué pasa si lo es? ¡Oye, programador! ¿Quieres ganar dinero? Puede vender lo que le parezca bien. Coge un centenar de Asesores Expertos sin interfaz y véndelos con interfaz. jajaja ))


Bueno, hay una desventaja del archivo de interfaz, en el que los manejadores de los controles "sobresalen" - es estático. Tendré que devanarme los sesos y crear un nuevo tipo de manejador que actúe como plantilla y acepte los datos del usuario/programa mediante parámetros de entrada.

Al principio pensé que era otra tanda de negativos, pero luego lo leí mejor y resultó que no. Sólo emociones.

Este constructor está destinado a las personas que son realmente aficionadas al trading algorítmico. Tiene sentido que no pierdan el tiempo estudiando bibliotecas gráficas, sino que se limiten a crear un código de este tipo:

//====================================================================================================================
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,
//====================================================================================================================

Y consigue una ventana con una mesa de comedor.


En el archivo de la interfaz el usuario obtendrá este código:

//=====================================================================================================================
//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;
  
   }
}
//=================================================================================================================

Y determinará qué hacer y cómo hacerlo en los eventos de clic de los botones.

 
 

La próxima tabla dinámica será aún más interesante. Las celdas tendrán campos de entrada, listas emergentes, casillas de verificación, botones, botones de radio, barras de progreso y campos de entrada con botones +/-.

Lo difícil es el dinamismo de dicha mesa. Al fin y al cabo, el acceso a los elementos y la obtención de sus valores no están vinculados a parámetros específicos, sino que dependen de la disposición de las filas.