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

 
Bien, si no lo hacen, ayúdame a resolverlo esta noche.
 
Por favor, díganme si es posible utilizar el valor de double, que es el resultado del cálculo, como valor int sustituto para los cálculos posteriores.
Ejemplo:
   ATR_Din=iATR(NULL,PERIOD_M5,14,1);
   Din_Per210= MathRound(6000*ATR_Din+210);
   Din_Per5  = MathRound(6000*ATR_Din+5);
   
   MA210_DIN  =iMA(NULL,PERIOD_M5,Din_Per210,0,MODE_SMA,PRICE_CLOSE,1);
   MA5_DIN    =iMA(NULL,PERIOD_H1,Din_Per5,0,MODE_SMA,PRICE_CLOSE,1);
   
Aquí mis variables seleccionadas son de tipo double, pero en iMA su valor se utiliza donde se necesita un valor int (como un periodo de MA).
La pregunta es: ¿Es correcto este uso o es necesario convertir los valores a tipo int?
 
Hola a todos, ¿podríais indicar si sabéis si existe un script que ejecute una prueba experta sobre cada uno de los resultados de la optimización y guarde cada resultado de la prueba en un archivo separado (informe htm)?
 
Craft:
No me importa, ¿hay algún ejemplo o enlace que funcione?
Dame el código o dame una tarea y lo corregiremos.
 
artmedia70:
Por favor, díganme si es posible utilizar el valor de double, que es el resultado del cálculo, como valor int sustituto para los cálculos posteriores.
Ejemplo:
Aquí mis variables seleccionadas son de tipo double, pero en iMA su valor se utiliza donde se necesita el valor int (como periodo de MA).
Así que mi pregunta es: ¿Es correcto este uso o es necesaria alguna conversión de los valores a tipo int?
La conversión se realiza de forma automática, simplemente cortando la parte fraccionaria. La única limitación que he encontrado para ese uso es que no se puede poner doble en el índice del array
 
alsu:
La conversión se realiza de forma automática, simplemente cortando la parte fraccionaria. La única limitación a este uso que he visto es que no se puede poner double en el índice del array
Gracias, eso es tranquilizador... :)
Una pregunta más:
   MA200_DIN =iMA(NULL,PERIOD_M5,Din_Per200,0,MODE_SMA,PRICE_CLOSE,1);
   MA200_UP  =MA200_DIN+20*pt;
   MA200_DN  =MA200_DIN-20*pt;
   
   MA5_DIN  =iMA(NULL,PERIOD_H1,Din_Per5,0,MODE_SMA,PRICE_CLOSE,1);
   MA5_UP   =MA5_DIN+20*pt;
   MA5_DN   =MA5_DIN-20*pt;
Construcciones
MA200_UP=MA200_DIN+20*pt; 
MA200_DN=MA200_DIN-20*pt; и 
MA5_UP=MA5_DIN+20*pt; 
MA5_DN=MA5_DIN-20*pt;
no funcionan. Al mostrar sus valores en el gráfico, todos tienen el mismo valor, por ejemplo
1,4118 para MA200_DIN, MA200_UP, MA200_DN y
1,4106 para MA5_DIN, MA5_UP, MA5_DN.
Resulta que las fórmulas de cálculo de los niveles +20 y -20 puntos no funcionan.
¿Qué estoy haciendo mal?
 
¿Qué es lo que equivale a pt? Pruebe a imprimirlo con NormalizeDouble()
 
Bien, gracias, lo tengo... He puesto pt=Punto; después de calcular los valores...
Como dijo Matroskin: Eres un tonto... :)
 
alsu:
Danos un código o establece una tarea y lo corregiremos

En WelsLab, el análogo del problema se ve así:

MyATR = SMA.Series((((High-Low)/Low), PerB)[i-1] ;

if (BuyAtStop(i, (Open[i] + Open[i]*MyATR), "") ;

es decir, cuando se abre una barra, se coloca una posición Stop donde el precio Open [i] de la barra actual + el trigger (el mismo precio Open multiplicado por MyATR calculado para el periodo PerB en las barras cerradas [i-1]) se abre una vez si se alcanza el nivel especificado

Este muestra lo que quiero conseguir en mql4 usando WellLab como ejemplo.

He estudiado los materiales del sitio y he intentado hacer una analogía.

        MyATR = ((High[0] - Low[0])/Low[0]);
	 BT = Open[0] + Open[0]*iMAOnArray(MyATR ,0,PerB,0,MODE_SMA,1);
        ST = Open[0] - Open[0]*iMAOnArray((MyATR ,0,PerS,0,MODE_SMA,1);

   if (Ask >=  BT)                       // Если разница между
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (Bid <= ST)                       // Если разница между
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }

Resultado: Las órdenes se acumulan. Por favor, indique qué condición debe añadirse (o cambiarse) para que las órdenes se ejecuten una vez en un nivel determinado.

 

Nota: el primer parámetro de la función iMAOnArray debe ser un array - y tienes MyATR escalar. Para hacerlo bien, deberías:

1. Declarar el doble MyATR[];

2. Establecer el tamaño del array a ArrayResize(MyATR,PerB);

3. rellenar la matriz for(i=1;i<=PerB;i++) MyATR[i-1]=(High[i]-Low[i])/Low[i]; el índice i empieza por 1 ya que sólo necesitamos barras cerradas

4. después de esto se puede leer iMAOnArray(MyATR,0,PerB,0,MODE_SMA,0); aquí el último parámetro es 0 ya que el desplazamiento ha1 ya se ha tenido en cuenta en el paso 3.


comprueba cómo funciona, tal vez el error está en esto

Razón de la queja: