Siéntase libre de devolver GetPointer(this) desde los métodos.
Al menos en los setters de métodos esto está justificado - el código puede ser más legible y compacto, se obtiene una la de parámetros con nombre
ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой
// получается вот из подобного : class HLine:public ChartObject { public: HLine(double price); HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1 HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); } // а это чтобы получались цепочки obj.Method1(..).Method2(..) };
Por supuesto, utilizar con precaución, porque no hay exception`s en el lenguaje y no se espera
y un poco interfiere con la calificación de las funciones por el tipo devuelto.
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math#property strict#ifdef __MQL4__#include <Math\Alglib\bitconvert.mqh>
#define TEMP_MACROS(A) double A( double ) { return(0); }
TEMP_MACROS(MathLog1p)
TEMP_MACROS(MathExpm1)
TEMP_MACROS(MathArcsinh)
TEMP_MACROS(MathArccosh)
TEMP_MACROS(MathArctanh)
#undef TEMP_MACROS
#endif
Para cerrar una orden, no tenemos que definir el tipo de orden y el precio que corresponde a este tipo. ¡Basta con escribir "cerrar al precio" en OrderClosePrice()!
/********************Script program start function********************/ voidOnStart() { int i, total = OrdersTotal()-1; for(i = total; i >= 0; i--) { if(OrderType() < OP_SELLSTOP) { if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100)) printf("***********"); } } }/********************************************************************/
¡Muy bien! ) Gracias.
A juzgar por el ejemplo, ¿tampoco necesitas OrderSelect()?
Artyom Trishkin: Se necesita. Sólo me lo perdí por pereza...
Sí, bueno... Un verdadero desastre.
Pero antes, no me encontré con estos temas.
fxsaber:
Así que puede utilizar OrderClosePrice sólo después de la correspondiente OrderSelect. Ya que OrderSelect copia los datos de las funciones de Order(const)-una vez, y el mismo RefreshRates no es capaz de actualizarlos.
Es decir, si, por ejemplo, OrderClosePrice falla en el cierre, entonces el OrderSelect debe hacerse de nuevo antes del siguiente intento (RefreshRates no es necesario).
ZS ¡Este hilo es de 2005! Hay argumentos detallados de los desarrolladores aquí.
Así que puedes usarlo, pero sabiendo que puede haber problemas.
Las órdenes abiertas deben analizarse a partir de un número superior, es decir, for(int nom=OrdersTotal()-1; nom>=0; nom--) Esto es especialmente importante cuando se borran los pedidos. Pero qué pasará si hacemos lo contrario for(int nom=0; nom<OrdersTotal(); nom++) ? Al principio, el índice es igual a cero y se elimina el primer pedido con número 0. Entonces el índice pasa a ser igual a 1. En este momento se desplazan los pedidos restantes y el que tiene el número 1 ocupa la posición cero. El antiguo número 2 ocupa la posición 1. Se borrará. Entonces el índice se convierte en 2. Y la orden que era la número 4 al principio será eliminada. Así, se eliminan las órdenes que ocupan posiciones pares al principio. Los impares se quedarán. Esto se puede ver en los comentarios de los pedidos y los números. Adjunto un script que muestra ambas opciones de borrado y capturas de pantalla Hay 20 pedidos pendientes
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
Al menos en los setters de métodos esto está justificado - el código puede ser más legible y compacto, se obtiene una la de parámetros con nombre
ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой
// получается вот из подобного :
class HLine:public ChartObject {
public:
HLine(double price);
HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); } // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
y un poco interfiere con la calificación de las funciones por el tipo devuelto.
Siéntase libre de devolver GetPointer(this) desde los métodos.
De esta manera & es más conciso.
Bueno, déjame empezar primero.
Para cerrar una orden, no tenemos que definir el tipo de orden y el precio que corresponde a este tipo. ¡Basta con escribir "cerrar al precio" en OrderClosePrice()!
void OnStart()
{
int i, total = OrdersTotal()-1;
for(i = total; i >= 0; i--)
{
if(OrderType() < OP_SELLSTOP)
{
if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
printf("***********");
}
}
}/********************************************************************/
¡Muy bien! ) Gracias.
A juzgar por el ejemplo, ¿tampoco necesitas OrderSelect()?
(¡Genial! ) Gracias.
A juzgar por el ejemplo, ¿tampoco se necesita OrderSelect()?
¡Bien! ) Gracias.
Se necesita. Sólo me lo perdí por pereza...
Sí, bueno... Un verdadero desastre.
Pero antes, no me encontré con estos temas.
Así que puede utilizar OrderClosePrice sólo después de la correspondiente OrderSelect. Ya que OrderSelect copia los datos de las funciones de Order(const)-una vez, y el mismo RefreshRates no es capaz de actualizarlos.
Es decir, si, por ejemplo, OrderClosePrice falla en el cierre, entonces el OrderSelect debe hacerse de nuevo antes del siguiente intento (RefreshRates no es necesario).
ZS ¡Este hilo es de 2005! Hay argumentos detallados de los desarrolladores aquí.
Las órdenes abiertas deben analizarse a partir de un número superior, es decir, for(int nom=OrdersTotal()-1; nom>=0; nom--)
Hay 20 pedidos pendientes
Esto es especialmente importante cuando se borran los pedidos.
Pero qué pasará si hacemos lo contrario for(int nom=0; nom<OrdersTotal(); nom++) ?
Al principio, el índice es igual a cero y se elimina el primer pedido con número 0.
Entonces el índice pasa a ser igual a 1. En este momento se desplazan los pedidos restantes y el que tiene el número 1
ocupa la posición cero. El antiguo número 2 ocupa la posición 1. Se borrará.
Entonces el índice se convierte en 2. Y la orden que era la número 4 al principio será eliminada.
Así, se eliminan las órdenes que ocupan posiciones pares al principio. Los impares se quedarán. Esto se puede ver en los comentarios de los pedidos y los números.
Adjunto un script que muestra ambas opciones de borrado y capturas de pantalla