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

 
Igor Makanu:

pensou que não teria problemas em ler o código curto, depois leia a ajudahttps://www.mql5.com/ru/docs/trading/ordercalcmargin

Obrigado, já o descobrimos )

Comecei agora a aprender MQL5. Devo ter colocado a minha pergunta num lugar errado

 
ArrayCopy Cross-platform difference.
#property strict

void OnStart()
{
  int Array1[1];
  int Array2[1];
  
  Print(ArrayCopy(Array1, Array2, 0, 0, 0)); // MQL4 - 1, MQL5 - 0
  Print(WHOLE_ARRAY); // MQL4 - 0, MQL5 - -1
}
 
fxsaber:
ArrayCopy Cross-platform difference.

Obviamente, para não fazer diferença, é necessário escrever

  Print(ArrayCopy(Array1, Array2, 0, 0, WHOLE_ARRAY));

ou

Print(ArrayCopy(Array1, Array2, 0, 0));

ou todos os incumprimentos neste contexto

Print(ArrayCopy(Array1, Array2));
 
Artyom Trishkin:

Obviamente, para não fazer diferença, é necessário escrever

ou

ou todos os incumprimentos neste contexto

Aqui está o problema.

ArrayCopy(Array1, Array2, 0, 0, GetAmountToCopy());

Se a função retorna zero, então a MQL4 e a MQL5 terão resultados diferentes.

 
fxsaber:

Aqui está o problema.

Se a função retorna zero, MQL4 e MQL5 terão resultados diferentes.

Assim, GetAmountToCopy() resolve este problema no caso da função dever regressar a zero.

Por exemplo:

return(res==0 ? WHOLE_ARRAY : res);
 
fxsaber:

Aqui está o problema.

Se a função retorna zero, MQL4 e MQL5 terão resultados diferentes.

Não é muito claro o que se está a calcular aí. Pode haver várias variantes de retorno de GetAmountToCopy().

Se 0 é para copiar nada (esta é a condição que causa o problema como eu o vejo) e -1 é para copiar toda a matriz, deve obviamente especificar valores de retorno diferentes de 0 e -1 no caso de não querer copiar nada. Por exemplo, devolver EMPTY_VALUE_VALUE. Neste caso, devemos provavelmente sobrecarregar a função ArrayCopy() que verificará primeiro o que lhe é passado de GetAmountToCopy(). Se for VAZIO_VALOR, então saia da função. Quanto ao resto, se for utilizada a constante WHOLE_ARRAY, o tamanho dos dados a copiar tanto na MQL5 como na MQL4 será seleccionado correctamente.

 
Artyom Trishkin:

Não é muito claro o que se está a calcular aí.

Não está bem claro para mim porque está a escrever sobre possíveis implementações de diferenças MQL4/5. Acabei de notar estas diferenças para aqueles que escrevem código multiplataforma.

As diferenças já se acumularam para um artigo. Alguém deveria escrevê-lo.

 
fxsaber:

Não sei bem porque está a escrever sobre as possíveis soluções para as diferenças MQL4/5. Acabei de notar estas diferenças para aqueles que escrevem código multiplataforma.

As diferenças já se acumularam para um artigo. Alguém deveria escrevê-lo.

Pensei que era uma pergunta. Bom. Posso apagar as minhas mensagens.

 

Apenas suspeito antes, agora confirmado. É fácil obter fugas de memória quando se trabalha com recursos.


Exemplo.

#include <Graphics\Graphic.mqh>

#define  MIN_WIDTH 10

// Создание графика.
string GraphPlot( const double &Y[],
                  int Width = 0, int Height = 0, const ENUM_CURVE_TYPE Type = CURVE_NONE,
                  const string CurveName = NULL, string ObjName = NULL )
{
  Width = Width ? Width : (int)::ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
  Height = Height ? Height : (int)::ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
  ObjName = (ObjName == NULL) ? __FUNCTION__ : ObjName;

  CGraphic Graphic;

  const bool Res = (::ObjectFind(0, ObjName) >= 0) ? Graphic.Attach(0, ObjName) : Graphic.Create(0, ObjName, 0, 0, 0, Width, Height);

  if (Res)
  {
    const int Size = ::ArraySize(Y);

    Graphic.CurveAdd(Y, ((Type == CURVE_NONE) && Size) ? ((Width / Size < MIN_WIDTH) ? CURVE_LINES : CURVE_POINTS_AND_LINES) : Type, CurveName);

    Graphic.CurvePlotAll();
    Graphic.Update();
  }

  return (Res ? Graphic.ChartObjectName() : NULL);
}

void OnStart()
{  
  const double Array[] = {0, 1, 2, 3, 4, 5};
      
  const string ObjName = GraphPlot(Array, 1200); // Создали график-объект.
  const string ResourceName = ::ObjectGetString(0, ObjName, OBJPROP_BMPFILE); // К какому ресурсу привязка объекта.
  
  // ObjectDelete(0, ObjName); // Удалили объект.

//  ResourceFree(StringSubstr(ResourceName, StringFind(ResourceName, "::"))); // Без этой строки утечка памяти.
}


Um guião via SB imprime um gráfico de uma matriz numérica para um gráfico. Poderá então apagar manualmente este gráfico (objecto), mas o recurso atribuído a este gráfico permanecerá para sempre pendurado na memória em modo apenas de leitura. Não pode ser apagado, porque apenas o guião do proprietário o pode apagar (ver a linha realçada).


Não há nenhuma funcionalidade no MQL que liberte uma memória tão ocupada. Tenha especial cuidado com isto no VPS.

 
fxsaber:

Apenas suspeito antes, agora confirmado. É fácil obter fugas de memória quando se trabalha com recursos.


Exemplo.


Um guião via SB imprime um gráfico de uma matriz numérica para um gráfico. Poderá então apagar manualmente este gráfico (objecto), mas o recurso atribuído a este gráfico permanecerá para sempre pendurado na memória em modo apenas de leitura. Não pode ser apagado, porque apenas o guião do proprietário o pode apagar (ver a linha realçada).


Não há nenhuma funcionalidade no MQL que liberte uma memória tão ocupada. Tenha especial cuidado com o VPS.

Quando se recebe uma mensagem sobre uma fuga de memória, isso significa que não houve nenhum comando explícito para libertar essa memória.

Quando um programa termina (que é quando se recebe estas mensagens), liberta toda a memória, incluindo a memória vazada, em qualquer caso.