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

 
Maxim Kuznetsov:

Que cânone é esse? Há um documento oficial - é exatamente como o seu...todas as outras coisas são apenas falsas.

1. Vale a pena estabelecer a serialização de todas as matrizes usadas dentro da OnCalculate

Antes de entrar no loop, coloque buff[length]=Bid+size; - você terá aproximadamente o que você quer. Uma linha curva e no final uma "viseira" no tamanho Bid+size

3. observar os limites da matriz. Claro, taxas_total <comprimento, mas você não pode brincar sobre isso :-)

Em outras palavras, você deve escrever a ArraySetAsSeries no início e depois dançar a partir daí?

Oh sim, eu descrevi isso errado. Você precisa desta linha para ir para a esquerda na tabela e atualizá-la a cada tique

 
YanSay:

Muito obrigado por sua resposta detalhada!

Seguindo seu conselho, eu dividi as filiais e tudo funcionou.

Enfrentei um problema com a abertura simultânea de 10-15 pedidos pendentes, resolvi o problema adicionando seu código após o mesmo:

Isto também não é uma solução. O pedido pode ser aberto manualmente ou por outro EA. Como resultado, a EA que está sendo desenvolvida não abrirá nada. Portanto, precisamos contar o número de pedidos abertos pelo Consultor Especialista. Tendo estes dados, decida se deve ou não abrir um pedido.

Tenho certeza de que há uma maneira melhor.

Com relação ao seu código, explique o que 1; i >=0; --i?

Este é o loop padrão para pedidos. OrdensTotal() - este é o número de ordens. Os pedidos são indexados a partir de zero. Assim, se houver 1 ordem, seu índice será 0, enquanto o OrderTotal() retornará 1. Assim, o laço deve começar com o índice que é 1 a menos do que o número de ordens. Obtemos OrdensTotal() - 1. O segundo operando é a condição da execução do corpo do laço. Neste caso, o loop terminará em i = -1. O terceiro operando é a execução do salto de laço para o próximo índice (diminuir em 1).

Você pode ler sobre o operador de laço na documentação.

 
Ihor Herasko:

Isto também não é uma opção. O pedido pode ser aberto manualmente ou por outro EA. Como resultado, a EA que está sendo desenvolvida não abrirá nada. Portanto, precisamos contar o número de pedidos abertos pelo Consultor Especialista. Tendo estes dados, teremos que tomar a decisão de abrir ou não um pedido.

Tentei desta forma, mas começou a abrir 10-15 pedidos por 1 sinal novamente:

if ((OrdersTotal ()>0) && (OrderMagicNumber() != 100)) return;

O terceiro operando é passar para o próximo índice (diminuir em 1).

Então está olhando para todos os pedidos desde o final?

 
YanSay:

Tentei isto, mas começou a abrir 10-15 pedidos por sinal novamente:

Então está olhando para todos os pedidos desde o final?

Para usar a função OrderMagicNumber(), você deve primeiro selecionar um pedido. O ciclo padrão de coleta de informações sobre os pedidos é assim (por exemplo, contar o número de pedidos de cada um):

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (OrderMagicNumber() != <значение ID ордеров эксперта>)
         continue;

      ++nCnt;
   }

Após este código ser executado, a variável nCnt conterá o número das ordens de trabalho do Expert Advisor.

 
Ihor Herasko:

Resolvo o problema da seguinte forma...


Obrigado.

 
Ihor Herasko:

Para usar a função OrderMagicNumber(), você deve primeiro selecionar um pedido. O ciclo padrão de coleta de informações sobre as próprias ordens é assim (por exemplo, contar o número de ordens de uma pessoa):

Após este código ser executado, a variável nCnt conterá o número de ordens de trabalho da EA.

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber)
     continue;
  ++nCnt;
  {
   if (nCnt>0)
      return;
  }
 }

Muito obrigado! Funcionou!

Você poderia informar se ++nCnt é a substituição do número de pedidos obtidos pela própria variável nCnt?

 
YanSay:

Muito obrigado! Funcionou.

Você pode me dizer se ++nCnt está substituindo o número de pedidos recebidos pela própria variável nCnt?

Em todos esses casos, consulte a documentação de uma só vez. ))

 
YanSay:

Muito obrigado! Funcionou.

Você pode me dizer se ++nCnt é a substituição do número de pedidos recebidos pela própria variável nCnt?

Há uma documentação completa do idioma, basta dar uma olhada no menu superior do site.

Não seja preguiçoso para lê-lo, é impossível manter tudo em sua cabeça. Quase todos, não só os iniciantes, sempre o conseguem lá.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Artyom Trishkin:

Há uma documentação completa sobre o idioma, basta dar uma olhada no menu superior do site.

Não seja preguiçoso para lê-lo - você não pode manter tudo em sua cabeça - ele está sempre lá para quase todos - não apenas para os novatos.

Obrigado. Nem sempre tenho certeza em que seção procurar, ainda não sou muito bom nisso e o editor de F1 nem sempre me envia ao lugar certo)

Tentarei não incomodar em perguntas bobas, obrigado por sua paciência)

 
Roman Sharanov:

1. Você pretende escrever ArraySetAsSeries no início e depois ir a partir daí?

Oh sim, eu descrevi errado. Você quer que esta linha vá para a esquerda na tabela e atualize com cada tick

Então desenhe uma linha horizontal.

Por que você precisa de buffers e seu recálculo? ObjectSetDoubke(0,myHLine,OBJPROP_PRICE,concrete_price_value);

o usuário verá a linha, você não perderá tempo recalculando os amortecedores, todos ficam felizes e se dispersam alegremente

PS/ acerte - buffer indicador, é para transferir (compartilhar/partilhar) os resultados dos cálculos realizados em primeiro lugar. O desenho de uma linha horizontal de comprimento N é diferente

Razão: