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.
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.
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)
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.
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.
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
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í)).
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.
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)
Y también, tienes que reemplazar la línea 68 y la línea 114 en el archivo de Conexión Externa.
Un poco mezclado allí. En lugar deOrderOpenTime() pongaOrderOpenPrice().
Debería funcionar bien. Compruébalo.
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.
Eh, para no hacer el canon...
Está bien, Rehtag hará Konowam. )))
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:
Y consigue una ventana con una mesa de comedor.
En el archivo de la interfaz el usuario obtendrá este código:
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.