Discussão do artigo "Introdução ao MQL5: Como escrever Expert Advisor e Custom Indicator simples" - página 3

 

Pergunta 4: O artigo afirma o seguinte:

...Vamos colocar na estrutura da solicitação os valores que serão comuns na maioria dos casos de chamada da função OrderSend neste programa:

   request.symbol      =Symbol();
   request.volume      =Lots;
   request.tp          =0;
   request.deviation   =0;
   request.type_filling=ORDER_FILLING_AON;

O elemento request.symbol contém o nome simbólico do instrumento no qual as operações de negociação são realizadas, o elemento request.volume contém o valor do contrato do instrumento financeiro, o elementorequest.tp contém o valor do preço TakeProfit (em alguns casos, o valor TakeProfit para a ordem não será especificado, portanto, colocamos zero no elemento da estrutura request.tp )....

Mas por que colocamos zero no elemento da estrutura request.tp? Porque, se tivermos uma ordem de compra pendente , request.tp=0 significa que o TP sempre estará abaixo do preço atual do Bid. E, ao que me parece, uma ordem com esse valor de TP deve ser rejeitada devido ao valor especificado incorretamente do parâmetro TP ou deve ser executada imediatamente ao preço atual do lance depois que o servidor aceitar essa ordem.

 

Pergunta 5: O artigo afirma o seguinte:

...Vamos especificar as variáveis locais a serem usadas na função OnTick e seu tipo:

double h[], l[], ma[], atr_h[], atr_l[],
          lev_h, lev_l, StopLoss,
          StopLevel=_Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL),
          Spread   =NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK) - SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);

...A variável StopLevel é usada para armazenar o valor STOP_LEVEL - a distância mínima entre o preço atual e a ordem colocada (em unidades de preço). Esse valor é obtido como um produto do preço do ponto (variável predefinida _Point) pelo valor STOP_LEVEL em pontos. A função SymbolInfoInteger retorna o valor STOP_LEVEL. O primeiro parâmetro dessa função é o nome simbólico do instrumento, e o segundo parâmetro é o identificador da propriedade solicitada....

O Manual de Referência da MQL5 também afirma que"SYMBOL_TRADE_STOPS_LEVEL é a margem mínima em pips do preço de fechamento atual para definir ordens Stop". Ao que me parece, em ambos os casos, é uma questão de cumprimento da desigualdade

ORDER_PRICE_CURRENT-request.price>=SYMBOL_TRADE_STOPS_LEVEL(no caso da ordem Sell_Stop).

Por que, então, o código do Expert Advisor verifica se a distância entre Bid (Ask) e StopLoss excede o recuo mínimo de StopLevel?

               ...// o novo StopLoss não está próximo do preço atual?
               && NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID)-StopLoss-StopLevel,_Digits)>0
               
               ...// o novo StopLoss não está próximo do preço atual?
               && NormalizeDouble(StopLoss-SymbolInfoDouble(Symbol(),SYMBOL_ASK)-StopLevel,_Digits)>0

Essa verificação é necessária em todos os casos ou é uma peculiaridade da implementação de uma estratégia específica? Em resumo, devo sempre verificar a distância entre Bid (Ask) e StopLoss ao colocar uma ordem pendente para ver se a margem mínima de StopLevel foi excedida?

 
Yedelkin:

Mas por que colocamos zero no elemento de estrutura request.tp? Porque se tivermos uma ordem de compra pendente , request.tp=0 significa que o TP sempre estará abaixo do preço Bid atual. E, ao que me parece, uma ordem com esse valor de TP deve ser rejeitada devido a um valor incorretamente especificado do parâmetro TP ou deve ser executada imediatamente ao preço Bid atual depois que o servidor aceitar essa ordem.
Zero significa que não há TP.
 
Yedelkin:

Em resumo, devo sempre verificar a distância entre o Bid (Ask) e o StopLoss ao colocar uma ordem pendente para ver se a margem mínima do StopLevel foi excedida?

É sempre necessário verificar o nível de preço SL/TP/Entry das ordens pendentes quanto à margem mínima nos casos em que você trabalha com ordens de configuração muito próximas do mercado.

Se você trabalhar com stops ou ordens pendentes em um modo razoável e distante do mercado (dezenas e centenas de pontos), poderá ignorar essa verificação.

 
Renat:

Você deve sempre verificar o nível de preço SL/TP/Entry das ordens pendentes quanto ao recuo mínimo nos casos em que você trabalha com a definição de ordens muito próximas do mercado.

