Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 202

 
Yurij Kozhevnikov:

=

Este parece ser el caso, si entiendo correctamente el principio de sustitución.

Puntos y comas adicionales después de los corchetes. Y no está claro a qué más se refiere.

Es una pena que aparentemente no haya una forma fácil de automatizar la expansión de la macro para ver qué pasa. A no ser que pueda inventar mi propio guión.

Gracias. Hay una razón por la que no hay punto y coma después de "while" en la macro.

Las macros son algo bueno, pero la línea entre el bien y el mal, en su caso, es aún más fina que con una mujer))) Hay que tener mucho, mucho cuidado con ellos. Y sí, en mi ejemplo, no ';', sino exactamente else, que empezó a referirse a if, que está en la macro, después de quitar ;.

Yo soy muy bueno con las macros, así que para un caso como el tuyo he dejado de usarlas desde hace un año y medio, es óptimo:

inline bool CheckRead(){
   ...
}

if (!CheckRead()) return;
 

Excepto que no encuentro nada sobre inline aquí.

Y no sé C++.

 

¡Buenas tardes! ¡Por favor, ayuda!

Hay un código bastante sencillo para abrir y modificar una orden. Las funciones OrderSend, OrderSelect y OrderModify se ponen en un bucle con un pequeño retraso entre los intentos. Para minimizar los errores de comunicación, etc.

Sucede lo siguiente: la orden se abre normalmente, luego se modifica con éxito el StopLoss y se modifica con éxito el TakeProfit. Pero cuando establezco el TP, el StopLoss se anula. No puedo entender la razón.

Aquí está esta parte del código:

send = 5; //número máximo de intentos para establecer una orden

tick=0;

sendschet=0; //contador de intentos

while(!tick && sendschet<=send)

{

tick=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Bid,150,0.0,0.0,komm,MagNum,0,Yellow);

envía a la gente;

Sleep(1000); //Demora 1 segundo antes del siguiente intento

}

select = 5; //número máximo de intentos para seleccionar un pedido

slschet=0; //contar para la selección de pedidos

while(!OrderSelect(tick,SELECT_BY_TICKET) && slschet<=select)

{

slschet++;

Sleep(500); //Demora 0,5 segundos antes del siguiente intento

}

if(slschet<select) //los intentos fueron menos que el máximo, significa que la orden fue seleccionada con éxito

{

modify = 5; //número máximo de intentos para modificar la orden

mdschet=0;

while(!OrderModify(tick,OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Yellow)

&& mdschet<=modificar)

{

mdschet++;

Sleep(500); //Demora 0,5 segundos antes del siguiente intento

}

*Aquí todo está bien - SL está ajustado

mdschet=0; //restablecer el contador antes de cambiar el TP

while(!OrderModify(tick,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TP,Digits),0,Yellow)

&& mdschet<=modificar)

{

mdschet++;

Dormir(500);

}

}

*Donde el TP se establece normalmente, pero el SL ya es igual a 0.0. Entonces resulta que OrderStopLoss() es igual a 0.0.

Sin embargo, la selección de pedidos no ha cambiado.

Si añadimos OrderSelect una vez más entre la configuración de SL y TP, todo parece funcionar. Pero contradice la lógica.

Gracias de antemano por su ayuda en este asunto.

 

¡Buenas tardes!

Por favor, ayúdenme a lidiar con el cambio de tamaño de un array dinámico.

Digamos que estoy configurando un array:

int DB[][8];

Luego en la primera subrutina del bucle, posiblemente varias veces (no hay preguntas al respecto -- hasta ahora funciona como se pretende):

ushort i = 0;
ArrayResize(DB,i+1);

En la siguiente subrutina añadiré elementos en la primera dimensión del bucle. No sé con cuánta antelación. Sé que es más lento que si se declara la dimensión de antemano. Pero creo que hasta 500 incorporaciones al año no harán la diferencia.

La pregunta es, ¿cómo puedo averiguar el tamaño existente del array en esta subrutina? Tomarlo como tamaño base y añadirle un nuevo valor.

¿Tomar ArraySize() y dividir por 8? ¿O hay alguna otra función que me convenga más?

Gracias de antemano.

 
Oleg_Ko:

¡Buenas tardes!

Por favor, ayúdenme a lidiar con el cambio de tamaño de un array dinámico.

Digamos que estoy configurando un array:

Luego en la primera subrutina del bucle, posiblemente varias veces (no hay preguntas al respecto -- hasta ahora funciona como se pretende):

En la siguiente subrutina añadiré elementos en la primera dimensión del bucle. No sé con cuánta antelación. Sé que es más lento que si se declara la dimensión de antemano. Pero creo que hasta 500 incorporaciones al año no harán la diferencia.

La pregunta es, ¿cómo puedo averiguar el tamaño existente del array en esta subrutina? Tomarlo como tamaño base y añadirle un nuevo valor.

¿Tomar ArraySize() y dividir por 8? ¿O hay alguna otra función que me convenga más?

Gracias de antemano.

ArrayRange()

Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

ArrayRange()

Artem, gracias.
 

Buenas tardes.

No he operado en MT4 desde hace mucho tiempo, decidí probarlo de nuevo. Anteriormente utilizaba el script (adjunto), pero ahora no se ejecuta, por favor, vea qué ha fallado.

Archivos adjuntos:
RiskAdvisor.mq4  12 kb
 
Nauris Zukas:

¡Hola!
¿Existe alguna forma de conocer inmediatamente CopyHigh el número de elementos de un array en cualquier periodo de tiempo?

Lo responderé yo mismo, quizás alguien se encuentre con la pregunta a través de un buscador.

SeriesInfoInteger(symbol_name,timeframe,SERIES_BARS_COUNT);
 
Nauris Zukas:

Lo responderé yo mismo, quizás alguien se encuentre con la pregunta a través de un buscador.

También Bars(), iBars()
 
Artyom Trishkin:
También Bars(), iBars()

Con Bars(), no se puede averiguar el número de elementos de la matriz en cualquier período de tiempo, sino sólo en el gráfico actual.