Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 846

 
Pokrov:

Tengo GetLastError después de las funciones y si se produce un error, ¿no irá a este bloque (como está escrito) y no se ejecutarán los comandos? Entiendo la cadena, por ejemplo, OrderSend() -> GetLastError -> bloque de error Sleep(3000) RefreshRates() -> salir del bloque y si las condiciones permanecen OrderSend() se solicita de nuevo. O mis razonamientos y conceptos son erróneos. Entiendo que quiere escribir el valor de retorno 1 o 0 en el bloque, pero mis funciones son simples no relacionados con los valores booleanos como SignalBuy, si entiendo correctamente, los valores de retorno debe ser devuelto allí.

Realiza un bucle en el número de intentos de comercio en el error. Refrescar el entorno comercial. Restablece el valor del error anterior y envía una solicitud de comercio con una comprobación del resultado devuelto. Si se devuelve un error, analícelo y, en función del código de error, finalice el ciclo por completo o realice las acciones necesarias para corregir el error y pase a la siguiente iteración del ciclo. Si la operación comercial fue exitosa, interrumpe el bucle y devuelve al programa llamante el valor correspondiente a la lógica del programa para el procesamiento posterior del resultado de la solicitud comercial (ya sea la bandera de éxito de la ejecución de la función o el número de boleto de la orden abierta, etc.).
 
Pokrov:

Tengo GetLastError después de las funciones y si se produce un error, ¿no irá a este bloque (como está escrito) y no se ejecutarán los comandos? Entiendo la cadena, por ejemplo, OrderSend() -> GetLastError -> bloque de error Sleep(3000) RefreshRates() -> salir del bloque y si las condiciones permanecen OrderSend() se solicita de nuevo. O mis razonamientos y conceptos son erróneos. Entiendo que quiere escribir el valor de retorno 1 o 0 en el bloque, pero mis funciones son simples no relacionados con los valores booleanos como SignalBuy, si entiendo correctamente, los valores de retorno debe ser devuelto allí.

También añadiré que en tu ejemplo no hay ninguna reacción después de obtener un error. Lo comprobamos y no lo hizo, salvo que decidimos dormir un poco o refrescar los datos. Sólo salir al finalizar la función OnTick()
 
¡Buenas tardes!

Necesito un consejo. Según las condiciones, la posición debe cerrarse y después de 121 segundos debe abrirse una nueva posición. ¿Cómo puedo hacerlo con Sleep(121000)?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
¡Buenos días!

Necesito un consejo. Según las condiciones, la posición debe cerrarse y después de 121 segundos debe abrirse una nueva posición. ¿Cómo puedo hacerlo con Sleep(121000)?

Ayuda: OnTimer()
 
artmedia70:
OnTimer() al rescate
Gracias. Nunca he utilizado OnTimer() y esta parte del código está en void OnTick(). ¿Puedo manejar la función OpenPosition() con OnTimer()? Si puedes, por favor, corrige el código de cómo insertar OnTimer() allí correctamente...
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

Acabo de reinstalar Windows 7 y quería instalar Mt4, el problema es que los archivos no se descargan, ¿qué debo hacer?

 
Alexei y Artem, ¡gracias por vuestros expertos comentarios y consejos!
 
abeiks:
Gracias. Nunca he utilizado OnTimer(). Esta parte del código está en void OnTick(). ¿Será posible entonces manejar la función OpenPosition() por OnTimer()? Si puedes, por favor, corrige el código de cómo insertar OnTimer() allí correctamente...

El temporizador se inicia en OnInit()

EventSetTimer(1); // раз в секунду

Para iniciar la cuenta atrás, hay que encontrar la hora de cierre de la última posición en el temporizador y contar 121 sukunds a partir de esta hora. Para pasar la bandera que permite abrir una nueva posición, utilice una variable global cuyo alcance abarque todo el programa. Puede hacer que contenga inicialmente un valor superior a 121, por ejemplo 122 (puede cambiar el tiempo de espera en los ajustes).

En OnTick(), comprueba esta variable. Si es mayor que 121 y no hay ninguna posición, se abre una posición y, tras comprobar si se ha abierto con éxito, se pone la variable a cero.

En cuanto se cierra la posición, el temporizador ve la hora de cierre de la posición (lo hace continuamente una vez por segundo) y si desde la hora actual hasta la hora de cierre de la posición pasó menos de 121 segundos, el temporizador empieza a contar - cada segundo el valor de la variable se suma en 1.

Más o menos. Donde puede haber un error - si la posición aún no se ha cerrado, su tiempo de cierre es cero. Esto puede causar un problema con el inicio de la cuenta atrás. Por ejemplo, puedes poner la variable a -1.

Sí, no olvides destruir el temporizador en OnDeinit():

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

El temporizador se inicia en OnInit()

Para iniciar la cuenta atrás, hay que encontrar la hora del temporizador en la que se cerró la última posición y contar 121 segundos desde esa hora. Para pasar la bandera que permite abrir una nueva posición, utilice una variable global cuyo alcance abarque todo el programa. Puede hacer que contenga inicialmente un valor superior a 121, por ejemplo 122 (puede cambiar el tiempo de espera en los ajustes).

En OnTick() se comprueba esta variable. Si es mayor que 121 y no hay ninguna posición - abrir una posición - y, después de comprobar si se abrió con éxito, poner la variable a cero.

En cuanto se cierra la posición, el temporizador ve la hora de cierre (lo hace continuamente una vez por segundo) y si desde la hora actual hasta la hora de cierre de la posición pasó menos de 121 segundos, el temporizador empieza a contar - cada segundo el valor de la variable se suma en 1.

Más o menos. Donde puede haber un error - si la posición aún no se ha cerrado, su tiempo de cierre es igual a cero. Esto puede causar un problema con el inicio de la cuenta atrás. Por ejemplo, puedes poner la variable a -1.

Sí, no olvides destruir el temporizador en OnDeinit():

Entendido, gracias. Esperaba hacerlo en una línea, pero probablemente tendré que trabajar un poco más.

 
abeiks:

Ya veo, gracias. Esperaba hacerlo en una sola línea, pero supongo que me va a costar más trabajo.