Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 574

 
Anton Balakirew:
La idea de abrir órdenes en una señal de compra o de agarre bajista, cómo hacer para que sólo haya una operación de compra/venta y una operación de orden pendiente, tengo una abierta en cada tick de la operación. Ayude a resolver el problema.
Compruebe el número de órdenes establecidas y el número de posiciones abiertas antes de abrir una nueva posición o colocar una nueva orden pendiente.
 
Artyom Trishkin:

Pues bien, esta es otra forma de hacerlo: se escriben cerillas para cada vela del rango. En la versión anterior, las coincidencias se escribían sólo para una vela, es decir, no se escribía ninguna coincidencia para la que coincidía con ésta.

Artem, gracias. Lo investigaré.

pako:

Los valores altos pueden redondearse, por ejemplo, podemos redondear el valor 1,23456 a 1,2346.


Ya veo lo que quiero decir. También añado una variable en los ajustes en la que se puede prescribir la desviación dentro de la cual los valores de alta se consideran iguales. Es necesario porque para las comillas de 4 dígitos a menudo no hay tal problema, pero para las comillas de cinco dígitos buscar coincidencias exactas es infinitamente posible.

 
Andrey Koldorkin:

Artem, gracias. Lo investigaré.

El redondeo está claro. También he puesto una variable en los ajustes, en la que podré prescribir el valor de desviación, dentro del cual los valores altos se consideran iguales. Es necesario, porque para las comillas de 4 dígitos a menudo no hay tal problema, pero para las comillas de cinco dígitos buscar coincidencias exactas es interminable.

De nada. He cometido una inexactitud en la segunda versión. Como en la primera versión buscábamos las coincidencias a partir de la siguiente vela del índice del bucle, el paso del bucle principal era por el número de velas menos una para comparar las dos velas más externas. Ahora, en la segunda versión, para cada una de las velas buscamos coincidencias en todo el rango, por lo que en la línea

for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"

debe cambiar el número de barras a

for(int i=0; i<copy_bars; i++) {                             // цикл по скопированным данным от начала до конца диапазона
 
Artyom Trishkin:
Compruebe el número de órdenes establecidas y el número de posiciones abiertas antes de abrir una nueva posición o colocar una nueva orden pendiente.

es decir, ¿es necesario añadir una condición para comprobar el número de órdenes y posiciones en las condiciones de una operación?

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&h2>h1&h1<o2&o1<c1&&l2>l1&&o3>c3&&o4>c4){ //first condition

if (OrdersTotal()==0) //segunda condición

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); } ................................... y así para cada comercio?

¿Y qué función cuenta el número de posiciones abiertas?

Creo que he resuelto el problema:

if (Hour()>=0&Hour()<23){

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

si (PositionsTotal()<=1)

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); } //abre la puerta a la compra

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

if (PositionsTotal()==1&OrderType()==0)

OrderSend(Symbol(), OP_SELLSTOP,Lot,l2,10,h2,0);} /Orden de venta pospuesta

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

si (PositionsTotal()<=1)

OrderSend(Symbol(),OP_SELL,Lot,o,10,h1,0); } //abre la venta

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

if (PositionsTotal()==1&OrderType()==1)

OrderSend(Symbol(), OP_BUYSTOP,Lot,h2,10,l2,0);} /Orden de compra pospuesta

}

//+------------------------------------------------------------------+

//Función que devuelve la cantidad total de posiciones abiertas |

// |

//+------------------------------------------------------------------+

int PositionsTotal() {

int pos = 0;

for (int i=0; i<OrdersTotal(); i++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

pos++;

}

return(pos);

}

//+------------------------------------------------------------------+

 
Artyom Trishkin:

Pues bien, esta es otra forma de hacerlo: se escriben cerillas para cada vela del rango. En la versión anterior, las coincidencias se escribían sólo para una vela, es decir, no se escribía ninguna coincidencia para la que coincidía con ésta.

Bien. Pero tal y como yo lo veo, si el máximo de la vela 2 coincide con el mínimo de la vela 7, entonces se encontrarán dos coincidencias: 2 <=> 7, 7 <=>2. ¿Y qué pasa con la contabilización de los pares inversos, pero sin el bucle extra?

