[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 409

 

sss2019:



Muéstrame un ejemplo por favor, lo hice No funcionó


Hice el script así

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

Como resultado, Print produce lo siguiente

0 4

1 4

Eso es todo, por alguna razón el bucle no imprime

2 4

3 4

He añadido al bucle OrderSelect(i, SELECT_BY_POS, MODE_TRADES en lugar de I 0, es decir, siempre se selecciona la primera orden y el script funciona correctamente. Resulta que cuando el bucle borra dos pedidos, intenta seleccionar el tercer pedido cuando sólo hay dos pedidos en la lista.

 
sss2019:


Hice el script así

Al final...

Ejemplos
 
sss2019:

Por favor, muéstrame un ejemplo, yo lo hice

for(i = OrdersTotal(); i > 0; i--)

No ayudó.


porque todavía tienes que pensar.

for(i = OrdersTotal()-1; i >=0; i--)
 

Ayúdame a resolver este dilema

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

El script busca la distancia máxima entre las líneas. Sale todos los valores en todas las barras, el rango máximo es 1,6235 en una barra y 1,6208 en la otra.

Intento imprimir Print(maxrange); imprime 0.086, no entiendo por qué, estoy dividiendo por Punto

 
sss2019:

Ayúdame a resolver este dilema

El script busca la distancia máxima entre las líneas. Sale todos los valores en todas las barras, el rango máximo es 1,6235 en una barra y 1,6208 en la otra.

Intento imprimir Print(maxrange); devuelve 0,086, no entiendo en absoluto por qué, estoy dividiendo por Punto


Esto no es un dilema. Un dilema es cuando no sabes cuál de dos soluciones es la mejor.

Bueno, primero, la función iMA() tiene siete parámetros, no seis. En segundo lugar, has declarado una variable mediante la cadena int i. Y además, la variable i no se inicializa en ninguna parte con un valor. Como resultado, o bien es cero o bien contiene basura de memoria sobrante de la actividad anterior. Y en tercer lugar, el bucle while está dispuesto de forma incorrecta. Digamos que la variable i es igual a cero después de la inicialización. Supongamos también que la expresión Ma1 > Ma2 también es cierta. Como resultado, la línea while(Ma1 > Ma2) iniciará el bucle. En la siguiente iteración del bucle descubriremos que la expresión (Ma1 > Ma2) ya no es cierta y el bucle terminará. Las variables Ma1 y Ma2 no contendrán la distancia máxima - la distancia máxima fue una vez. Esta condición sólo mostrará que Ma1 ha pasado a ser menor o igual que Ma2.

Además, la variable maxrange se inicializará con un valor sólo en la cadena range = (Ma1 - Ma2)/Punto; Pues bien, ¿qué pasa si la condición if(range > maxrange) no se da nunca, porque no se inicializa la variable maxrange con un valor en ningún otro lugar del código? Así que resulta que estás comparando el resultado de los cálculos con la basura de las células de memoria. Aquí tienes impresiones incomprensibles como resultado de la ejecución del código.

 
El caso es que estaba emitiendo todos los valores de MA en el bucle, y todos los valores son correctos, es decir, se han enumerado todos los valores de MA para este periodo. Pero el cálculo es erróneo en este lugar - rango = (Ma1 - Ma2)/Punto;
if(range > maxrange) maxrange = range;
 
sss2019:
Esa es la cuestión, estaba emitiendo todos los valores de MA en el bucle y todos los valores son correctos, es decir, todos los valores de MA del periodo han sido comprobados. Pero el cálculo es erróneo en este lugar - rango = (Ma1 - Ma2)/Punto;
if(range > maxrange) maxrange = range;

*Punto

rango = (Ma1 - Ma2)*Punto





 
pako:

*Punto

rango = (Ma1 - Ma2)*Punto

MA1 = 0,6526, MA2 = 0,6516. MA1-MA2 = 0,6526-0,6516 = 0,0010. Punto = 0,0001. Si se multiplica, es un bilibrio. 0,0010 * 0,0001 = 0,0000001
 
sss2019:
El caso es que estaba emitiendo todos los valores de MA en el bucle, y todos los valores son correctos, es decir, se han enumerado todos los valores de MA para este periodo. Pero el cálculo es erróneo en este lugar - rango = (Ma1 - Ma2)/Punto;
if(range > maxrange) maxrange = range;

Hay que comprobar lo que se introduce. ¿Qué valores de las variables intervienen en los cálculos?
 

En el tutorial MQL en el capítulo de Funciones Estándar en la sección de Operaciones Gráficas hay una función WindowHandle con la siguiente descripción:" ... devuelve el descriptor del sistema de la ventana (manejador de ventana) que contiene el gráfico especificado".

Pregunta: ¿qué significa "asa de ventana" (qué es) y para qué sirve?

P.S. Para no saturar el foro, gracias de antemano por su respuesta

Razón de la queja: