Características del lenguaje mql5, sutilezas y técnicas - página 190

 
Vladimir Pastushak:

¿Es posible distinguir un objeto gráfico creado manualmente de un objeto creado por un indicador o EA?

En la función

OBJPROP_HIDDEN

Barrar el nombre de un objeto gráfico desde el menú del terminal "Gráficos" - "Objetos" - "Lista de objetos". El valor true permite ocultar un objeto innecesario de la lista. Por defecto se establece true para los objetos que muestran los eventos del calendario, el historial de operaciones, así comolos creados desde el programa MQL5. Para ver estos objetosgráficos y acceder a sus propiedades, haga clic en "Todos" en la ventana "Lista de objetos".

bool

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Probablemente sea algo conocido, pero yo no era consciente de este matiz.

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Bibliotecas: Experto

fxsaber, 2020.10.09 04:55

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Поставили задание в очередь чарта.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Заставляем двигаться очередь.
}

He resaltado un lugar importante en el código. Sin ella no hay aplicación del patrón hasta el final del guión.

 
Sobre el primer parámetro de entrada en EventChartCustom

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

MT5 y Speed en acción

Anton, 2020.10.08 11:00

Diferente significado y diferente mecanismo de ejecución. 0 - evento en cola de la carta "propia". -1 - evento en su propia cola.

 
Vladimir Pastushak:

Al final de la semana mi cabeza ya no está bien.

Tengo un ticket de una posición abierta en una cobertura en mt5 por ejemplo 123456

Quiero calcular un beneficio después de cerrar la posición, y no puedo hacerlo.

Lo hago, pero sólo recibo comisión...

¿Cómo puedo obtener el beneficio de una posición cerrada con un ticket?

Intente seleccionar mejor las operaciones utilizando HistorySelectByPosition().

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 

Era necesario averiguar dentro de un mqh si algo fue llamado antes desde otro mqh. El mqh no es consciente de la presencia del otro. Uno de ellos puede estar dentro y otro no.

En definitiva, el problema es inusual (para mí). Lo resolvió de una manera bastante muleta.

void f1()
{
  SetUserError(0);
}

void f2()
{
  if (_LastError == ERR_USER_ERROR_FIRST)
    Print("f1() была вызвана.");
  else
    Print("f1() не была вызвана");
}

void OnStart()
{
  f1();
  f2();
}

Creo que es una práctica muy mala, pero funciona.

 
Si alguien necesita cerrar la ventana de Alerta.
// Закрытие Alert-окна
bool CloseAlert()
{  
  const long Chart = ChartOpen(_Symbol, _Period);  
  const bool Res = Chart && !ChartSaveTemplate(Chart, NULL);
                            
  if (Chart)
    ChartClose(Chart);
    
  return(Res);  
}
 
fxsaber:

Era necesario averiguar dentro de un mqh si algo fue llamado antes desde otro mqh. El mqh no es consciente de la presencia del otro. Uno de ellos puede estar dentro y otro no.

En definitiva, el problema es inusual (para mí). Lo resolvió de una manera bastante muleta.

Creo que es una práctica muy mala, pero funciona.

El uso de _LastError tiene un problema irresoluble, cuando se conectan bibliotecas de terceros, hay una probabilidad no nula de colisión de códigos de error de usuario. Como alternativa a mantener su propio lastError. Ya sea una variable global, envuelta en includeguard en todos los mqh, o una sola variable.
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

MT5 y Speed en acción

fxsaber, 2020.10.20 12:28

Total intermedio para una máquina de descarga rápida.

La relevancia de los datos de precios es muy ambigua para los que operan con barras e indicadores.

Las garrapatas y los volteadores son difíciles de ser en tiempo real.

 
En MT5 Sleep(0) == Sleep(1). Por esta razón no hay una gran carga de CPU cuando se utiliza Sleep(0) como en MT4.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

Slava, 2018.09.20 15:40

PS. La función Sleep() en MQL5 no es una redirección a la función win api ::Sleep(). Para ser más exactos, si el valor es inferior a 100, se trata de una redirección. Pero por encima de 100 es un bucle con el deslizamiento de win api dentro de él para que pueda ser interrumpido por IsStopped.

Hay un punto más sutil. Si los milisegundos <=0, añadimos 1. Es decir, nunca llamamos a ::Sleep(0).

Ya se ha olvidado. Cierto sólo para MT5. En MT4 Sleep(0) puede suspender el terminal.

 
Tuve la idea de cambiar Virtual a punteros para no tener que comprobar una condición adicional en cada llamada.
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


Pero he decidido comparar primero el rendimiento con un ejemplo sencillo.

// Сравнение производительности функции с доп. условием и указателя на функцию.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

typedef double (*TFunc)( const int ); // Определяем нужный тип указателя на функцию.

double Prices[];

double GetPrices2( const int Pos )
{
  return(Prices[Pos]);
}

double GetPrices( const int Pos )
{
  return(Pos >= 0 ? GetPrices2(Pos) : 0); // Специально введено доп. условие, чтобы уменьшить производительность.
}

void OnStart()
{
  const int Size = ArrayResize(Prices, 1 e7);
  
  double Sum1 = 0;
  double Sum2 = 0;

  TFunc Func = GetPrices2;
    
  // Замер производительности через указатель функции.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum2 += Func(i);
      , 1)


  // Замер производительности через функцию с доп. условием.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum1 += GetPrices(i);
      , 1)  

  Print(Sum1);
  Print(Sum2);
}


El resultado.

2020.10.21 01:07:00.745 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 29 in OnStart: for(inti=0;i<Size;i++)Sum2+=Func(i);] = 33906 mcs.
2020.10.21 01:07:00.756 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 36 in OnStart: for(inti=0;i<Size;i++)Sum1+=GetPrices(i);] = 10923 mcs.


La variante typedef pierde por un factor de tres. Me negué a usarlo donde es crucial. Por ejemplo, para TC el mismo OrdersTotal es llamado al menos una vez en cada pase del optimizador.


En el modo de depuración la situación se invierte. Por lo tanto, tiene sentido utilizar typedef en MT4 para la aceleración.