[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 589

 
ilunga:
Porque se trata de variables locales que ya en el segundo tick almacenan basura en lugar de billete

¡Muchas gracias! ¡Sinceramente, he pensado en ello todo el tiempo!
 
Roman.:


Vea el tráiler. Coloca su contenido en la carpeta Experts del terminal. Seleccione el marco temporal del instrumento que le interesa y colóquelo en el gráfico del Asesor Experto,

Establezca los parámetros para abrir una orden en las variables externas de MetaTrader:

A continuación, espere a que se forme una nueva barra en el marco temporal del instrumento seleccionado.

Cuando el Asesor Experto abre una orden del mercado, compara la hora de su apertura con la hora de apertura de una nueva barra.

Roman, tal y como te prometí, quiero mostrarte lo que ocurre en la práctica cuando se trabaja con el Asesor Experto en la "apertura en la apertura". En primer lugar, el EA se activa en el siguiente tick después de colocarlo en el gráfico de 1 hora y abre una segunda operación en la apertura de la siguiente vela. Por qué, aún no puedo entenderlo. En segundo lugar, el precio de apertura de la operación no coincide con el precio de apertura de una nueva vela:

2012.02.24,12:00,1.3392,1.3405,1.3383,1.3387,768 - la vela se abre en 1.3392 y la orden se activa en 1.3390. Especifico un deslizamiento de 1 punto en los ajustes. Si introdujera 0 pips, el EA no se activaría en absoluto.

Adjunto el registro. Lo importante para mí sigue siendo que la orden de apertura coincida con el precio de apertura de la vela.

 

Hola, señores. Agradecería una aclaración.

¿Estoy en lo cierto al entender que si en el código los comandos OrderDelete y OrderSend se escriben secuencialmente y si el EA recibe una señal para ejecutar ambos comandos (retirada + ajuste) en el tick #1, entonces:

- estos dos comandos no pueden ser ejecutados en el mismo tick #1, y su ejecución se alarga al menos 3 ticks, y

- en el punto 1 se emite la orden OrderDelete;

- después de enviar OrderDelete, sólo con el siguiente tick #2 se devuelve el resultado, y sólo ahora en el mismo tick #2 se puede enviar el comando OrderSend;

- el resultado de la orden OrderSend sólo se conocerá en el tercer tick.

¿Es este el caso?


¿Y es cierto que no hay posibilidad de enviar dos comandos a MT en el mismo tick?

Estoy escribiendo un EA en MT4.

Gracias.

 
Les:

Hola, señores. Agradecería una aclaración.

¿Estoy en lo cierto al entender que si en el código los comandos OrderDelete y OrderSend se escriben secuencialmente y si el EA recibe una señal para ejecutar ambos comandos (retirada + ajuste) en el tick #1, entonces:

- estos dos comandos no pueden ser ejecutados en el mismo tick #1, y su ejecución se alarga al menos 3 ticks, y

- en el punto 1 se emite la orden OrderDelete;

- después de enviar OrderDelete, sólo con el siguiente tick #2 se devuelve el resultado, y sólo ahora en el mismo tick #2 se puede enviar el comando OrderSend;

- el resultado de la orden OrderSend sólo se conocerá en el tercer tick.

¿Es este el caso?


¿Y es cierto que no hay posibilidad de enviar dos comandos a MT en el mismo tick?

Estoy escribiendo un EA en MT4.

Gracias.

Una garrapata es una nueva cita. Y no hay conexión entre los comandos OrderDelete y OrderSend

Si hay actualizaciones de noticias y deslizamientos, entonces para cuando se ejecute un simple OrderSend, habrán pasado una docena de ticks. Y si el mercado está en un plano nocturno, ambas órdenes pueden ejecutarse en un solo tick

 
Les:

Todo depende de lo rápido que vayan las garrapatas. En general, las funciones que devuelven un valor, OrderDelete, OrderSend, etc. no se ejecutan de forma asíncrona, es decir, hasta que no se pase la operación completa y se emita un código de error (o NO_ERROR en caso de éxito), no se ejecutará el siguiente operador. Otra cosa es que varios ticks pueden ejecutarse durante este tiempo, pero no serán procesados por la función start().


También puede haber una colisión cuando, por ejemplo, una orden activa un stoploss y usted intenta abrir/cerrar otra orden en el mismo tick. Entonces el servidor puede, en algunos casos, no permitirle ejecutar la operación.


Es decir, la respuesta a tus preguntas es no, no lo es))

 
ilunga:

Una garrapata es una nueva cita. Y no hay relación con el tiempo de ejecución de los comandos OrderDelete y OrderSend

Si hay actualizaciones de noticias y deslizamientos, para cuando se ejecuta un simple OrderSend, ya han pasado una docena de ticks. Y si el mercado está en un plano nocturno, entonces ambas órdenes pueden ejecutarse en un solo tick.

MT, por lo que tengo entendido, está sacando información del servidor a través de ticks (y el servidor, a su vez, está dando respuestas sobre los comandos simultáneamente con el envío de nuevos ticks, optimiza los costes por tiempo). Y antes de que llegue una nueva garrapata, no se sabe nada. Eso es lo que quería decir. Pero tal vez me equivoque en esa suposición. La pregunta tiene más que ver con la segunda opción que mencionas, cuando el tick es lento, en lugar de una docena de ticks.

¿He entendido bien, por lo tanto, que obtener una respuesta en el comando #1 no es un requisito previo para pasar al comando #2 y procesarlo completamente?

La respuesta del comando es la parte "no esencial" del comando? ¿No es crítica su presencia para pasar al siguiente comando?

Con alsu tuvimos una discusión más abajo, y creo que asumí lo mismo que él: que tener una respuesta es fundamental. Sí escribe que se pueden ejecutar dos comandos en un solo tick. Entonces, ¿la información del servidor viene sin ninguna conexión con el flujo de cotización?


Gracias.

 
alsu:
Todo depende de lo rápido que vayan las garrapatas. Por lo general, las funciones que devuelven un valor, OrderDelete, OrderSend, etc. no se ejecutan de forma asíncrona, es decir, hasta que no se pasa la operación completa y se devuelve un código de error (o NO_ERROR en caso de éxito), no se ejecuta el siguiente operador. Otra cosa es que varios ticks pueden ejecutarse durante este tiempo, pero no serán procesados por la función start().


También puede haber una colisión cuando, por ejemplo, una orden activa un stoploss y usted intenta abrir/cerrar otra orden en el mismo tick. Entonces el servidor puede, en algunos casos, no permitirle ejecutar la operación.


Es decir, la respuesta a tus preguntas es no, no lo es))

¿Cómo es que no es así, si resulta ser exactamente "así", según sus propias palabras? )) ¿O estoy entendiendo algo mal otra vez? En la respuesta escribes que las funciones se ejecutan de tal manera que el siguiente operador se ejecuta sólo después de procesar el código de error del operador anterior. Creo que eso es lo que quería decir: que "no se pueden ejecutardos comandos en el mismo tick #1", porque la respuesta -esa respuesta o código de error- aparece antes con el nuevo tick. ¿O no? ¿O las respuestas de los comandos van en un flujo temporizado separado, sin relación con el flujo de citas? ¿Quizás mi error fue suponer que los resultados de la ejecución del comando se devuelven con una nueva comilla?

Por supuesto, me refería principalmente a la situación en la que las garrapatas son lentas.

 
Por favor, díganme si es posible que el Asesor Experto cierre sólo las operaciones positivas, a pesar de la señal del indicador de cerrar la operación y cerrarlas en las próximas señales del indicador, ya que salen a beneficio?
 
Les:

MT, por lo que tengo entendido, saca información del servidor de potikovo (y el servidor, a su vez, da respuestas de comandos al mismo tiempo que envía nuevos ticks, esto optimiza los costes de tiempo). Y antes de que llegue una nueva garrapata, no se sabe nada. Eso es lo que quería decir. Pero tal vez me equivoque en esa suposición. La pregunta tiene más que ver con la segunda opción que mencionas, cuando el tick es lento, en lugar de una docena de ticks.

¿He entendido bien, por tanto, que obtener una respuesta en el comando #1 no es un requisito previo para pasar al comando #2 y procesarlo completamente?

¿La respuesta del comando es la parte "no esencial" del comando? ¿No es crítica su presencia para pasar al siguiente comando?

Con alsu tuvimos una discusión más abajo, y creo que asumí lo mismo que él: que tener una respuesta es fundamental. Sin embargo, usted escribe que se pueden ejecutar dos comandos en un solo tick. Entonces, ¿la información del servidor viene sin ninguna conexión con el flujo de cotización?


Gracias.

Las respuestas de los comandos y los ticks están separados y no están relacionados. Si hay un piso muerto, puede "atrapar" varias órdenes de apertura/cierre en el mismo tick.
 

Hola. No se me da nada bien programar. No tengo mucha experiencia en codificación, así que por favor ayúdame a añadir posiciones de cierre byStopLoss y TrailingStop a mi código. El Asesor Experto no es mío, pero la estrategia no es mala, por lo que la prueba y el error de reelaboración de la EA para mí - y para ser honesto, ya estoy volando mi mente, y no hay mucho tiempo - el trabajo. Ya lo he probado y, francamente, no tengo tiempo que perder: tengo que trabajar. Y esto es lo que hago con él:


//+------------------------------------------------------------------+
//|                                             stohastic_system.mq4 |
//|                                                    Анатолий      |                                                                  |
//+------------------------------------------------------------------+

extern double Lots=0.4;
extern int TakeProfit=50;
extern int NWave=2;
extern int K=9;
extern int D=3;
extern int slowing=5;
extern int Average_method=2;
extern int price_field=0;

int K_level=0;
int down=0;
int up=0;


int init()
  {

   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
    int ticket=0;
    double stoch_1=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,1);
    double stoch_2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2);
    double stoch_3=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,3);
    int Hour_curr=TimeHour(TimeCurrent());
    
    if ((stoch_1>90)&&(stoch_2>70)) K_level=90;
    if ((stoch_1<10)&&(stoch_2<30)) K_level=10;  
    if(OrdersTotal()<1)
      {        
        if((Hour_curr>=1)&&(Hour_curr<24))//проверка сигналов только в этот промежуток времени
          {
            if((K_level==10)&&(stoch_1>10))//сигнал на покупку
              {
                RefreshRates();
                Print("Сигнал на покупку. stoch_1=",stoch_1," stoch_2=",stoch_2);
                ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,Ask+TakeProfit*Point,"buy_order1",1,0,Blue);
                
                K_level=10; 
                down=0;               
              }
            if((K_level==90)&&(stoch_1<90))//сигнал на продажу
              {
                RefreshRates();
                Print("Сигнал на продажу. stoch_1=",stoch_1," stoch_2=",stoch_2);
                ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,Ask-TakeProfit*Point,"sell_order1",1,0,Red);
               
                K_level=90;
                up=0; 
              }
          }
      }
    
   
   
    return(0);
  }
   
Archivos adjuntos: