asesor experto - preguntas varias - página 29

 
honest_knave:
Publica tu código donde obtienes el OrderTicket para hacer el nombre.

( Cuando alguien necesita algo de código - me demoro en publicarlo rápidamente - porque uso funciones OBJECT_****, es poco diferente de las documentaciones de los objetos )

El código de abajo está en OnTick().

for(i=OrdersTotal()-1;i>=0;i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(Symbol()!=OrderSymbol()) continue;
   ObjectCreate(0,"#"+IntegerToString(OrderTicket())+" -"+"Object Button",OBJ_BUTTON,0,0,0);
  }

Ahora, trato de llamar a ese objeto por el OnChartEvent() como abajo.

if(id==CHARTEVENT_OBJECT_CLICK && sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
  {
   // when click this button - do something...
  }

Gracias de antemano.

 
no está dentro del bucle de pedido, por lo que no conoce el OrderTicket().
 
Marco vd Heijden:
no está dentro del bucle de pedido, por lo que no conocería el OrderTicket().
Entonces, ¿no hay ninguna posibilidad?
 
Max Enrik:
Entonces, ¿no hay ninguna posibilidad?

La mayoría de las cosas son posibles. Pero no tengo claro qué es lo que quiere conseguir. ¿Qué es este botón? ¿Qué quiere hacer cuando se hace clic en él?

Probablemente pueda obtener el resultado deseado, pero es posible que tenga que cambiar su enfoque.

 
honest_knave:

La mayoría de las cosas son posibles. Pero no tengo claro qué es lo que quiere conseguir. ¿Qué es este botón? ¿Qué quiere hacer cuando se hace clic en él?

Probablemente puedas conseguir el resultado deseado, pero puede que tengas que cambiar tu enfoque.


Mi propósito es que este objeto botón pueda mostrar los nubers de las entradas y su ganancia cuando hago clic en ellos, que la nube de pedidos se cierre.

He escrito este comentario desde un dispositivo móvil. Por lo tanto, voy a empezar a investigar sobre este tema después de 10 horas más tarde. Gracias por sus comentarios.
 
Max Enrik:

Mi propósito es que este objeto botón pueda mostrar los nubers de las entradas y su beneficio cuando haga clic en ellos, que la nube de pedidos se cierre.

He escrito este comentario desde un dispositivo móvil. Por lo tanto, voy a empezar a investigar sobre este tema después de 10 horas más tarde. Gracias por sus comentarios.

Tenga una etiqueta única en los nombres de los objetos que identifique estos botones. Parece que está utilizando "#"

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is one of your order buttons being clicked

Luego extraer el número de orden del resto del nombre del objeto, o del texto del botón.

No es necesario utilizar OrderTicket() en esta etapa.

 

Sus objetos son identificados por el orderticket.

"#"+IntegerToString(OrderTicket())+" -"+"Object Button"

Así que cada objeto tiene el número de ticket en su nombre de cadena para poder encontrar a qué orden pertenece el objeto.

Esto significa que cada objeto tendrá "#" en su nombre de cadena.

Así que, esencialmente, al hacer clic en un botón, primero tiene que extraer el número de ticket de pedido del nombre de la cadena del objeto, y luego ejecutar el bucle orderselect, y cuando el ticket de pedido seleccionado coincida con el número de ticket de pedido extraído del nombre de la cadena del botón, habrá encontrado el pedido.

O puede simplemente

SELECT_BY_TICKET

Para seleccionar el pedido dentro del evento gráfico.

Ahora sería mucho más fácil si sólo le da al objeto el número/nombre del ticket y nada más.

ObjectCreate(0,"IntegerToString(OrderTicket()),OBJ_BUTTON,0,0,0);

Porque entonces puede seleccionar directamente el ticket o comparar los números.

 

Yo era el último día trató de OrderSelect () Loop. Ahora primero lo intentaré una vez más pronto.
Entonces voy a investigar profundamente sus últimos comentarios.

Gracias por sus tiempos valiosos.

 

He probado el código de abajo en mi archivo test.mq4 así que el código de abajo funciona perfectamente, y hasta ahora no he tenido ningún problema, pero todavía lo estoy probando.

P: ¿Puedes mejorar el código de abajo si es malo, por favor?

if(id==CHARTEVENT_OBJECT_CLICK)
  {
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;

      if(sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
        {
         if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE))
           {
            Print("# Error ",GetLastError());
           }
        }
     }
  }

Gracias de antemano.

( Estoy trabajando en ello )

 

Un examen superficial sugiere que debería funcionar. Pero podría mejorar la eficacia.

Piensa en cuántos objetos diferentes has dibujado en tu gráfico. Si hace clic en *cualquiera* de esos objetos, va a recorrer cada una de las órdenes e intentar encontrar una coincidencia. Muchos objetos probablemente no tienen nada que ver con las órdenes. Esto es ineficiente.

Por eso sugerí comprobar el primer carácter de sparam para "#". Esto identifica automáticamente el objeto como relacionado con un pedido.

Además, no es necesario hacer un bucle a través de los pedidos. El nombre del objeto y/o el texto del objeto ya contienen el número de ticket. Así que extraiga el número de ticket de ahí y cierre el pedido

Ejemplo:

Usted abre un pedido. Se le da el número de ticket 12345

Crea un OBJ_BUTTON con el nombre"#12345".

El código en OnChartEvent() sería algo así (no compilado, no probado, a última hora de la noche...):

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is an order button
  {
   int ticket=(int)StringSubstr(sparam,1); // extract the ticket number
   if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order
     {
      if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order
        {
         Print("# Error ",GetLastError());
        }
     }
  }
(probablemente querrá manejar el OrderSelect también, en caso de fallo)