Características del lenguaje mql4, sutilezas y técnicas - página 2

 
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.
 
Maxim Kuznetsov:
Siéntase libre de devolver GetPointer(this) desde los métodos.
De esta manera & es más conciso.
 
fxsaber:
De esta manera & es más conciso.
Y GetPointer() puede ser anulado cuidadosamente, por ejemplo, para fines de depuración.
 
Un puntero tomado por GetPointer no puede ser borrado, ¿qué sentido tiene?
 
// После этого в 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
 
Alexey Viktorov:
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()!

/********************Script program start function********************/
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()?

 
Liza_:


(¡Genial! ) Gracias.

A juzgar por el ejemplo, ¿tampoco se necesita OrderSelect()?

Sí, lo es. Alexey se lo perdió por su pereza...
 
Liza_:

¡Bien! ) Gracias.

Sí, permite escribir scripts bastante concisos para el uso en combate
// Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4;            // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10;       // Отклонение цены
sinput bool exAllSymbols = false; // false - только текущий, true - все символы

#define _CS(A) ((!IsStopped()) && (A))

bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 )
{
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) &&
        (AllSymbols ? true : (OrderSymbol() == Symbol())))
      Res &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
      
  return(Res);
}

void OnStart()
{
  for (int i = 0; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
    Sleep(SLEEPTIME * 1000);
}
La comparación con el análogo MQL5 no le favorece. Me pregunto si hay situaciones en las que el resultado de la comparación es opuesto...
 
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

Eliminados uno a uno

Archivos adjuntos:
PROBA-ORD.mq4  3 kb