Características da linguagem mql4, sutilezas e técnicas - página 10

 
Alexey Viktorov:

Eu não consigo entender qual é a surpresa. Há um valor int do tipo de pedido na documentação.

OP_BUY

0

Compre

OP_SELL

1

Venda

OP_BUYLIMIT

2

COMPRA LIMITAR ordem pendente

OP_SELLLIMIT

3

Pedido de LIMITE DE VENDA Pendente

OP_BUYSTOP

4

Ordem STOP Pendente de compra

OP_SELLSTOP

5

Pendente da ordem de parada da venda


#define OP_BALANCE 6
#define OP_CREDIT 7

Assim, com um conjunto de 6 células, você pode às vezes exagerar.

 

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Eu quero mover o comentário da EA do canto esquerdo para o direito ?

fxsaber, 2018.07.10 15:13

// Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0, const uint Y = 0 )
{
  string Shift = NULL;
  
  StringInit(Shift, X >> 2, ' ');
  
  if (StringLen(Shift))
  {
    StringReplace(Str, "\n", "\n" + Shift);
    
    Str = Shift + Str;
  }
  
  if (Y)
  {
    StringInit(Shift, Y / 14, '\n');
    
    Str = Shift + Str;
  }
  
  Comment(Str);  
}


Aplicação

void OnStart()
{
  const uint Height = 200;
  const uint Width = 200;
  
  while (!IsStopped())
  {
    CommentXY("Hello World!\nCommentXY", MathRand() * Width / SHORT_MAX, MathRand() * Height / SHORT_MAX); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
    Sleep(200);
  }
}
 
fxsaber:

Você tem uma resposta oficial dos desenvolvedores? Até agora, só posso ver que vocês pesquisaram, pensaram e decidiram.

 
Artyom Trishkin:

Você tem uma resposta oficial dos desenvolvedores? Até agora, só vejo que você pesquisou, pensou e decidiu por conta própria.

Minha conclusão sobre o nível de "auto-suficiência" não é melhor do que esta no início deste tópico

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql4, dicas e truques

o tipo de pedido e o preço que corresponde a ele. É suficiente escrever OrderClosePrice()


Não há necessidade de sofrer de tolices/paranóia.

 
fxsaber:

Minha conclusão sobre o nível de "auto-suficiência" não é maior do que esta no início deste tópico


Não há necessidade de sofrer de tolices/paranóia.

Você deve ter perdido o tempo em que a maioria daqueles que não sofrem de "paranóia" reescreveram urgentemente seus códigos quando os EAs entraram em colapso da noite para o dia. Por causa da dependência da triagem. É muito tempo atrás, mas as pessoas ainda têm lembranças. Aqueles que tiveram problemas, começaram a escrever códigos independentes de classificação. Eu não tive problemas - apenas li sobre isso no fórum e levei isso a sério.

 
Artyom Trishkin:

Você deve ter perdido o tempo em que a maioria dos que não sofriam de "paranóia" estavam reescrevendo urgentemente seus códigos enquanto os EAs caíam da noite para o dia. Por causa da dependência da triagem. É muito tempo atrás, mas as pessoas ainda têm lembranças. Aqueles que tiveram problemas, começaram a escrever códigos independentes de classificação. Eu não tive problemas - apenas li no fórum e levei isso a sério.

Infelizmente, este mito não encontra apoio na história do fórum. Além disso, os desenvolvedores têm deixado clara sua posição de que tais mudanças não podem ser feitas como uma questão de princípio.


Por exemplo, você pode escrever com segurança

if (OrderType() <= OP_SELL)
  ReverseType = 1 - OrderType();


em vez de

if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
  ReverseType = (OrderType() == OP_BUY) ? OP_SELL : OP_BUY;


Você pode se sentir livre para escrever

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades da linguagem mql4, dicas e truques

fxsaber, 2018.04.03 16:15

