Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1422

 
andrey46:
No sé por qué el Asesor Experto en el Probador de Estrategias funciona bien, coloca órdenes, etc., pero en la cuenta real, aunque el robot está activo, no se colocan órdenes

Tienes que leer la revista, puede haber una respuesta

 

¿Puede decirme cómo conseguir esto?

double w = 18.2

consigue esto -

int w = 18
 
TrederMT5:

¿Puede decirme cómo conseguir esto?

consigue esto -

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

Una conversión de tipo explícita.

También se puede redondear un entero a partir de un no entero, pero el doble será 18,0

 
scomoroh:

Entonces repetiré la pregunta.

La expresión

if (izmb>b ||izmb<b || izms>s || izms<s)

es idéntico a éste:

if (izmb!=b || izms!=s)

Y si quieres almacenar algo, hazlo en una variable global.

Es el que se declara fuera del cuerpo de la función.

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


Gracias
 

¡Buenos días a todos!

Pregunta sobre el MQL4. Este es un código sencillo

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Горизонтально ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
Print("----LoY[1][0]-- Вертикалььно ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

Crea una matriz bidimensional y la llena de valores. Hay dos funciones en el código que me interesan - ArrayFill(LoY,0,31,0.5555); y ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Según el Manual de Referencia, ambas funciones trabajan con arrays bidimensionales.ArrayFill() funciona estrictamente en matrices rellenadas horizontalmente, el libro de referencia especifica que rellena la matriz con valores estrictamente de izquierda a derecha (no de arriba a abajo o de abajo a arriba). ArraySort() ordena una matriz bidimensional por la primera dimensión. La Referencia no dice si ordena matrices rellenas horizontalmente o verticalmente. A juzgar por la ejecución de mi código, ArraySort() ordena sólo matrices rellenas verticalmente . Parece que estas dos funciones no pueden manejar un mismo array en un programa.

P. Es importante para mí que la función ArraySort() funcione correctamente . Entonces, ¿se puede configurar ArraySort() para ordenar matrices rellenas horizontalmente, con las que funciona ArrayFill()? ¿O la función de ordenación de MQL5, que funciona en MQL4, puede ayudarme en su lugar? O hay alguna función que convierta un array llenado horizontalmente con todos sus valores en uno vertical, en pocas palabras, cómo hacer que mi programa ordene un array horizontalmente

Nota. Usar un bucle en lugar de ArrayFill() no me funciona.

Gracias por la ayuda.

 
ANDREY:

¡Buenos días a todos!

Pregunta sobre el MQL4. Este es un código sencillo

Crea una matriz bidimensional y la llena de valores. Hay dos funciones en el código que me interesan - ArrayFill(LoY,0,31,0.5555); y ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Según el Manual de Referencia, ambas funciones trabajan con arrays bidimensionales.ArrayFill() funciona estrictamente en matrices rellenadas horizontalmente, el libro de referencia especifica que rellena la matriz con valores estrictamente de izquierda a derecha (no de arriba a abajo o de abajo a arriba). ArraySort() ordena una matriz bidimensional por la primera dimensión. La Referencia no dice si ordena matrices rellenas horizontalmente o verticalmente. A juzgar por la ejecución de mi código, ArraySort() ordena sólo matrices rellenas verticalmente . Parece que estas dos funciones no pueden manejar un mismo array en un programa.

P. Es importante para mí que la función ArraySort() funcione correctamente . Entonces, ¿se puede configurar ArraySort() para ordenar matrices rellenas horizontalmente, con las que funciona ArrayFill()? ¿O la función de clasificación de MQL5, que funciona en MQL4, puede ayudarme en su lugar? O hay alguna función que convierta un array llenado horizontalmente con todos sus valores en uno vertical, en pocas palabras, cómo hacer que mi programa ordene un array horizontalmente

Nota. Usar un bucle en lugar de ArrayFill() no me funciona.

Gracias por su ayuda.

¿Te has fijado en el

Nota:

ArrayFill

Los arrays multidimensionales cuando se procesan con ArrayFill() aparecen como unidimensionales, por ejemplo, array[2][4] se procesa como array[8], así que cuando se trabaja con este array es aceptable especificar el índice del elemento inicial igual a 5. Así, llamando a ArrayFill(array, 5, 2, 3.14) para array[2][4] se llenarán los elementos de array[1][1] y array[1][2] con 3.14.


Esta cadena

ArrayFill(LoY,0,31,0.5555);

llenará el array con exactamente una línea.

En cuanto a la verticalidad/horizontalidad, así es como se sostendría la cabeza mirando la entrada. Mira la tabla de Excell y todo se aclarará. Si la columna "A" se llena de valores, se obtiene un array unidimensional. ¿Cómo se organiza? Correcto... en horizontal, porque lo estoy viendo tumbado en el sofá.........

 
Alexey Viktorov:

¿Se ha dado cuenta de la

Nota:

Esta línea

llenará el array con exactamente una línea.

En cuanto a la verticalidad/horizontalidad, se trata de cómo sostendrías la cabeza mirando la entrada. Mira la tabla de Excell y todo se aclarará. Si la columna "A" se llena de valores, se obtiene un array unidimensional. ¿Cómo se organiza? Correcto... horizontalmente, porque lo estoy viendo acostado en el sofá.........

Gracias por la respuesta. Tengo todo lo que has escrito. Pero no entendí el significado de lo que escribiste en términos de mi problema.

Por matriz bidimensional horizontal en mi código me refiero a cuando hay 2 filas bajo el índice 0 o 1 y columnas bajo los índices 0 a 30. La primera dimensión se denota como[0][0],[0][1],[0][2], ...[0][30] La segunda dimensión se denota como[1][0],[1][1],[1][2], ...[1][30]

Por matriz bidimensional vertical en mi código me refiero a cuando hay 31 filas indexadas de 0 a 30 y 2 columnas indexadas 0 y 1. La primera dimensión se denota como[0][0],[1[0],[2][0], ...[30][0] La segunda dimensión se denota como[0][1],[1][1],[2][1], ...[30][1]

Si ejecuta mi código, el array se llenará verticalmente. Y la función ArraySort() ordenará el array como es debido.

PREGUNTA ¿Por qué no funciona la función ArrayFill() en este caso ? Al fin y al cabo, le pedí que llenara la primera dimensión del array (31 elementos) con los mismos valores 0,5555 en el minuto 20.
Gracias por su ayuda.

 
MakarFX:

Yo lo intentaría.

Gracias por su ayuda. Lo intentaré.

 
Aleksei Stepanenko:

la expresión

es idéntico a éste:

Y si quieres almacenar algo, hazlo en una variable global.

Es el que se declara fuera del cuerpo de la función.

Queríamos comprobar las condiciones de búsqueda para entrar en el EA no cada tick, sino sólo si otra orden es abierta o cerrada por otro EA o manualmente (para evitar una carga innecesaria en el procesador). Por eso hay que comprobar si el número de órdenes corresponde a cada tick.

¿Podemos utilizar una variable estática ? ¿Funcionará el programa de esta forma?

    double LB=0,LS=0;
    int b=0,s=0;
    static int izmb, izms; // статическая переменная
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
            {  
               LB  += OrderLots();
               b++; 
            }                                         
            if (tip==OP_SELL)        
            {
               LS  += OrderLots();
               s++;
            } 
         }
     }
     
   }
    if (izmb!=b || izms!=s){ 
    izmb=b;
    izms=s 
           // далее идут условия для открытия ордера.
     }