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

 
A100:

El regalo de un error de ejecución difícil de encontrar

¿Por qué ::CopyTicks es mejor que Copyticks?

Y por qué el resultado es siempre -1. Estos errores deben notificarse en tiempo de compilación

Entonces, todo es lógico.ERR_INVALID_ARRAY obtuvo un error.

CopyTicks es exactamente del tipo, si sólo su tamaño es igual a sizeof(MqlTick). Por supuesto, se puede comprobar exactamente este tamaño en tiempo de compilación.

Bueno, el CopyTicks personalizado obedece a todas las reglas de MQL.


Las matrices de descendientes no pueden convertirse en matrices de ancestros. Pero elemento por elemento, sí. Esta es una restricción de ArrayCopy, que sería bueno eliminar.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Preguntas de los principiantes MQL5 MT5 MetaTrader 5

fxsaber, 2017.10.19 21:13

// Возвращает true, если нет бара с таким временем ("дырка")
bool IsHole( const string Symb, const ENUM_TIMEFRAMES TimeFrame, const datetime time )
{
  return(Bars(Symb, TimeFrame, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_FIRSTDATE), time) +
         Bars(Symb, TimeFrame, time, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_LASTBAR_DATE)) ==
         SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_BARS_COUNT));
}

Funciona sin acceder al servidor.

 
A100:

Un regalo en forma de error de ejecución escurridizo

En la próxima compilación el regalo se desactivará, por desgracia.

 
¿vas a seguir trabajando en esta cuenta o no?
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Каждый скрипт и каждый эксперт работает в собственном отдельном потоке. Все индикаторы, рассчитываемые на одном символе, даже если они запущены на разных графиках, работают в одном потоке. Таким образом, все индикаторы на одном символе делят между собой ресурсы одного потока. В одном потоке с индикаторами также последовательно выполняются...
 

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

Bibliotecas: Experto

fxsaber, 2017.10.31 01:27

Un pequeño consejo: ejecutar EAs/scripts en objetos OBJ_CHART.

Así que la ejecución de los EAs se cuelga muerta - no se ejecuta de ninguna manera. Pero los guiones funcionan perfectamente. Por lo tanto, abre algunas oportunidades.

Por ejemplo, podemos utilizar las funciones de orden de los indicadores en los gráficos, donde ya hay un Asesor Experto en ejecución. Y no necesitamos abrir ninguna carta auxiliar nueva.

 
fxsaber:

Ha utilizadoun aviso, aunque el indicador puede operar sin él, a través de eventos


 
Vitaly Muzichenko:

Ha utilizadoun tipster, aunque el indicador puede operar sin él, a través de eventos

Para ello, es necesario que un EA "sniffer" funcione en paralelo, es decir, se necesita un gráfico auxiliar.

La situación en el ejemplo es algo diferente: hay un gráfico y algún EA ya se está ejecutando en él. Y queremos pasar a veces OrderSend por el indicador sin abrir nuevos.

Por supuesto, sin DLL para que Market lo pase.

 
fxsaber:

Para ello es necesario que un EA "de grifo" funcione en paralelo, es decir, que se necesita un gráfico auxiliar.

La situación en el ejemplo es algo diferente: hay un gráfico y algún EA ya se está ejecutando en él. Y queremos pasar a veces OrderSend por el indicador sin abrir nuevos.

Por supuesto, sin DLL para que Market lo pase.

En el vídeo también funciona sin DLL. El Asesor Experto sólo necesita uno en cualquier gráfico, puede estar en el actual.

 
Vitaly Muzichenko:

Sólo necesita un Asesor Experto en cualquier gráfico, puede tener uno en el gráfico actual también.

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

Peculiaridades del lenguaje mql5, sutilezas y trucos

fxsaber, 2017.10.31 06:08

El ejemplo tiene una situación ligeramente diferente: un gráfico y ya hay algún EA funcionando en él. Y quiero ejecutar OrderSend a través del indicador sin abrir nuevos a veces.

 
// Сохранение Bitmap-объекта в bmp/gif/png-файле (прозрачность не учитывается)
bool BitmapObjectToFile( const long chartID, const string ObjName, const string FileName, const bool FullImage = false )
{  
  const ENUM_OBJECT Type = (ENUM_OBJECT)ObjectGetInteger(chartID, ObjName, OBJPROP_TYPE);  
  bool Res = (Type == OBJ_BITMAP_LABEL) || (Type == OBJ_BITMAP);
             
  if (Res)
  {
    const string Name = __FUNCTION__ + (string)MathRand();

    ObjectCreate(chartID, Name, OBJ_CHART, 0, 0, 0);
    ObjectSetInteger(chartID, Name, OBJPROP_XDISTANCE, -1 e3);
    
    const long chart = ObjectGetInteger(chartID, Name, OBJPROP_CHART_ID);
        
    Res = ChartSetInteger(chart, CHART_SHOW, false) && ObjectCreate(chart, Name, OBJ_BITMAP_LABEL, 0, 0, 0) &&
          ObjectSetString(chart, Name, OBJPROP_BMPFILE, ObjectGetString(chartID, ObjName, OBJPROP_BMPFILE)) &&
          (FullImage || (ObjectSetInteger(chart, Name, OBJPROP_XSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_XSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_YSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_XOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_XOFFSET)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_YOFFSET)))) &&
                         ChartScreenShot(chart, FileName, (int)ObjectGetInteger(chart, Name, OBJPROP_XSIZE),
                                                          (int)ObjectGetInteger(chart, Name, OBJPROP_YSIZE));
    ObjectDelete(chartID, Name);
  }                    

  return(Res);
}


Aplicación

// Сохраняет в png-файлах все Bitmap-объекты текущего чарта
void OnStart()
{  
  for (int i = ObjectsTotal(0) - 1; i >= 0; i--)
  {
    const string Name = ObjectName(0, i);
    
    BitmapObjectToFile(0, Name, (string)ChartID() + "\\" + Name + ".png");    
  }      
}


SZY También se ha implementado el convertidor BMP->GIF/PNG.