Características da linguagem mql5, subtilezas e técnicas - página 57

 
A100:

O presente de um erro difícil de encontrar na execução

Como é ::CopyTicks melhor do que Copyticks ?

E porque é que o resultado é sempre -1. Estes erros devem ser reportados no momento da compilação.

Então, tudo é lógico.ERR_INVALID_ARRAY tem um erro.

CopyTicks é exactamente do tipo, se apenas o seu tamanho for igual ao tamanhoof(MqlTick). É claro, exactamente este tamanho pode ser verificado em tempo de compilação.

Bem, o CopyTicks personalizado obedece a todas as regras do MQL.


As matrizes de descendentes não podem ser convertidas em matrizes de antepassados. Mas elemento por elemento, sim. Esta é uma restrição do ArrayCopy, o que seria bom de remover.

 

Fórum sobre Trading, Sistemas Automatizados de Trading e Testes de Estratégia

Perguntas dos iniciantes 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 sem acessar o servidor.

 
A100:

Um presente sob a forma de um erro de execução elusivo

Na próxima construção a prenda será desligada, infelizmente.

 
ainda vais trabalhar nesta conta ou não?
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Каждый скрипт и каждый эксперт работает в собственном отдельном потоке. Все индикаторы, рассчитываемые на одном символе, даже если они запущены на разных графиках, работают в одном потоке. Таким образом, все индикаторы на одном символе делят между собой ресурсы одного потока. В одном потоке с индикаторами также последовательно выполняются...
 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: Especialista

fxsaber, 2017.10.31 01:27

Uma pequena ponta do chapéu - rodando EAs/scripts em objetos OBJ_CHART.

Por isso, a execução de EAs fica suspensa - não é executada de forma alguma. Mas os guiões funcionam perfeitamente. Portanto, abre algumas oportunidades.

Por exemplo, podemos usar as funções de ordem dos indicadores nos gráficos, onde já existe um Expert Advisor em funcionamento. E não precisamos de abrir novas cartas auxiliares.

 
fxsaber:

Você usouuma dica, embora o indicador possa negociar sem ela, através de eventos


 
Vitaly Muzichenko:

Você usouum indicador, embora o indicador possa negociar sem ele, através de eventos

Isto requer um "sniffer" EA para correr em paralelo, ou seja, é necessário um gráfico auxiliar.

A situação no exemplo é um pouco diferente: há um gráfico e alguns EA já estão correndo nele. E às vezes queremos passar a OrderSend através do indicador sem abrir novos indicadores.

Claro, sem DLL para que o Market o passe.

 
fxsaber:

Isto requer um EA "tap" para correr em paralelo, ou seja, é necessário um gráfico auxiliar.

A situação no exemplo é um pouco diferente: há um gráfico e alguns EA já estão correndo nele. E às vezes queremos passar a OrderSend através do indicador sem abrir novos indicadores.

Claro, sem DLL para que o Market o passe.

No vídeo também funciona sem DLL. O Expert Advisor só precisa de um em qualquer gráfico, pode estar no actual.

 
Vitaly Muzichenko:

Você só precisa de um Expert Advisor em qualquer gráfico, você pode ter um no gráfico atual também.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Peculiaridades da linguagem mql5, sutilezas e truques

fxsaber, 2017.10.31 06:08

O exemplo tem uma situação ligeiramente diferente: um gráfico e já existe algum EA a correr nele. E eu quero executar OrderSend através do indicador sem abrir novos, às vezes.

 
// Сохранение 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);
}


Aplicação

// Сохраняет в 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 O conversor BMP->GIF/PNG também está implementado.