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

 
Vasiliy Sokolov:

Mierda, hombre, ¿realmente no entiendes lo que está pasando o estás tratando de cortar las esquinas de esta manera?

En cualquier panel, lo fundamental y más complicado es la visualización de la coherencia. Si una orden está abierta - debería aparecer, si no está en la pestaña de operaciones, tampoco debería estar en el panel. Esto es elemental y "muy simple" conceptualmente. Pero para que sea "muy sencillo", el panel debe basarse en un modelo de estado. No tienes nada de eso, sino alguna base de datos local de curvas no consistentes sobre cadenas metidas en objetos de usuario:

Y ahora intenta demostrarnos que no hay ningún problema, que todo se ha sacado de la manga. Que las órdenes no visualizables en su tabla están bien. Que los pedidos que están en su mesa, pero que hace tiempo que están cerrados de hecho - esto también es normal. Y en general, todo es tan normal y bueno, excepto que el número de puestos está limitado a 20.

Entiende que la cuestión es la aplicación de la fijación de la apertura/cierre de la orden por medios internos. Esto no forma parte del mecanismo de la propia mesa. Es un mecanismo para el usuario.

En lugar de criticar el motor y la implementación de la mesa, mejor escribe un mecanismo adecuado para arreglar la apertura y el cierre de la orden.

Y todo funcionará correctamente.

 
Реter Konow:

  1. Para ello, el usuario debe escribir un bucle por sí mismo sobre las órdenes en ticks o temporizadores, y comprobar sus ticks contra los ticks escritos en el array. Si no hay ningún ticket en el array, significa que el pedido acaba de ser abierto, y entonces se debe llamar al E_Main_form_1__PnL(OrderTicket(),OrderProfit());

4. Si se escriben correctamente estos ciclos de orden, la tabla funcionará correctamente....

Se me olvidó....

Pero eso no significa que la tabla dinámica en sí no funcione.

Hombre, el usuario debe estar familiarizado con la documentación, ¿sabe qué poner en cada matriz y cómo actualizarlo todo? ¡Te pedí que escribieras una demostración totalmente funcional, que fuera de tu código para entender cómo y qué se hace y dónde y qué se inserta, pero me borraste el TOR y me lo devolviste en forma de tabla torcida!

 
Vasiliy Sokolov:

Siento una gran negligencia en ti, en tu código y en todo lo que haces, más o menos para la gente, pero cuando se trata de algo específico, es una mierda. Haz una cosa pequeña pero buena y de calidad. Así que dices que todo es fácil de resolver, elemental. Pero por alguna razón has hecho una solución, en la que no hay nada. ¿Qué te impidió hacer todas estas sencillas fichas en quince días?

Perdón por la negatividad. Es que me has decepcionado. Esperaba ver más y mejor. Por favor, arregla tu demo. Que sea bueno, de calidad, de acuerdo con la solicitud y sin palabras como: "Sí es elemental, necesita un retoque aquí". Sugerir una solución fuera de la caja, que podría ser protestada.

Vasiliy, no te emociones. Nunca me han faltado al respeto. Sencillamente, no trabajé con órdenes durante mucho tiempo y he olvidado cómo hacerlo. Pero es una tarea del usuario.

Pero lo haré de todos modos. Ya que le resulta tan difícil...

 
Реter Konow:

Vasily, no hay necesidad de emoción. No he faltado al respeto en absoluto. Simplemente no trabajé con órdenes durante mucho tiempo y olvidé cómo hacerlo. Pero es una tarea del usuario.

Pero lo haré de todos modos. Si crees que es tan complicado...

Pues hazlo. No me parece tan complicado, pero repito, no hay documentación para su motor, y no sé qué array actualizar con qué parámetros. Lo que necesito es una demostración en forma de solución completa. Esta es la única manera de entender lo que está haciendo y cómo funciona. Eso es exactamente lo que esperaba de ti. Cuando lo cree, discutiremos las soluciones técnicas. Y, en general, tómate las críticas externas, incluso las de los expertos, como algo positivo, porque los comentarios negativos suelen ser más valiosos que los positivos.

 

Voy a explicar cómo funciona una tabla dinámica:

1. Cuando se hace clic en los botones de compra/venta, la señal va al archivo de conexión externa en el bloque de casos del propio botón.

case BUTTON3___BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:  
                               
                              int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-30*Point,Ask+50*Point,NULL,16384,0,Green);  
                              //--------------------------------------------------------------------------------------- 
                              if(ticket>0)
                                {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                   {
                                    Alert("BUY order opened");
                                    //----------------------------------------------------
                                    E_Main_form_1__Order(ticket,ticket);
                                    E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
                                    E_Main_form_1__Type(ticket, "BUY");
                                    E_Main_form_1__Volume(ticket,OrderLots());
                                    E_Main_form_1__Symbol(ticket, OrderSymbol());
                                    E_Main_form_1__Price(ticket, OrderOpenPrice());
                                    E_Main_form_1__Comission(ticket, OrderCommission());
                                    E_Main_form_1__Swap(ticket, OrderSwap());
                                    E_Main_form_1__PnL(ticket, OrderProfit()); 
                                    //----------------------------------------------------
                                   }
                                 //--------------------------------------  
                                 ArrayResize(Orders,OrdersTotal());
                                 Orders[OrdersTotal() - 1] = ticket;   
                                 //--------------------------------------                                    
                                }
                              else Print("Error opening BUY order : ",GetLastError());
                              //---------------------------------------------------------------------------------------
                break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;