¿No se puede resolver el problema en una sola pasada, sin utilizar bucles for anidados:)))?

 
Vasiliy Sokolov:

Gud. Sin embargo, según entiendo, si el máximo de la vela 2 coincide con el máximo de la vela 7, entonces se encontrarán dos coincidencias: 2 <=> 7, 7 <=>2. ¿Y qué pasa con la contabilización de los pares inversos, pero sin el bucle extra?

¿Qué tal si resolvemos el problema de una sola vez, sin usar bucles for anidados:)))?

:) No trates de hacerme eldébil;) Por supuesto, creo que se puede resolver el problema con un solo bucle, pero me daba pereza pensar mucho más e hice lo que se me ocurrió de inmediato.

Naturalmente, aquí se registran todas las velas emparejadas o más en los datos del partido de cada vela. De ahí las referencias cruzadas entre sí. Sólo sugiero variantes, sin saber para qué sirven.

Y además es posible resolver la tarea de optimización de los cálculos, pero no lo necesito.

Y si necesitas exactamente los datos de cada vela y de todos los partidos, y si, de repente, de repente... sólo hay ....

Así que no tengo tiempo ni ganas. He perdido mi tiempo en lugar de escribir mis propios códigos.

SZY, tal vez debería conectar también los métodos Kohonen conociendo el parámetro de entrada requerido.

 
Artyom Trishkin:

En general, no hay tiempo ni ganas. Y así perder el tiempo en lugar de escribir mis propios códigos.

Es una pena, una verdadera pena.
 
Vasiliy Sokolov:
Es una pena, es una pena.
Pues sí, es una tarea interesante, pero por desgracia no tengo tiempo.
 
Artyom Trishkin:

De nada. He cometido una inexactitud en la segunda versión. Como la primera versión buscaba coincidencias a partir de la siguiente vela del índice del bucle, el bucle principal se pasaba por el número de velas menos una para comparar las dos velas más externas. Ahora, en la segunda versión, para cada una de las velas buscamos coincidencias en todo el rango, por lo que en la línea

debe cambiar el número de barras a

Por favor, díganos el significado de estas líneas:

input int Search_Period=10; // Número de velas a copiar

int searchPeriod=(Search_Period<1)?1:Search_Period; // ¿qué significan los símbolos "?", ":"?

input int Delta=2; // Número de puntos de admisión

int delta=(Delta<0)?0:Delta; // ¿qué significan los símbolos "?", ":"?

 
Andrey Koldorkin:

Por favor, dígame el significado de estas líneas:

input Search_Period=10; // Número de velas a copiar

int searchPeriod=(Search_Period<1)?1:Search_Period; // ¿qué significan los caracteres "?", ":"?

input int Delta=2; // Número de puntos de admisión

int delta=(Delta<0)?0:Delta; // ¿qué significan los símbolos "?", ":"?

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен единице
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

De referencia:

Operador condicional ?

La forma general de un operador ternario es la siguiente

expresión1? expresión2: expresión3

Como primer operando, "expresión1" puede ser cualquier expresión que dé como resultado un valor de tipo bool. Si el resultado es verdadero, se ejecuta el operador especificado por el segundo operando, "expresión2 ".

Si el primer operando esfalso, se ejecuta el tercer operando, "expresiónZ". El segundo y tercer operandos, es decir, "expresión2" y "expresiónZ", deben devolver valores del mismo tipo y no deben ser de tipo void. El resultado de la ejecución del operador condicional es el resultado de la "expresión2" o el resultado de la "expresión3", dependiendo del resultado de la "expresión1".

//--- renormalizar la diferencia entre los precios de apertura y cierre por el rango diario

double rango_verdadero = (¿Alto==Bajo)?0:(Cierre-Apertura)/(Alto-Bajo);

Esta entrada equivale a lo siguiente

rango_doble;

if(High==Low)true_range=0;// si High y Low son iguales

else true_range=(Close-Open)/(High-Low);// si High es distinto de cero