Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1876

 
Amon1953 para fechar uma posição por SL.

Preciso dele para tomar uma decisão sobre o que fazer a seguir.

Na janela do histórico do terminal MT5, você pode selecionar um negócio, pedido ou posição.

Na história comercial você precisa procurar uma troca com DEAL_REASON igual a DEAL_REASON_SL.


Acrescentado: Pode ser simplificado - na OnTradeTransaction basta pegar a transação TRADE_TRANSACTION_DEAL_ADD e chamar para o histórico comercial procurar o DEAL que criou esta transação. E então a mesma receita: ... DEAL_REASON é igual a DEAL_REASON_SL

 
Mihail Matkovskij #:

A função não funcionará corretamente para a MQL

https://www.mql5.com/ru/docs/strings/stringcompare

Se há duas constantes no enum, por exemplo ENUM1 e enum1, então com i_str: a função"enum1" pode retornar o valor da constanteENUM1. Por que precisamos da StringCompare de qualquer maneira? Se isso puder ser feito da seguinte maneira:

E uma variante mais rápida:

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) 
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Alexey Viktorov #:

Para que serve tudo isso? Você quer substituir os valores numéricos de ENUM_TIMEFRAMES por seus próprios valores? Ou o quê?

Bem, neste momento preciso escrever as configurações dos indicadores e os parâmetros da EA no banco de dados. Ao mesmo tempo, eu gostaria de ter:

1. Registros legíveis por humanos

2. Registros legíveis por máquina

3. a estabilidade para adicionar novos valores no enumero personalizado, não necessariamente no final.

Não há problema com o registro - EnumToString, mas os desenvolvedores não fizeram a função inversa, ao contrário de todos os outros tipos.

 
Mihail Matkovskij #:

E versão mais rápida:

Concordo com a comparação não sensível a casos, escrevi uma bicicleta mais generalizada para meu próprio enumero, onde não uso letra minúscula.

Mas se para ENUM_TIMEFRAMES executar esta variante:

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
você pode ter tempo para um café enquanto ele pega, por exemplo, para PERÍODO_MN1 :)
 
Valeriy Yastremskiy #:

Obter os preços das linhas retas em cada barra e comparar ou encontrar a diferença, em lugares onde os sinais das diferenças de cruzamento mudam) A propósito, pode não haver igualdades na barra.

Que função é usada para isso? MqlRates? E se eu usar ObjectGet então tenho que especificar a propriedade do objeto lá, se eu tomar OBJPROP_PRICE então como posso fazer para que obtenha o preço antes da barra atual.
 
12345678902003 #:
Ajude por favor, eu desenho duas linhas Gunn e elas se interceptam em um determinado ponto, preciso saber as coordenadas do ponto de interseção dessas linhas.
Se você pode determinar o preço do segundo ponto da linha Gann, então a KimIV pode ajudá-lo ainda mais
 
Maksim Emeliashin #:

Concordo com a comparação com o caso ignorado, escrevi uma bicicleta mais generalizada para mim mesmo, para meu próprio enumero, onde não uso letra minúscula.

Mas se para ENUM_TIMEFRAMES esta variante for executada:

você pode ter tempo para tomar café enquanto ele pega, por exemplo, para PERÍODO_MN1 :)

Bem, em ENUM_TIMEFRAMES são conhecidos os valores mínimo e máximo. É por isso que eles podem ser especificados explicitamente.

Com o restante do enumero, é suficiente conhecer sua faixa aproximada de valores. Se as constantes não forem especificadas na declaração de enumeração, os valores lá são geralmente de 0. i_max_enum podem ser especificados por qualquer número de dois ou três dígitos: 50, 100, 255.

 
Maksim Emeliashin #:

Neste momento, preciso escrever as configurações de indicadores e parâmetros EA no banco de dados. Ao mesmo tempo, eu gostaria de ter:

1. Registros legíveis por humanos

2. Registros legíveis por máquina

3. Estabilidade para acrescentar novos valores em seu enumero personalizado, não necessariamente no final.

Não há problema com o registro - EnumToString, mas os desenvolvedores não fizeram uma função inversa, ao contrário de todos os outros tipos.

Você já tentou imprimir uma enumeração?

Print(PERIOD_M5);

O que você acha que será impresso?


Mas criar uma enumeração programática... sim. Isso seria interessante.

 
x572intraday #:
Por que não podemos passar através dos parâmetros de entrada? Por que você está nos punindo desta maneira?
É claro que isto é uma muleta, mas eu a uso: insira todos os dados necessários em uma variável de entrada de string através de um determinado separador, e depois use StringSplit para transbordá-la para uma matriz.
 
Mihail Matkovskij #:

Bem, em ENUM_TIMEFRAMES são conhecidos os valores mínimo e máximo. Portanto, elas podem ser definidas explicitamente.

Com outros enumeros, é suficiente conhecer sua faixa aproximada de valores. Se as constantes não forem especificadas na declaração enumerativa, os valores aí normalmente começam em 0. i_max_enum podem ser definidos por qualquer número de dois ou três dígitos: 50, 100, 255.

Você também pode obter experimentalmente os valores mínimo e máximo do enumero. Anote-os e especifique-os em StringToEnum para obter a velocidade mais otimizada:

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

Resultado do roteiro:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

Abrir ENUM_ACCOUNT_INFO_DOUBLE e ver. O número de constantes é Count (14). Assim, no início da aplicação você pode manusear todos os enumeros necessários, escrever seus valores mínimo e máximo e usar o StringToEnum correspondente ao mínimo e máximo com a melhor velocidade.

P.S. A segunda variante do enumFindMinMax com INT_MIN e INT_MAX é realmente muito lenta. Eu tentei no início. Depois fiquei cansado de esperar que o enumFindMinMax terminasse e definisse valores de -500 a 500.

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

Assim, cheguei à conclusão de que não é necessário utilizar toda a gama int.

Arquivos anexados:
Razão: