asesor experto - preguntas varias - página 30

 
honest_knave:

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í (sin compilar, sin probar, 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ás manejar el OrderSelect también, en caso de fallo)

¡Vaya! No lo sabía.

Por lo tanto, usted mencionó dos veces, y yo exactamente no se dio cuenta de eso.
Ahora voy a probar por mí mismo y llevarlo a mi archivo principal de EA.

Muchas gracias.

 

Utilizo OrderTicket() para otros objetos, ahora veo que cuando hago clic en esos objetos - el pedido se cierra.
Me gustó su método, pero parece que influye en otros objetos.

Otros objetos de nombre como este aquí es uno de ellos.

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

Gracias de antemano.

 
Max Enrik:

Utilizo OrderTicket() para otros objetos, ahora veo que cuando hago clic en esos objetos - el pedido se cierra.
Me gustó su método, pero parece que influye en otros objetos.

Otros objetos de nombre como este aquí es uno de ellos.

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

Gracias de antemano.

La solución más elegante es cambiar su sistema de nomenclatura

Sin embargo, todavía se puede quitar el número de orden. Sólo depende del formato exacto de nomenclatura.

Pero antes de todo eso, ¿cuál es el OBJPROP_TEXT del botón? ¿Hay otros objetos que tengan el mismo OBJPROP_TEXT?

 
honest_knave:

La solución más elegante es cambiar su sistema de nomenclatura
Sin embargo, todavía se puede quitar el número de orden. Sólo depende del formato exacto de nomenclatura.
Pero antes de todo eso, ¿cuál es el OBJPROP_TEXT del botón? ¿Hay otros objetos que tengan el mismo OBJPROP_TEXT?

¡Si! Sé que puedo cambiar los nombres de los objetos Button ( también uso Prefix ) si cambio los nombres de los botones entonces podría cambiar muchas cosas, por ejemplo borrar el sistema y otras cosas que están todas vinculadas entre sí.

Abajo están los nombres de Button y HLine.

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

( por supuesto, los nombres de los objetos son un poco más diferentes, pero el mismo método )

Gracias de antemano.

 

Mercado cerrado

Tal vez he encontrado, pero no estoy seguro.
Si esto no es bueno, por favor hágamelo saber.

if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"close order button",0)>=0)

Gracias de antemano.

//--- 2ª vez editado

Hola! Hombre!

Muchas gracias. Hasta ahora no hay problemas. ¡Funciona correctamente!

 

#Objetos cruzados - Abierto

Me he enfrentado varias veces a este problema, a veces lo he superado a veces me he rendido, ahora no me gustaría volver a rendirme.
Tengo 2 objetos " HLine y Button " que se cruzan, es decir, cuando hago clic en uno de ellos, ambos seleccionados esto no es bueno para mí. ( BUTTON Width = 20, HLINE Width = como sabes )

P:¿Cómo puedo hacer cuando hago clic en el objeto BUTTON el objeto HLINE no se selecciona mientras se cruzan, por favor?
( Puedo seleccionar fácilmente HLINE donde no se cruzan )

Gracias de antemano.

( Estoy trabajando en ello, cualquier comentario bueno sería mejor, por favor. )

 

#Beneficio en Pips- Abierto |#Beneficio en Pips - Cerrado por ahora - Lo resolví

Sr. William- Yo uso su " Pip, Punto ... " códigos de cálculo.
Ahora trato de obtener beneficios en valor de pips con los códigos de abajo. Tengo 2 ordenes, una de ellas se muestra correctamente ( OP_BUY ), la segunda no se muestra correctamente - 399 - real 400 ( OP_SELL ).

P: ¿Estoy haciendo mal el cálculo del beneficio en pips, por favor?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

Gracias de antemano.

( el ultimo dia revise foros en diferentes sitios web - eso no fue beneficioso para mi )

 

Foro sobre el comercio, los sistemas automatizados de comercio y la comprobación de las estrategias comerciales

MetaTrader 4 Build 574 con el lenguaje MQL4 actualizado y el mercado de aplicaciones liberado

whroeder1, 2014.01.27 14:11

  1. No escribas código ilegible e incomprensible como ese.
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    Hazlo legible y simplifica y pon siempre paréntesis al mezclar ands/ors.
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. ¿Qué pasa con el caso en que StartHour == EndHour (es decir, todos los 24?) Ver mi código y evitar la envoltura de 24 horas.

Uno de los increíbles ejemplos de operadores " if " de una condición compleja del señor William.
¡
Sólo gracias!


He luchado los últimos 2 días para arreglar mi condición compleja del operador "if", pero no pude resolver mi problema hasta que encontré el gran ejemplo anterior.

 

Por favor, que alguien me ayude, me cuesta mucho resolver este problema.

#296

Gracias de antemano.

 

El código de abajo a veces funciona perfectamente, a veces no. No puedo resolver este problema. Cuando uso una sola orden, funciona perfectamente, pero cuando abro varias órdenes, esta función no funciona correctamente.
Por favor, ayúdeme, y un poco más explica ( que lo que está mal en el código de abajo ) que sería mejor para mí.

( Ahora, estoy trabajando en ello. )

if(id==CHARTEVENT_OBJECT_CLICK && (StringFind(sparam,Button_1,0)>=0 || StringFind(sparam,Button_2,0)>=0))
  {
   ticketnumber=(int) StringSubstr(sparam,1);

   if(OrderSelect(ticketnumber,SELECT_BY_TICKET))
     {
      if(StringFind(sparam,Button_1,0)>=0)
        {
         // ...
        }

      if(StringFind(sparam,Button_2,0)>=0)
        {
         //...
        }

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

         update_1();
         update_2();
         update_3();
        }
     }
  }

Gracias de antemano.