Debe saber que se abre una nueva fila automáticamente si se envía un nuevo ticket a la funciónE_Main_form_1__Price(ticket, OrderOpenPrice());.

Si el ticket ya existe, la fila deseada se selecciona AUTOMÁTICAMENTE y el nuevo valor se establece allí.

Para cerrar una fila de la tabla llame a la función E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

El billete significa el billete de la fila.

 
Реter Konow:

Voy a explicar cómo funciona una tabla dinámica:

1. Cuando se hace clic en los botones de compra/venta, la señal va al archivo de conexión externa en el bloque de casos del propio botón.

Debe saber que se abre una nueva fila automáticamente si se envía un nuevo ticket a la funciónE_Main_form_1__Price(ticket, OrderOpenPrice());.

Si el ticket ya existe, la fila deseada se selecciona AUTOMÁTICAMENTE y el nuevo valor se establece allí.

Para cerrar una fila de la tabla llame a la función E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Boleto significa boleto de fila.

Peter, haz un bucle for en el temporizador que recorra los pedidos abiertos y envíe los cambios en la lista de pedidos a tu tabla. Además, asegúrese de que el beneficio de la orden en su tabla también cambia dinámicamente.

 
Реter Konow:

Voy a explicar cómo funciona una tabla dinámica:

1. Cuando se hace clic en los botones de compra/venta, la señal va al archivo de conexión externa en el bloque de casos del propio botón.

Debe saber que se abre una nueva fila automáticamente si se envía un nuevo ticket a la funciónE_Main_form_1__Price(ticket, OrderOpenPrice());.

Si el ticket ya existe, la fila deseada se selecciona AUTOMÁTICAMENTE y el nuevo valor se establece allí.

Para cerrar una fila de la tabla llame a la función E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Boleto significa boleto de fila.

Se trata de una aplicación torcida, y aquí está la respuesta:

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Mi enfoque. Núcleo - Motor.

Vasiliy Sokolov, 2019.01.09 13:33

Pedro, lo siento, pero tu trabajo no es aceptado, ya que lo que has enviado es un raro trabajo de piratería. Lo siento, pero parece que soy el único que corrió lo que enviaste, y nadie más hará el peritaje aparte de mí.

Así que, por orden, la asignación fue la siguiente:

Lo que veo en cambio:

En primer lugar, las operaciones sólo pueden abrirse en su panel haciendo clic en el botón de compra/venta. Si la posición se abre a través de la ventana estándar, la operación no aparece.

....

Hasta ahora, un gordo no-go. A la espera de sus perfeccionamientos. Y nada de renders en 3D hasta que lo descubras.

 

Supongamos que tenemos varias tablas dinámicas.

El archivo de propiedades de conexión imprimirá automáticamente las funciones de envoltura para trabajar con estas tablas.

He aquí un ejemplo ilustrativo. Hemos dibujado una tabla dinámicaOrders_table.

Estas son las funciones envolventes que tenemos:

void E_Main_form_1__Order(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Opening_Time(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Type(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Volume(long Magic, string Value)
//---------------------------------------------------------------------------------------------------------
void E_Main_form_1__Symbol(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Price(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Comission(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Swap(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__PnL(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Close(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)
//----------------------------------------------------------------------------------------------------------------

Nota: cada envoltura tiene un nombre de columna dyn.table al final de su nombre.

No se especifica el elemento concreto, sólola fila mágica.

Es decir, para establecer un nuevo valor en una celda de una fila existente, hay que enviar su Magic y su valor.

Para establecer un nuevo valor en una celda de una fila inexistente, hay que enviar su magik y su valor. La fila se creará automáticamente.

Para destruir una fila de la tabla, hay que llamar al wrapper con las palabrasCLOSE_ROW

Por ejemplo:

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

Y pasa en él el majik de la fila que quieres cerrar.

Eso es todo.

 
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. Asegúrese también de que el beneficio de la orden en su tabla también cambia dinámicamente.

Ok, escribiré ciclos y código para trabajar con órdenes, pero te lo daré para que lo pongas tú, porque ya he convertido el motor para enlazar a través de recursos y estoy probando eso. Ahora mismo no puedo recuperar el antiguo enlace, y aún no he terminado el nuevo.

 
Реter Konow:

De acuerdo, escribiré los bucles y el código para que funcione con las órdenes, pero te lo daré para que lo configures tú mismo, porque ya he rediseñado el motor para que se comunique a través de recursos y lo estoy probando. Ahora mismo no puedo recuperar el antiguo enlace, y aún no he terminado el nuevo.

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

Etiqueta Konow:

Es decir, para establecer un nuevo valor en una celda de una fila existente, es necesario enviar su majico y su valor.

A mí me parece 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é tuviste que hacer una joroba desde el principio?)