Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1482

 
MrBrooklin #:

Olá, Alexey, a variável pos_total=PositionsTotal() estava definida apenas em nível global. Agora eu a movi para dentro da função e descobri que esse era o problema. Tudo funcionou. Qual é o problema? Não estou entendendo a piada!!!

Agora, para fins de experiência, movi o pos_total para o nível global novamente e ele parou de funcionar, mas quando o coloquei dentro da função, ele funcionou como deveria! Apenas alguns milagres, bem, pelo menos para mim!!!! )))

Acontece que uma variável em nível global não pode ser inicializada por uma função? É isso mesmo?

Atenciosamente, Vladimir.

Às vezes é possível, mas não todas as variáveis. Nesse caso, quando você executa o EA, ele ainda não vê as posições abertas e a variável é igual a zero....

Na verdade, ontem fiz experimentos com amostragem de posições e cheguei à conclusão de que PositionsTotal() é necessária apenas para determinar o número de posições. E esse número é necessário apenas para limitar o loop.

Aqui está um loop desse tipo

  int i = 0;
  while(bool(posTicket = PositionGetTicket(i)) && !IsStopped())
   {
    string posSymbol = PositionGetString(POSITION_SYMBOL);
    double posPrice = PositionGetDouble(POSITION_PRICE_OPEN),
           pos_tp = PositionGetDouble(POSITION_TP),
           pos_sl = PositionGetDouble(POSITION_SL);
    printf("%s Ticket %d цена = %g тейк-профит = %g стоп-лосс = %g", posSymbol, posTicket, posPrice, pos_tp, pos_sl);
    i++;
   }


funciona mesmo que você obtenha uma lista de ordens ou negócios do histórico antes dele. Um dia desses, verificarei se a seleção de ordens pendentes interferirá nele.


E, no seu caso, é mais fácil escrever sem um loop

      PositionGetTicket(PositionsTotal()-1); // получим тикет позиции

se você precisar da última posição...

 
Alexey Viktorov #:
Nesse caso, quando você inicia o EA, ele ainda não vê as posições abertas e a variável é igual a zero ...

Eu concordaria com você, mas aqui está o problema - quando coloquei a variável pos_total no nível global, o EA não viu as posições abertas durante todo o período de teste, embora mais de 50 posições tenham sido abertas durante esse período. Não estou entendendo! Será que essa opção não funciona?

Atenciosamente, Vladimir.

 
Alexey Viktorov #:

No seu caso, é mais fácil escrever sem um loop

se você precisar da última posição...

Concordo, se eu não tivesse várias posições abertas em um símbolo diferente e em direções diferentes. Quero dizer, comprar e vender. Mas, de qualquer forma, obrigado pela dica!

Abraços, Vladimir.

 
MrBrooklin #:

Concordo, se não houvesse várias posições abertas em um símbolo diferente e em direções diferentes. Quero dizer, comprar e vender. Mas, de qualquer forma, obrigado pela dica!

Abraços, Vladimir.

Não faz diferença quantas posições estão abertas e se elas vão para o norte ou para o norte, ou para o lado oposto ou em todas as direções ao mesmo tempo... A última será PositionsTotal()-1.

 
Alexey Viktorov #:

Não faz diferença quantas posições estão abertas e se elas estão abertas para o norte, para o norte ou em todas as direções ao mesmo tempo... A última será PositionsTotal()-1.

Oi, Alexei, eu estava um pouco confuso. Você está certo como sempre!!! )))

Abraços, Vladimir.

 
Alexey Viktorov #:

Na verdade, ontem fiz um experimento com a amostragem de posições e cheguei à conclusão de que PositionsTotal() é necessário apenas para determinar o número de posições. E esse número é necessário apenas para limitar o loop.

Aqui está um loop desse tipo


funciona mesmo se você obtiver uma lista de ordens ou negócios do histórico antes dele. No outro dia, verificarei se a seleção de ordens pendentes interferirá.

Há também uma sutileza aqui.

Se a lista for realmente grande e ordenada por algum critério, pode ser mais vantajoso procurar o elemento necessário não pesquisando todos os elementos no loop, mas por meio da divisão, e aqui o conhecimento do número total de elementos na lista pode ser muito útil.

 
JRandomTrader #:

Há uma sutileza aqui também.

Se a lista for realmente grande e estiver ordenada por algum critério, pode ser mais vantajoso procurar o elemento necessário não percorrendo todos os elementos, mas por meio da divisão, e aqui o conhecimento do número total de elementos na lista pode ser muito útil.

Eu não disse que a função é completamente inútil. Mas, em alguns casos, você pode e deve passar sem ela. Afinal de contas, toda função é tempo. Você pode digitar um pouco de cada vez até obter brakes....

 
MrBrooklin #:

Oi, Alexei, eu fui burro. Você está certo como sempre!!! )))

Abraços, Vladimir.

Estou certo, mas não especifiquei que a função, como você a escreveu, não funcionará corretamente se várias negociações forem abertas em símbolos diferentes.

Já que você verifica apenas a última, e ela (a última) pode ser aberta em outro símbolo.

 
Aleksandr Slavskii #:

Certo, mas eu não especifiquei que a função, da forma como você a escreveu, não funcionará corretamente se várias negociações forem abertas em símbolos diferentes.

Já que você verifica apenas a última, e ela (a última) pode ser aberta em outro símbolo.

Olá Alexandre, já pensei sobre esse tópico, mas ainda não comecei a fazer a pergunta aqui, porque não cheguei ao local no código em que haverá diferentes posições de símbolo. Obrigado pela dica! )) Agora estou perplexo em um ponto, mas não quero trazê-lo aqui para análise pública, pois há um desejo incessante de "terminá-lo" com meus próprios esforços.

A propósito, notei que todos os meus chamados "tropeços" estão em coisas tão pequenas que não consigo ver. Veja o especificador sobre o qual Artem Trishkin me falou. É uma coisa tão pequena, e aqui eu me pergunto por que o script não funciona. Ou o mesmo link &. Perdi muito tempo com isso. Em geral, ainda preciso aprender, aprender e aprender, e em russo - ler, ler e ler a documentação.

Saudações, Vladimir.

 
Boa tarde!


Tenho uma conta de compensação.

Em meu Expert Advisor, utilizo o código para controlar as negociações realizadas:

HistorySelect(0,TimeCurrent());
ulong ticket = OrderGetTicket(0);
N_deals = HistoryDealsTotal();

Mas também preciso estimar o número de negociações fechadas.
Acho que preciso usar o modificador DEAL_ENTRY_OUT.
Mas não consigo entender como usá-lo.

Por favor, me ajude.

Atenciosamente, Alexander


Razão: