4 noviembre 2022
4 noviembre 2022
Versión móvil del terminal web
En la nueva versión del terminal web se ha añadido el soporte completo para dispositivos móviles. Ahora la interfaz se adapta automáticamente al tamaño de la pantalla, lo cual permite a los usuarios trabajar cómodamente en la plataforma tanto en teléfonos como tabletas con iOS y Android:
Además, hemos introducido en el terminal web numerosas correcciones y mejoras.
El nuevo terminal web MetaTrader 5 ofrece todas las funciones que necesita un tráder moderno. La aplicación le permitirá:
Terminal
MQL5
bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
El
tipo de datos a copiar se indica en el parámetro rates_mask con la
ayuda de la enumeración ENUM_COPY_RATES. Están disponibles los valores
siguientes:COPY_TICKS_INFO = 1, // ticks llamados por los cambios de Bid y/o Ask
COPY_TICKS_TRADE = 2, // ticks llamados por los cambios de Last y Volume
COPY_TICKS_ALL = 3, // todos los ticks en en los que hay cambios
COPY_TICKS_TIME_MS = 1<<8, // tiempo en milisegundos
COPY_TICKS_BID = 1<<9, // precio Bid
COPY_TICKS_ASK = 1<<10, // precio Ask
COPY_TICKS_LAST = 1<<11, // precio Last
COPY_TICKS_VOLUME = 1<<12, // volumen
COPY_TICKS_FLAGS = 1<<13, // banderas de tick
Al
seleccionar varios tipos de datos (solo disponible para matrices), el
orden de las filas de la matriz se corresponderá con el orden de los
valores de la enumeración.bool matrix::Assign(const vector &vec);
Obtendremos como resultado una matriz de una línea.bool vector::Assign(const matrix &mat);
bool vector::Swap(vector &vec);
bool vector::Swap(matrix &vec);
bool vector::Swap(double &arr[]);
bool matrix::Swap(vector &vec);
bool matrix::Swap(matrix &vec);
bool matrix::Swap(double &arr[]);
Cada
array, vector o matriz se refiere a un búfer de memoria que contiene
elementos de ese objeto. El método Swap realmente intercambia los
punteros a estos búferes sin escribir los elementos en la memoria. Así
que una matriz sigue siendo una matriz, y un vector un vector. Al
intercambiar una matriz y un vector se obtiene una matriz de una línea
con elementos vectoriales y un vector con elementos matriciales en
representación plana (puede consultar el método Flat).//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
matrix a= {{1, 2, 3}, {4, 5, 6}};
Print("a before Swap: \n", a);
matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
Print("b before Swap: \n", b);
//--- intercambiamos de sitio los punteros por las matrices
a.Swap(b);
Print("a after Swap: \n", a);
Print("b after Swap: \n", b);
/*
a before Swap:
[[1,2,3]
[4,5,6]]
b before Swap:
[[5,10,15,20]
[25,30,35,40]
[45,50,55,60]]
a after Swap:
[[5,10,15,20]
[25,30,35,40]
[45,50,55,60]]
b after Swap:
[[1,2,3]
[4,5,6]]
*/
vector v=vector::Full(10, 7);
Print("v before Swap: \n", v);
Print("b before Swap: \n", b);
v.Swap(b);
Print("v after Swap: \n", v);
Print("b after Swap: \n", b);
/*
v before Swap:
[7,7,7,7,7,7,7,7,7,7]
b before Swap:
[[1,2,3]
[4,5,6]]
v after Swap:
[1,2,3,4,5,6]
b after Swap:
[[7,7,7,7,7,7,7,7,7,7]]
*/
}
El
método Swap también permite trabajar con arrays dinámicos (no se puede
transmitir un array de tamaño fijo como parámetro). En este caso, el
array puede ser de cualquier dimensión, pero de un tamaño consistente.
Esto significa que el tamaño total de la matriz o del vector deberá ser
un múltiplo de la dimensionalidad cero de un array. La dimensionalidad
cero de un array es el número de elementos que contiene el primer índice
del array. Por ejemplo, para un array dinámico tridimensional double
array[][2][3], la dimensionalidad cero será el producto de los tamaños
de la segunda y tercera dimensión, es decir, 2x3=6. Por lo tanto, un
array de este tipo solo podrá utilizarse en un método Swap con matrices y
vectores cuyo tamaño total sea un múltiplo de 6: 6, 12, 18, 24, etc.//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- rellenamos la matriz 1x10 con el valor 7.0
matrix m= matrix::Full(1, 10, 7.0);
Print("matrix before Swap:\n", m);
//--- intentamos realizar el intercambio entre la matriz y el array
double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
Print("array_small before Swap:");
ArrayPrint(array_small);
if(m.Swap(array_small))
{
Print("array_small after Swap:");
ArrayPrint(array_small);
Print("matrix after Swap: \n", m);
}
else // el tamaño de la matriz no es múltiplo del tamaño de la primera dimensión del array
{
Print("m.Swap(array_small) failed. Error ", GetLastError());
}
/*
matrix before Swap:
[[7,7,7,7,7,7,7,7,7,7]]
array_small before Swap:
[,0] [,1] [,2] [,3] [,4]
[0,] 1.00000 2.00000 3.00000 4.00000 5.00000
[1,] 6.00000 7.00000 8.00000 9.00000 10.00000
m.Swap(array_small) failed. Error 4006
*/
//--- tomamos una matriz mayor e intentamos realizar el intercambio de nuevo
double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
{3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
};
Print("array_static before Swap:");
ArrayPrint(array_static);
if(m.Swap(array_static))
{
Print("array_static after Swap:");
ArrayPrint(array_static);
Print("matrix after Swap: \n", m);
}
else // no se puede utilizar un array dinámico para el intercambio con una matriz
{
Print("m.Swap(array_static) failed. Error ", GetLastError());
}
/*
array_static before Swap:
[,0] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[0,] 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.00000
[1,] 2.00000 4.00000 6.00000 8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
[2,] 3.00000 6.00000 9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
m.Swap(array_static) failed. Error 4006
*/
//--- un nuevo intento de de intercambiar el array y la matriz
double array_dynamic[][10]; // array dinámico
ArrayResize(array_dynamic, 3); // indicamos el tamaño de la primera dimensión
ArrayCopy(array_dynamic, array_static);
//--- ahora utilizaremos un array dinámico para el intercambio
if(m.Swap(array_dynamic))
{
Print("array_dynamic after Swap:");
ArrayPrint(array_dynamic);
Print("matrix after Swap: \n", m);
}
else // no hay error
{
Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
}
/*
array_dynamic after Swap:
[,0] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
matrix after Swap:
[[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
*/
}
vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
CREATE TABLE artist(
artistid INTEGER PRIMARY KEY,
artistname TEXT
);
CREATE TABLE track(
trackid INTEGER,
trackname TEXT,
trackartist INTEGER,
FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);
MetaEditor
MetaTester