Era |
Ahora es |
|
---|---|---|
Activación | Todos los tipos de órdenes y SL/TP según Bid/Ask |
Órdenes límite según Bid/Ask Órdenes stop, stop-limit y SL/TP según Last |
Ejecución | Todos los tipos de órdenes pendientes y SL/TP al precio indicado en la orden |
Todos los tipos de órdenes pendientes y SL/TP según los precios de mercado Bid/Ask en el momento de la activación |
Veamos un ejemplo con el instrumento Si-6.16. Con los precios
actuales Bid=72570, Ask=72572, Last=72552 se ha colocado una orden Buy
Stop con un precio de activación de 72580. En el flujo de precios hemos
obtenido los nuevos precios actuales:
En los instrumentos bursátiles, el precio Last es el que activa
las órdenes stop. Por eso, la llegada del precio Last=72580 en el flujo
ha provocado la activación de la orden Buy Stop. Antes, precisamente
este precio 72580 se utilizaba para la ejecución de esta orden. Este
comportamiento era incorrecto, puesto que el precio Ask=72580 para la
ejecución de una operación de compra en el mercado no existe.
En respuesta a las numerosas peticiones de los tráders, se ha desarrollado una versión web de la plataforma MetaTrader 5. El nuevo producto combina la comodidad y el carácter multiplataforma con las ventajas de la quinta versión para PC, es decir: velocidad, faceta multimercado y características comerciales mejoradas.
La plataforma web MetaTrader 5 ya está disponible en el sitio de la MQL5.community. Esta le permite negociar en los mercados financieros a través de cualquier navegador en cualquier sistema operativo (Windows, Mac, Linux). Y para ello, no es necesario instalar ningún software adicional, de hecho, basta con tener acceso a internet.
En la versión beta, los tráders tienen de inmediato a su disposición:
Sistema de compensación
Este sistema presupone que en un momento concreto, en la cuenta puede haber solo una posición abierta del mismo símbolo:
Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra de EURUSD con un volumen de 0.5 cada una de ellas:s each:
Como resultado de la ejecución de estas operaciones, tenemos una posición general con un volumen de 1 lote.
Sistema de cobertura
Este sistema de registro de la posición permite tener multitud de
posiciones comerciales de un mismo instrumento, incluso en direcciones
diferentes.
Si hay una posición abierta de un instrumento
comercial y el tráder efectúa una nueva operación (o se activa una orden
pendiente), se abre una nueva posición. La posición existente no
cambia.
Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra de EURUSD con un volumen de 0.5 cada una de ellas:
Como resultado de la ejecución de estas operaciones, tenemos la apertura de dos posiciones diferentes.
Nuevo tipo de operación comercial Close By
Para las cuentas con cobertura de registro de posiciones se ha añadido
un nuevo tipo de operaciones comerciales: el cierre de una posición con
una opuesta. Esta operación permite cerrar simultáneamente dos
posiciones en direcciones opuestas de un mismo instrumento. Si las
posiciones opuestas tienen una cantidad diferente de lotes, entonces
quedará abierta solo una orden de las dos. Su volumen será igual a la
diferencia de lotes de las dos posiciones cerradas, y la dirección de la
posición y el precio de apertura serán como en la mayor (en volumen) de
las posiciones cerradas.
En comparación con el cierre individual de dos posiciones, el cierre por orden opuesta permite al tráder ahorrarse un spread:
Al cerrar la posición con otra opuesta se establece una orden del tipo "close by". En el comentario a la misma se indican los tickets de las posiciones cerradas. El cierre de una pareja de posiciones opuestas tiene lugar mediante dos operaciones del tipo "out by". La magnitud del beneficio/pérdida total obtenido como resultado del cierre de ambas posiciones, se indica solo en una de las operaciones.
class CAnimal { public: CAnimal(); // constructor virtual void Sound() = 0; // función virtual pura private: double m_legs_count; // número de patas del animal };Aquí la función Sound() es virtual pura, por eso se la declara con el especificador de función virtual pura PURE (=0).
class CAnimal { public: virtual void Sound()=NULL; // PURE method, debe ser redefinido en la clase derivada, la propia clase CAnimal se ha convertido en abstracta y no puede ser creada }; //--- derivada de la clase abstracta class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE es redefinido, la clase CCat no es abstracta y puede ser creada }; //--- ejemplos de uso incorrecto new CAnimal; // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class" CAnimal some_animal; // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class" //--- ejemplos de uso correcto new CCat; // no hay error, la clase CCat no es abstracta CCat cat; // no hay error, la clase CCat no es abstractaLimitaciones de uso de las clases abstractas
//+------------------------------------------------------------------+ //| Clase básica abstracta | //+------------------------------------------------------------------+ class CAnimal { public: //--- función virtual pura virtual void Sound(void)=NULL; //--- función void CallSound(void) { Sound(); } //--- constructor CAnimal() { //--- invocación directa del método virtual Sound(); //--- invocación indirecta (a través de una tercera función) CallSound(); //--- en el constructor y/o destructor siempre se invocan sus propias funciones, //--- a pesar del carácter virtual y de la redefinición de la función invocada en la derivada //--- si la función invocada es virtual pura, entonces //--- la invocación provocará el error de ejecución crítico: "pure virtual function call" } };Sin embargo, los constructores y destructores de las clases abstractas pueden invocar otras funciones miembro.
typedef int (*TFunc)(int,int);Ahora TFunc es un tipo y se puede declarar la variable-índice a una función:
TFunc func_ptr;En la variable func_ptr se puede guardar la dirección de una función para invocarla más tarde:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // error: neg no tiene el tipo int (int,int) Print(func_ptr(10)); // error: tiene que haber dos parámetrosLos índices a una función se pueden guardar y transmitir como parámetros. No es posible recibir un índice a un método de clase no estático.
ulong PositionGetTicket( int index // número en la lista de posiciones );
bool PositionSelectByTicket(
ulong ticket // ticket de la posición
);
Sistema de compensación
Este sistema presupone que en un momento concreto, en la cuenta puede haber
solo una posición abierta del mismo símbolo:
En este caso, no tiene importancia como resultado de qué acción se realiza
la operación en la dirección opuesta, si como fruto de la ejecución de
una orden de mercado o debido a la activación de una orden pendiente.
Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra
de EURUSD con un volumen de 0.5 cada una de ellas:
Como resultado de la ejecución de estas operaciones, tenemos una posición
general con un volumen de 1 lote.
Sistema de cobertura
Este sistema de registro de la posición permite tener multitud de posiciones
comerciales de un mismo instrumento, incluso en direcciones diferentes.
Si hay una posición abierta de un instrumento comercial y el tráder efectúa
una nueva operación (o se activa una orden pendiente), se abre una nueva
posición. La posición existente no cambia.
Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra
de EURUSD con un volumen de 0.5 cada una de ellas:
Como resultado de la ejecución de estas operaciones, tenemos la apertura
de dos posiciones diferentes.
Nuevo tipo de operación comercial Close By
Para las cuentas con cobertura de registro de posiciones se ha añadido
un nuevo tipo de operaciones comerciales: el cierre de una posición con
una opuesta. Esta operación permite cerrar simultáneamente dos posiciones
en direcciones opuestas de un mismo instrumento. Si las posiciones opuestas
tienen una cantidad diferente de lotes, entonces quedará abierta solo una
orden de las dos. Su volumen será igual a la diferencia de lotes de las
dos posiciones cerradas, y la dirección de la posición y el precio de apertura
serán como en la mayor (en volumen) de las posiciones cerradas.
En comparación con el cierre individual de dos posiciones, el cierre por
orden opuesta permite al tráder ahorrarse un spread:
Al cerrar la posición con otra opuesta se establece una orden del tipo "close by". En el comentario a la misma se indican los tickets de las posiciones cerradas. El cierre de una pareja de posiciones opuestas tiene lugar mediante dos operaciones del tipo "out by". La magnitud del beneficio/pérdida total obtenido como resultado del cierre de ambas posiciones, se indica solo en una de las operaciones.
class CAnimal { public: CAnimal(); // constructor virtual void Sound() = 0; // función virtual pura private: double m_legs_count; // número de patas del animal };Aquí la función Sound() es virtual pura, por eso se la declara con el especificador de función virtual pura PURE (=0).
class CAnimal { public: virtual void Sound()=NULL; // PURE method, debe ser redefinido en la clase derivada, la propia clase CAnimal se ha convertido en abstracta y no puede ser creada }; //--- derivada de la clase abstracta class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE es redefinido, la clase CCat no es abstracta y puede ser creada }; //--- ejemplos de uso incorrecto new CAnimal; // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class" CAnimal some_animal; // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class" //--- ejemplos de uso correcto new CCat; // no hay error, la clase CCat no es abstracta CCat cat; // no hay error, la clase CCat no es abstractaLimitaciones de uso de las clases abstractas
//+------------------------------------------------------------------+ //| Clase básica abstracta | //+------------------------------------------------------------------+ class CAnimal { public: //--- función virtual pura virtual void Sound(void)=NULL; //--- función void CallSound(void) { Sound(); } //--- constructor CAnimal() { //--- invocación directa del método virtual Sound(); //--- invocación indirecta (a través de una tercera función) CallSound(); //--- en el constructor y/o destructor siempre se invocan sus propias funciones, //--- a pesar del carácter virtual y de la redefinición de la función invocada en la derivada //--- si la función invocada es virtual pura, entonces //--- la invocación provocará el error de ejecución crítico: "pure virtual function call" } };Sin embargo, los constructores y destructores de las clases abstractas pueden invocar otras funciones miembro.
typedef int (*TFunc)(int,int);Ahora TFunc es un tipo y se puede declarar la variable-índice a una función:
TFunc func_ptr;En la variable func_ptr se puede guardar la dirección de una función para invocarla más tarde:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // error: neg no tiene el tipo int (int,int) Print(func_ptr(10)); // error: tiene que haber dos parámetrosLos índices a una función se pueden guardar y transmitir como parámetros. No es posible recibir un índice a un método de clase no estático.
ulong PositionGetTicket( int index // número en la lista de posiciones );
bool PositionSelectByTicket(
ulong ticket // ticket de la posición
);
El nuevo sistema es similar al de MetaTrader 4, pero los tráders, además, pueden valerse de todas la ventajas de la quinta versión de la plataforma: ejecución de órdenes usando varias operaciones (incluyendo las parciales), órdenes stop-limit y mucho más.
Será posible probar el comercio con cobertura en cuanto actualice la plataforma. Al abrir una cuenta demo, active la opción "Usar cobertura", que estará disponible si el servidor comercial del bróker ya ha sido actualizado y configurado.
El nuevo sistema es similar al de MetaTrader 4, pero los tráders, además, pueden valerse de todas la ventajas de la quinta versión de la plataforma: ejecución de órdenes usando varias operaciones (incluyendo las parciales), órdenes stop-limit y mucho más.
Será posible probar el comercio con cobertura en cuanto actualice la plataforma. Al abrir una cuenta demo, active la opción "Usar cobertura", que estará disponible si el servidor comercial del bróker ya ha sido actualizado y configurado.
Se ha añadido al Asistente MQL5 el enlace al vídeo didáctico "Cómo montar un robot comercial en el Asistente MQL5". Vea este vídeo de 3 minutos y cree su propio robot comercial, sin escribir una sola línea de código.
El escalado de los gráficos de la parejas de divisas es ahora aún más sencillo: se ha aumentado la cantidad de pasos y se ha aumentado la suavidad de representación.
2015.10.14 14:48:18.486 Data Folder: C:\Program Files\MetaTrader 5 2015.10.14 14:48:18.486 Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7 920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00 2015.10.14 14:48:18.486 MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
struct MqlTick { datetime time; // Hora de la última actualización de los precios double bid; // Precio Bid actual double ask; // Precio Ask actual double last; // Precio actual de la última transacción (Last) ulong volume; // Volumen para el precio Last actual long time_msc; // Hora de la última actualización de los precios en milisegundos uint flags; // Banderas de los tics };Todos los parámetros de cada tic siempre se llenan, independientemente de si han cambiado los datos en comparación con el tic anterior. Esto permite tener siempre el estado actual de los precios en cualquier momento, sin buscar los valores anteriores en la historia de tics. Por ejemplo, con el tic solo ha podido cambiar el precio bid, pero en la estructura, aparte del nuevo precio, se mostrarán también todos los demás parámetros: el precio anterior ask, el volumen, etcétera. Para saber qué datos precisamente han cambiado con el tic actual, analice sus banderas:
//+------------------------------------------------------------------+ //| TemplTest.mq5 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Anunciamos la plantilla de clase | //+------------------------------------------------------------------+ template<typename T> class TArray { protected: T m_data[]; public: bool Append(T item) { int new_size=ArraySize(m_data)+1; int reserve =(new_size/2+15)&~15; //--- if(ArrayResize(m_data,new_size,reserve)!=new_size) return(false); //--- m_data[new_size-1]=item; return(true); } T operator[](int index) { static T invalid_index; //--- if(index<0 || index>=ArraySize(m_data)) return(invalid_index); //--- return(m_data[index]); } }; //+------------------------------------------------------------------+ //| La plantilla de clase de la matriz de indicadores, | //| en el destructor elimina aquellos objetos a los que se referían | //| los indicadores guardados en la matriz. | //| Preste atención a la herencia de la clase de plantilla TArray | //+------------------------------------------------------------------+ template<typename T> class TArrayPtr : public TArray<T *> { public: void ~TArrayPtr() { for(int n=0,count=ArraySize(m_data);n<count;n++) if(CheckPointer(m_data[n])==POINTER_DYNAMIC) delete m_data[n]; } }; //+------------------------------------------------------------------+ //| Anunciamos la clase, los indicadores a sus objetos | //| los guardaremos en la matriz | //+------------------------------------------------------------------+ class CFoo { int m_x; public: CFoo(int x):m_x(x) { } int X(void) const { return(m_x); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ TArray<int> ExtIntArray; // instanciamos la plantilla TArray (especializamos la plantilla TArray con el tipo int) TArray<double> ExtDblArray; // instanciamos la plantilla TArray (especializamos la plantilla TArray con el tipo double) TArrayPtr<CFoo> ExtPtrArray; // instanciamos la plantilla TArrayPtr (especializamos la plantilla TArrayPtr con el tipo CFoo) //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- llenamos las matrices con datos for(int i=0;i<10;i++) { int integer=i+10; ExtIntArray.Append(integer); double dbl=i+20.0; ExtDblArray.Append(dbl); CFoo *ptr=new CFoo(i+30); ExtPtrArray.Append(ptr); } //--- generamos el contenido de las matrices string str="Int:"; for(int i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(int i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(int i=0;i<10;i++) str+=" "+(string)ExtPtrArray[i].X(); Print(str); //--- no es necesario eliminar los objetos CFoo creados a través de new, se eliminan en el destructor del objeto TArrayPtr<CFoo> }Resultado de la ejecución:
int ObjectsDeleteAll( long chart_id, // indentificador del gráfico const string prefix, // prefijo del nombre del objeto int sub_window=-1, // índice de la ventana int object_type=-1 // tipo del objeto a eliminar );
Correciones de crash logs.
Se ha actualizado la documentación.Actualice su aplicación para obtener nuevas posibilidades en su MetaTrader 5 iOS.
Ahora es posible comprar cualquier aplicación en el Mercado en un solo paso, sin registrarse directamente en las plataformas MetaTrader 4/5. Para ello solo es necesario pulsar el botón "Comprar" y elegir el sistema de pago conveniente.
Después de esto, usted será redirigido a la página del sistema de pago, donde podrá realizar la compra. PayPal, WebMoney, Neteller o tarjeta bancaria, pague por sus compras en la tienda de robots e indicadores preparados usando el método que más le convenga.
Después de comprar, recomendamos de todas formas registrar una cuenta en MQL5.community, su compra quedará automáticamente ligada a ella. Así, usted tendrá la posibilidad de actualizar el producto e instalarlo en otros ordenadores. Además, la cuenta MQL5.community le abrirá acceso a usted a multitud de otros servicios para la plataforma MetaTrader, a las señales comerciales, para copiar transacciones de traders de éxito, al hosting virutal, para que sus aplicaciones puedan funcionar de manera ininterrumpida y al servicio freelance, con el que podrá encargar robots exclusivos a los desarrolladores.
Ahora seguro que ya sabe el modo más rápido y simple de obtener un robot comercial. ¡Más de 5 000 aplicaciones diferentes para MetaTrader ya le están esperando en el Mercado, elija y compre!
Los activos (Assets) se suman a fondos propios (Equity) y
aumentan el tamaño del margen libre (Free Margin), lo que permite
aumentar los volúmenes de las operaciones comerciales realizadas en la
cuenta.
De esta manera, ha surgido la posibilidad de crear las cuentas con diferentes tipos de cobertura.
ulong GetMicrosecondCount();
Se puede utilizar esta función para el perfilaje adicional de la ejecución del programa y detección de “cuellos de botella”.La actualización estará disponible a través del sistema LiveUpdate.