Características da linguagem mql4, sutilezas e técnicas

 
Este tópico discutirá formas não documentadas de trabalhar com a linguagem mql4, exemplos de solução de certos problemas. Seria desejável que este ramo estivesse mais próximo, em conteúdo, das FAQ, do que da discussão. Sugiro que todos os programadores experientes compartilhem suas soluções e técnicas de programação, especialmente a cobertura de recursos não descritos na ajuda.
 
Bem, deixe-me começar primeiro.

Para fechar um pedido, não é necessário definir o tipo de pedido e o preço correspondente a esse tipo. É suficiente escrever OrderClosePrice()

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

Há muito mais imprecisões na ajuda. VejaSetIndexBuffer(), por exemplo.O que há de errado com a ajuda?

"Parâmetros

índice

[em] Número de reserva indicador. A numeração começa com 0. O número deve ser menor do que o valor declarado em #property indicator_buffers". (esta afirmação não é verdadeira)

O #property indicator_buffers especifica o número de buffers a serem exibidos. Talvez o que a ajuda significa, embora eu não tenha verificado isto, é que, os amortecedores usados para o cálculo não precisam ser dados um número com SetIndexBuffer(). Mas o que eu verifiquei é que se o buffer usado para cálculo é dado um número com SetIndexBuffer(), seu valor pode ser recuperado via iCustom().

 
Eu não entendo.
 

Como os desenvolvedores estão visitando o fio - há uma pergunta sobre "sutilezas e truques":

Exemplo de uma impressão formatada: PrintFormat("Bid=%.5f", Bid)

Pergunta: existe alguma forma, em vez de uma precisão fixa (aqui5), de especificar uma condição na descrição do formato para que a precisão dependa dos _Dígitos? Fazer sem 'pré-processamento' como PrintFormat("Bid=%s", DoubleToString(Bid, _Digits))

 

Na MQL4 o mesmo código pode dar resultados diferentes, dependendo do estado de #propriedade estrito. E isto é quando a compilação é bem sucedida em ambos os casos. Portanto, se a execução for "divagante", você pode procurar a causa no lugar errado (rígido) por um longo tempo.

 
Alexander Puzanov:

Pergunta: ao invés de uma precisão fixa (aqui5), é possível especificar uma condição na descrição do formato para que a precisão dependa dos _Dígitos?

Não, os exemplos estão disponíveis em https://www.mql5.com/ru/docs/common/printformat
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

Estou escrevendo um indicador na MQL4. Eu me deparei com uma característica não documentada do estilo DRAW_HISTOGRAM.

Para exibir os valores na tabela, preciso de dois amortecedores: para o valor superior do histograma e para o inferior. Ao mapear os buffers da matriz indicadora, se os buffers do estilo tiverem valores 0 e 1, 2 e 3, 4 e 5, etc., tudo é exibido normalmente. Entretanto, se aos buffers de estilo forem atribuídos valores começando com OUTROS, ou seja, 1 e 2, 3 e 4, 5 e 6, as linhas do histograma não serão exibidas corretamente no gráfico, embora os valores na janela de dados estejam corretos.

Por favor, acrescente uma menção a esta peculiaridade à documentação, ou corrija, pois nem sempre é o caso de a descrição do estilo DRAW_HISTOGRAM começar com um buffer uniforme!

Do SD.
 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Bichos, insetos, perguntas

-Aleks-, 2017.02.07 18:21

Você pode me aconselhar, por favor, se no MT4 Expert Advisor, se o indicador do usuário com mais de um buffer gráfico for chamado consistentemente, então o recálculo acontece a cada chamada ou todos os buffers são calculados de uma só vez e você pode se referir ao indicador em código muitas vezes e não esperar que haja um desperdício de recursos. Também estou interessado em saber o que acontecerá se o código não for completado (funciona por mais tempo que um tick), mas o valor do indicador muda.


Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Bichos, insetos, perguntas

Slawa, 2017.02.08 08:20

Todos os amortecedores são calculados de uma só vez. Interrogar calmamente os valores do indicador - não haverá recálculo

No MT4, o indicador chamado do consultor especializado trabalha no fluxo deste EA e em uma cópia de seus dados históricos. Você pode fazer loop com o Expert Advisor, mas ao mesmo tempo receberá os dados indicadores calculados no momento da chamada OnTick. Até que você chame a RefreshRates. RefreshRates atualiza dados históricos do Expert Advisor, após o que todos os seus dados serão recalculados na primeira chamada do indicador

 
Alexey Viktorov:
Para fechar um pedido, não é necessário especificar o tipo de pedido e o preço correspondente a este tipo. Basta escrever perto do preço OrderClosePrice()

O OrderClosePrice só pode ser usado imediatamente após o OrderSelect correspondente. Porque OrderSelect copia os dados para Order(const)-functions uma vez, e o mesmo RefreshRates não é capaz de atualizá-los.

Isto é, se, por exemplo, o OrderClosePrice não fechar, então o OrderSelect deve ser feito novamente antes da próxima tentativa (não é necessário fazer uma atualização).

ZS Esta linha é de 2005! Aqui estão os argumentos detalhados dos desenvolvedores.

 
Rashid Umarov:
Não, há exemplos em https://www.mql5.com/ru/docs/common/printformat

É uma vergonha...

---

Para que o posto não seja inútil:

ao invés de StringGetCharacter("a", 0) você pode escrever apenas 'a' - muitas vezes necessário ao analisar as cordas em partes com StringSplit