Esclarecimento da pergunta 5.1.

Eu faço com que o Expert Advisor calcule três níveis para cada ordem pendente: Preço de entrada/SL/TP.

Como não se sabe de antemão o quão perto ou longe o nível do preço de entrada estará localizado em relação ao preço de mercado atual, a verificação do nível do preço de entrada quanto à conformidade com a margem mínima não levanta nenhuma dúvida.

Mas contra qual nível devemos verificar os dois níveis SL/TP restantes? É um tanto ilógico verificar os níveis de SL/TP em relação ao preço de mercado atual, porque o nível de preço de entrada pode estar localizado bem longe do preço de mercado atual, e essa verificação perde toda a relevância. É por isso que eu providenciei a verificação da condição |Entry price-TP(SL)|>SYMBOL_TRADE_STOPS_LEVEL no Expert Advisor. Em geral, o Expert Advisor funciona bem com essas condições, mas, quando comecei a otimizar o código do EA, perguntei-me se essa verificação seria necessária do ponto de vista do processamento de ordens pendentes pelo servidor. O código do Expert Advisor não está sobrecarregado com a verificação dessa condição (a estratégia do Expert Advisor em si não exige essa verificação).

Em outras palavras, a ordem pendente com três níveis de preço de entrada/SL/TP deve sempre verificar os níveis de SL/TP para a margem mínima? E, em caso afirmativo, deve ser verificada a margem mínima em relação a qual nível (preço)?

 

Algo está faltando na capacidade de editar minha postagem. Portanto, acrescentarei aqui:

= Para cada ordem pendente, o Expert Advisor calcula três níveis independentemente: Preço de entrada/SL/TP. O objetivo de "definir uma ordem pendente mais próxima do mercado" não é perseguido. =

 

O SL e o TP no nível pendente são avaliados a partir do preço de entrada, de modo que não estejam a menos de um nível mínimo de distância dele.

Isso funciona da mesma forma no MT4.

 
Renat:

O SL e o TP no nível pendente são avaliados a partir do preço de entrada, de modo que estejam pelo menos a um nível mínimo de distância dele.

Isso funciona da mesma forma no MT4.

OK, agora eu entendo tudo. Portanto, não posso facilitar o código do EA; inicialmente, tudo foi feito de acordo com o artigo, ou seja, corretamente.

E eu não estou familiarizado com o MT4, portanto, essas perguntas são "de um manequim". Obrigado!

 
Renat:

...Sempre verifique o nível de preço SL/TP/Entry das ordens pendentes quanto ao recuo mínimo nos casos em que houver trabalho com a definição de ordens muito próximas do mercado.

...O SL e o TP no nível pendente são estimados a partir do preço de entrada, de modo que não estejam a menos de um nível mínimo de distância dele.

Pergunta 6: Está claro que é necessário verificar o recuo mínimo ao colocar ordens pendentes. Agora temos uma pergunta sobre as peculiaridades da verificação da margem mínima ao modificar o TP/SL de uma posição aberta.

Situação: uma posição aberta tem um TP fixo e um SL "pull-up", que se aproxima do TP fixo à medida que o preço se move em uma direção favorável. Por analogia com a definição de uma ordem pendente, toda vez que o Expert Advisor envia uma ordem para modificar o TP/SL de uma posição aberta, ele verifica o recuo mínimo com relação aos níveis TP e SL.

Porém, na descrição da função PositionModify da classe CTrade, é especificado que o parâmetro tp é "O novo preço no qual o Take Profit será acionado (ou, se a alteração não for necessária, o valor anterior)".

Portanto, a pergunta é: se não for necessária uma alteração do nível de TP definido anteriormente, ao enviar uma ordem para modificar o TP/SL de uma posição aberta, é necessário verificar a margem mínima desse nível de TP em relação ao preço atual (real)? Ou, nessa situação, é suficiente verificar a margem mínima apenas em relação ao SL modificado?

Em outras palavras, ao enviar uma ordem para modificar o TP/SL de uma posição aberta, é possível não verificar a margem mínima em relação ao TP, se esse nível de TP já tiver sido definido anteriormente e não estiver sujeito a alterações? E, na ordem de modificação, basta especificar o valor anterior do TP?

 

Depois de fazer o download do arquivo "indicator_TP_en.mql5", renomeie-o para "indicator_TP.mql5".