double Lots[] = {0, 0, 0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

etc.

 
fxsaber:

Infelizmente, este mito não encontra apoio na história do fórum. Além disso, os desenvolvedores têm deixado clara sua posição de que tais mudanças não podem ser feitas como uma questão de princípio.

Por exemplo, você pode se sentir livre para escrever da seguinte forma


Por que todas essas pseudo-optimizações, cujas nuances temos que ter constantemente em mente? É realmente tão difícil escrever um código que não depende de tais suposições (significado de uma constante nomeada)? Qual é o objetivo de tais construções, além de mostrar algum conhecimento das nuances do compilador, mas não que elas sejam de modo algum mais fáceis de entender?

 
Ihor Herasko:

Por que todas essas pseudo-optimizações, cujas nuances devem ser constantemente levadas em conta? É realmente tão difícil escrever código que não dependa de tais suposições (qual é o significado desta ou daquela constante nomeada)? De qualquer forma, qual é o objetivo de tais construções, além de mostrar algum conhecimento das nuances do compilador, mas não que elas sejam de modo algum mais fáceis de entender?

É estranho, eu não tenho nenhum problema em ler tal código. Além disso, sua leitura e compreensão é mais rápida do que a do código "canônico".

Bem, o exemplo acima com Lotes[] é um tesouro mostrando como o código pode ser super-lacônico e claro ao mesmo tempo. E lembre-se, não é nada "canônico".

Provavelmente, se você olhar para o código fonte de muitos trabalhos de Mercado/Freelanceiro, você não encontrará apenas farrapos de código "canônico", mas também encontrará uma terrível ineficiência de desempenho e não o fator menos importante - a compreensão do código enquanto lê.


O mesmo amor inextinguível de continuar é um desrespeito total pelas possibilidades do idioma. O código em 100 linhas é muito melhor percebido do que o código em 200 linhas fazendo a mesma coisa. Esta é a razão pela qual as pessoas inicialmente reclamaram da MQL5. Veja o redesenho do código MT4 no QB para MT5 - é quase impossível entender a lógica do TC (o código é muito maior). É mais fácil ir ao original do MT4 e olhar para o código.

 
fxsaber:

Estranhamente, não tenho nenhum problema com a leitura de tal código. Além disso, sua leitura e compreensão é mais rápida do que a do código "canônico".

Em muitas empresas de software, esse tipo de código seria espancado com os dedos. A primeira coisa que você deve fazer sempre e em qualquer lugar é evitar "leitura desnecessária". Por exemplo, se você usar uma condição ao entrar em uma função:

if (<условие>)
{
}

é recomendável escrever:

if (!<условие>)
   return;

Esta abordagem realmente salva o apego das condições.

Bem, o exemplo acima com Lotes[] é um verdadeiro tesouro, mostrando como o código pode ser ao mesmo tempo super-lacônico e totalmente compreensível. E, lembre-se, não é de modo algum "canônico".

Mais uma vez, é uma dor de cabeça. Afinal de contas, ninguém verificou o que a função OrderType() retornou. Ou talvez tenha retornado -1 ou 6? Este é um exemplo de colocação sobre as propriedades do compilador do qual você deve sempre se manter afastado. Você mesmo cita muitos exemplos de código de plataforma cruzada. Então, por que você está se afastando disso neste caso? Um novo compilador MQ sairá e este código não funcionará mais corretamente.

O mesmo amor inextinguível de continuar é um total desrespeito pelas possibilidades do idioma. Um código de 100 linhas é muito melhor compreendido do que um código de 200 linhas fazendo a mesma coisa. Esta é a razão pela qual as pessoas inicialmente reclamaram da MQL5. Veja o redesenho do código MT4 no QB para MT5 - é muito difícil entender a lógica do TC (o código é muitas vezes maior). É mais fácil ir ao original do MT4 e olhar para o código.

Com a continuação, é a mesma situação. Código como:

if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == m_nMagicNumber)
{
}

é mais difícil de ler do que:

if (!OrderSelect(i, SELECT_BY_POS))
   continue;

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

if (OrderMagicNumber() != m_nMagicNumber)
   continue;
E ainda assim, a eficiência da execução é a mesma em ambos os casos.