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

 
Vladimir Pastushak:

É possível distinguir um objecto gráfico criado manualmente de um objecto criado por um indicador ou EA?

Na função

OBJPROP_HIDDEN

Excepto o nome de um objecto gráfico do menu terminal "Gráficos" - "Objectos" - "Lista de Objectos". O valor verdadeiro permite esconder um objecto desnecessário da lista. Por defeito, true é definido para objectos que exibem eventos de calendário, histórico comercial, bem comoaqueles criados a partir do programa MQL5. Para ver tais objectosgráficos e aceder às suas propriedades, clique em "Todos" na janela "Lista de Objectos".

bool

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Provavelmente uma coisa conhecida, mas eu próprio não estava ciente desta nuance.

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Bibliotecas: Perito

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));                 // Заставляем двигаться очередь.
}

Destaquei um lugar importante no código. Sem ela não haverá aplicação do padrão até ao fim do guião.

 
Sobre o primeiro parâmetro de entrada no EventChartCustom

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

MT5 e Velocidade em Acção

Anton, 2020.10.08 11:00

Significado diferente e mecanismo de execução diferente. 0 - evento em fila de espera do "próprio" gráfico. -1 - evento na sua própria fila.

 
Vladimir Pastushak:

No final da semana, a minha cabeça já não é boa.

Tenho um bilhete de uma posição aberta numa sebe no mt5, por exemplo 123456

Quero calcular um lucro após o encerramento da posição, e não o posso fazer.

Faço-o, mas só recebo comissão...

Como posso obter o lucro de uma posição fechada com um bilhete?

Tente seleccionar melhor os negócios usando HistorySelectByPosition().

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

Era necessário descobrir dentro de uma mqh se alguma coisa era chamada antes de outra mqh. O mqh não está consciente da presença um do outro. Um deles pode estar dentro e um deles não.

Em suma, o problema é invulgar (para mim). Resolveu-o de uma forma bastante mutilada.

void f1()
{
  SetUserError(0);
}

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

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

Penso que é uma prática muito má, mas funciona.

 
Se alguém precisar de fechar a janela 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 necessário descobrir dentro de uma mqh se alguma coisa era chamada antes de outra mqh. O mqh não está consciente da presença um do outro. Um deles pode estar dentro e um deles não.

Em suma, o problema é invulgar (para mim). Resolveu-o de uma forma bastante mutilada.

Penso que é uma prática muito má, mas funciona.

A utilização de _LastError tem um problema insolúvel, ao ligar bibliotecas de terceiros, há uma probabilidade não nula de colisão de códigos de erro do utilizador. Como alternativa para manter o seu próprio últimoError. Ou uma variável global, envolta em guarda em todos os mqh, ou uma única variável.
 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

MT5 e Velocidade em Acção

fxsaber, 2020.10.20 12:28

Total intermédio para uma máquina de descarga rápida.

A relevância dos dados sobre preços é muito ambígua para aqueles que negoceiam utilizando barras e indicadores.

As carraças e os tumblers são difíceis de ser em tempo real.

 
Em MT5 Sleep(0) == Dormir(1). Por esta razão, não há uma enorme carga de CPU quando se usa Sleep(0) como há no MT4.

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

Slava, 2018.09.20 15:40

PS. A função Sleep( ) em MQL5 não é um redireccionamento para ganhar a função api ::Sleep(). Para ser mais exacto, se o valor for inferior a 100, trata-se de um redireccionamento. Mas acima de 100 é um laço com um escorregamento de api de ganho dentro dele para que possa ser interrompido por IsStopped.

Há mais um ponto subtil. Se milissegundos <=0, prependemos 1. Ou seja, nunca chamamos ::Sleep(0).

Já foi esquecido. Verdadeiro apenas para MT5. Em MT4 Sleep(0) pode suspender o terminal.

 
Tive uma ideia de mudar o Virtual para ponteiros, para não ter de verificar condições adicionais em cada chamada.
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


Mas decidi comparar primeiro o desempenho, usando um exemplo simples.

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

#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);
}


O 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.


A variante typedef perde por um factor de três. Recusei-me a utilizá-lo onde é crucial. Por exemplo, para o TC o mesmo OrderTotal é chamado pelo menos uma vez a cada tick de passe de optimizador.


No modo de depuração, a situação inverte-se. Portanto, faz sentido utilizar o typedef em MT4 para a aceleração.

Razão: