Erros, bugs, perguntas - página 436

 
Interesting:

1. Porquê? Os sintomas nocivos precisam de ser tratados, e de forma decisiva.

2. Variáveis, matrizes e outras coisas não devem ser nomeadas de forma consistente ou com palavras-chave de linguagem (mas a matriz "Símbolo" é muito marcante, não se pode dizer se é uma matriz ou outra coisa em código).

1. Bem, primeiro é preciso estabelecer realmente se a sintomologia pertence a manifestações positivas ou negativas. Na minha experiência, tive casos em que tentei alterar o valor de uma variável global numa função que não era suposto fazer isso (maldita co-pasta). Demorei alguns dias a encontrar este erro. Desde então, tenho vindo a utilizar variáveis globais em casos em que, em princípio, não posso passar sem elas.

2. Concordo. Mas se forem utilizados dentro de uma função, isso não me incomoda. Mas as variáveis globais com tais nomes são realmente uma fonte de confusão futura.

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 

No entanto, vou repetir a minha pergunta.

É possível determinar o gatilho do OnInit dentro do OnTick?
Por exemplo, posso declarar uma variável estática dentro do OnTick que armazena o número de vezes que a EA é inicializada (se a MQL5 tiver essa propriedade ou uma propriedade semelhante)?

 
voix_kas:

Devo ser paranóico. Não gosto de variáveis públicas (globais). Considero-o um muveton.

Asvariáveis globais são pelo menos visíveis de longe. Mas esconder variáveis cumulativas graves dentro das funções estáticas é uma forma de espalhar cuidadosamente um ancinho para si próprio. Esta é a primeira vez que vejo uma matriz estática acumulada escondida dentro de uma função de tal forma. Isto é um ancinho ardente.

Utilizar aulas - deixarão o nível global limpo, esconderão todas as entranhas e livrar-se-ão das muletas.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
voix_kas:

No entanto, vou repetir a minha pergunta.

É possível determinar a activação do OnInit no interior do OnTick?
Por exemplo, podemos declarar uma variável estática dentro do OnTick que armazena o número de inicialização do Expert Advisor (se existir tal ou semelhante variável na MQL5)?

É possível não só contar o número de gatilhos OnInit, mas também determinar porque é que a inicialização ocorreu (a implementação é outra questão).

Está familiarizado com _UninitReason, por exemplo?

 
Pode lê-lo no OnInit, mas preciso destes dados noutro evento (sem utilizar variáveis globais). Seja qual for a sua perspectiva, é uma questão de implementação. O mesmo se passa com a OnDenit.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Aulas que eu nunca escrevi. Se alguém me puder ajudar, ficar-lhe-ei grato.
Necessidade de escrever uma aula de WorkSymbols.
Métodos:
string GetSymbol[];
bool UpdateSymbols(inWorkSymbols);
bool UpdateSymbolsStatus();
int GetSymbolCount();

Desculpe se o pedido é atrevido... Também vou tentar descobrir por mim próprio.
 
Renat:

Sim, parece um erro combinar a mudança do símbolo com a condição de tempo.

Sou também a favor de os dividir em duas condições. O bilhete já foi colocado no balcão de atendimento.

Obrigado!
 

Mais ou menos cozinhado. As críticas são bem-vindas.

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

class CSymbolList {
  private:
    string Symbols[];

  public:
    void   CSymbolList() { SetSymbols(""); }
    void  ~CSymbolList() { ArrayFree(Symbols); }
    int    GetSymbolCount() { return ArraySize(Symbols); }
    void   SetSymbols(string);
    string GetSymbolName(int);
};

void CSymbolList::SetSymbols(string Source) {
  ArrayFree(Symbols);
  for (int count = 1, i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) {
      if (ArrayResize(Symbols, count) != count) {
        ArrayFree(Symbols);
        return;
      }
      Symbols[count-1] = SymbolName(i, false);
      count++;
    }
}

string CSymbolList::GetSymbolName(int Item) {
  if (Item < 0 || !ArraySize(Symbols) || Item >= ArraySize(Symbols)) return "";
  return Symbols[Item];
}

void OnStart() {
  CSymbolList slMain;
  slMain.SetSymbols(inWorkSymbols);
  for (int i = 0; i < slMain.GetSymbolCount(); i++)
    Print(slMain.GetSymbolName(i));
}
 

A única coisa que não me agrada aqui é o redimensionamento "ao vivo" da matriz que contém os dados de trabalho.
Pergunta para os criadores, é garantido que os dados do utilizador anteriormente introduzidos na matriz dinâmica que está a ser modificada serão preservados sob a seguinte condição?

if (ArrayResize(Symbols, count) == count)
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
voix_kas:

A única coisa que não me agrada aqui é o redimensionamento "ao vivo" da matriz que contém os dados de trabalho.
Uma questão para os criadores, é garantido que os dados de utilizador anteriormente introduzidos na matriz dinâmica que está a ser modificada serão preservados sob a seguinte condição?

Aposto que é garantido. Pelo menos conto com isso a toda a hora, e o problema nunca surgiu.