asesor experto - preguntas varias - página 23

 

Lo recomiendo.

Cuando hayas resuelto todos esos problemas podrás considerarte entre los profesionales.

Haz las cosas lo más difícil posible, así aprenderás más.

De lo contrario, seguirás luchando con las cosas sencillas todo el tiempo.

 

En primer lugar, muchas gracias por sus comentarios.

Después de sus comentarios, decidí que debería crear de nuevo bloques de código de modificación de pedidos para asegurarse y para probar.

 

Sr. @Marco vd Heijden

Después de sus grandes comentarios / ejemplos - Ya escribo un código para los arrastres de los precios de Take Profit.
Pero en realidad estoy en contra de las actualizaciones continuas. ¿Por qué? Desde que escribo los bloques de código para Take Profit arrastra veo mi gráfico se pone lentamente. Tal vez he cometido errores en esa parte del código. Lo comprobaré después de resolver este problema.

( mientras intentaba resolver mi problema por mi mismo, después de intentarlo varias veces pensé que no hay posibilidad de parar el cálculo si utilizo el operador de bucle "for" )

Me gustaría mencionar que ya he calculado los tamaños de Take Profit y Stop Loss, por lo que he eliminado el operador "Switch" del código inferior.
Sólo estoy tratando de que cuando el precio de Take Profit sea igual al precio de la "línea", entonces la parada se calcule/actualice hasta la próxima vez que el precio de Take Profit sea igual al precio de la línea.
P
: Estoy luchando para corregir el código de abajo para mi preocupación. ¿Qué puedo hacer, por favor?
P: ¿Estoy haciendo mal, no estoy usando el operador "Switch" para este problema?

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               /* I just try for - if price not equal != "Line OBJPROP_PRICE "
                  stop updates */


               // if objects not found - create them
               // ...
               // if objects exist
               // ...
               while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
                 {
                  PlaySound("ok.wav");
                  price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
                  Comment(price);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Mientras leía la documentación y el libro de OrderModify() con el ejemplo no vi el ejemplo exactamente para mi preocupación.

¡Todo lo mejor para usted!

 

No he estado al día con el hilo, así que puede que me haya perdido lo que estás haciendo.

En primer lugar, simplifica:

for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
Debería ser:
for(int order=OrdersTotal()-1; order>=0; order--)
     {
      if(OrderSelect(order,SELECT_BY_POS)

Además, piensa en la frecuencia con la que mueves la línea. ¿Es una vez por segundo? Probablemente no.

Pon tu código en OnChartEvent():

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line

Estás llamando a la misma función varias veces en cada orden abierta que tienes:

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
   Comment(price);
  }

Llámala una vez antes de entrar en el bucle de la orden:

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal()-1; order>=0; order--)
  {  
 

Asegúrese de entender el principio de los bucles while.

Es peligroso porque si por alguna razón otro EA trata de modificar el valor del precio de la línea, entonces como resultado esta pieza de código se atascará en un bucle sin fin y su terminal probablemente se congelará.

Esto suele terminar en una terminación anormal.

Dado que está utilizando el objeto "línea" el peligro sin embargo no es tan grande como cuando se habla de los niveles tp y sl que son enviados al servidor por OrderModify() así que a menos que esté planeando escribir otro EA que interfiera con "línea" no debería ser un problema.

 
honest_knave:

No he estado al día con el hilo, así que puede que me haya perdido lo que estás haciendo.


Llame una vez antes de entrar en el bucle de orden:

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal(); order>=0; order--)
  {  

Por favor, entienda lo que está tratando de hacer.

Debe llamar dos veces y comparar los valores para ver si la línea se ha movido.

Eso es imposible de hacer sin leer el valor dos veces.

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))// if price differs from "line" value do:
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);// now overwrite old line value with new line value.
   Comment(price);
  }
 
Marco vd Heijden:

Por favor, comprenda lo que está tratando de hacer.

Debe llamar dos veces y comparar los valores para ver si la línea se ha movido.

Es imposible hacerlo sin leer el valor dos veces.

Tendrá que explicarme eso de nuevo.

Si tiene un CHARTEVENT_OBJECT_DRAG y el sparam es "línea" entonces la línea se ha movido.

Para las raras ocasiones en que se mueve en el tiempo a lo largo del mismo precio, la penalización no es mucha.

 

Hay muchas formas de hacer lo mismo.

Si decide utilizar el CHARTEVENT recuerde que no funciona en el probador.

 
Bien, os lo dejo a vosotros. Buena suerte.
 

Ya leí sus comentarios beneficiosos, Sr. Marco, Sr. Knave, Sr. William, ¡muchas gracias a todos esos comentarios!

Ahora ya he comprobado algunas cosas y también he decidido que podría escribir ( / y comprobar) OrderModify() paso a paso. Porque este OrderModify() es realmente muy peligroso para mí.
Varias veces ya me he enfrentado a modificaciones erróneas. Pero cuando trato de enfrentarme a los mismos problemas, sé con seguridad de dónde vienen los problemas, incluso intento las mismas cosas en el gráfico que los problemas no se produjeron de nuevo. Después de unas horas me encontré con el mismo problema de nuevo.
Todavía no sé exactamente la causa de estos problemas. A qué problema me refiero. Ya he compartido uno de ellos con usted en mis comentarios anteriores. También abrí una posición con mi EA en el panel de comercio, ¡está bien! luego traté de abrir el límite de venta con el método de comercio manual. ( que es mi panel de comercio no tienen que Vender Límite o Vender Stop órdenes pendientes todavía )

Creo que debería compartir los códigos del bloque con ustedes, pero no puedo compartirlos por ahora porque todavía estoy trabajando en ello. Quiero mover los códigos del bloque a OnChartEvent() - porque también voy a añadir algunos botones en él.

Problema: No puedo escribir un código si la orden se cierra y luego elimina sus objetos, como esto, Stop Loss, Take Profit, Open, Close flechas algo como esto, por favor ayúdeme.
Pregunta: También las líneas de Stop Loss, Take Profit frente a los objetos del panel de operaciones. Sé que causó desde la última vez crea objeto. Pero si usted me entiende, por favor, hágame saber cómo puedo hacer que el objeto del panel de comercio debe ser el frente de todos los otros objetos sin "Stop Loss y Take Profit" Líneas.

Gracias de antemano.