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

 
Vadim Novikov:

Boa tarde a todos que se importam!


Sou um usuário avançado, mas não escrevo com tanta freqüência, por isso, não consigo acompanhar algumas inovações e às vezes esqueço as coisas.


Por favor, me ajude com uma pergunta. Não consigo me lembrar de uma coisa.


Eis a situação. Eu defini variáveis externas. Eu defini muitas delas. 20 variáveis.Eles são exibidos no menu de entrada do programa, quando você anexa este programa à tabela.


Eis a pergunta: como separar blocos destas variáveis com comentários? No menu de entrada, por exemplo:


Este é um bloco sobre a mudança das variáveis de MA (comentário)

Período MA

Método de ajuste MA

Preço MA

Este é um bloco sobre a mudança de variáveis MACD (comentário)

..........................

...........................

...........................

Este é um bloco sobre a mudança das variáveis BB (comentário)

.........................

..............................

...........................


Parece que antes de inserir tais comentários com a função de comentário de código.Ou seja, eu escrevi // ou /* */. Mas agora algo não funciona.

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

Assim

 
OrderStopLoss() produz duas casas decimais. Posso forçá-lo a produzir três casas decimais?
 
Alekseu Fedotov:

Assim.

Obrigado, isso me faz lembrar!!!

 
Igor Golieniev:

Experimente assim:

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

Isto é para mostrar todos os dígitos significativos da citação. Se algum outro número de dígitos for necessário, substitua Digitos() por um número específico.

 
Boa noite, quaisquer dicas, por favor. Na função OnInit cria duas linhas horizontais, no OnTick duas funções, uma envia notificação push e por correio se Bid > primeira linha, segunda se Bid < segunda linha. Bid=line não o fez, para evitar lacunas. Naturalmente, também me deparei com o fato de que, se a condição for cumprida, a notificação vem com cada carrapato, o que é ruim. Como resolver este problema? Você pode definir o tempo limite ou o número de notificações nas configurações de Alerta Padrão.
 
Ihor Herasko:

Experimente assim:

Isto é para mostrar todos os dígitos significativos da citação. Se você precisar de qualquer outro número de dígitos, substitua Dígitos() por um número específico.

Agora imprime corretamente 15.155, no entanto - stoploss inválido para a função OrderModify

Este problema é apenas com a Silver in OrderModify

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

Imprimir agora sai corretamente 15.155 , no entanto - stoploss inválido para a função OrderModify

Este problema é apenas com a Silver in OrderModify

Há dois erros neste código:

  1. Falta de verificação do tamanho mínimo de parada permitido (é chamado de Nível de parada).
  2. Comparação incorreta de números reais.

Para resolver o primeiro problema, precisamos obter o nível de parada atual:

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

Se o fStopLevel acabar sendo zero e o tipo de conta não for ECN, então o fStopLevel deve ser forçado a ser igual a três spreads.

Antes de definir as paradas (tanto Stop Loss como Take Profit) verifique se o novo nível está no nível de parada ou acima do preço de fechamento do pedido. Para verificar a parada para um pedido de compra, isto é feito da seguinte forma:

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

Para uma parada de ordem de venda:

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


A solução para o segundo problema: Compare valores reais com alguma precisão, pois a igualdade dos números reais não pode ser alcançada sempre e em todos os lugares. Eu já dei um exemplo de comparação acima no código de validação de nível de parada.

 
Ihor Herasko:

Há dois erros neste código que são impressionantes:

  1. Falta de verificação do tamanho mínimo de parada permitido (chamado nível de parada).
  2. Comparação incorreta de números reais.

Para resolver o primeiro problema, precisamos obter o nível de parada atual:

Se o fStopLevel acabar sendo zero e o tipo de conta não for ECN, então o fStopLevel deve ser forçado a ser igual a três spreads.

Antes de definir as paradas (tanto Stop Loss como Take Profit) verifique se o novo nível está no nível de parada ou acima do preço de fechamento do pedido. Para verificar a parada para um pedido de compra, isto é feito da seguinte forma:

Para uma parada de ordem de venda:


A solução para o segundo problema: Compare valores reais com alguma precisão, pois a igualdade de números reais não pode ser alcançada sempre e em todos os lugares. Eu já dei um exemplo de comparação acima no código de validação de nível de parada.

Obrigado.

No entanto, a questão não está encerrada. OrderModify começa a acionar imediatamente quando uma ordem é aberta. Onde está o erro? (Repito - em todas as moedas/futuros funciona, na Prata não funciona)

 
Igor Golieniev:

Obrigado.

No entanto, a questão não está encerrada. OrderModify começa a acionar imediatamente quando uma ordem é aberta. Onde está o erro? (Repito - em todas as moedas/futuros funciona, na Prata não funciona)

1. Diretiva

#property strict

você está usando ?

2) Isso acontece com Vender e Comprar, ou somente com Vender?

3. O Stop Loss é definido na abertura da posição ou o trader deve defini-lo, se possível?

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Golieniev:

Obrigado.

No entanto, a questão não está encerrada. OrderModify começa a trabalhar imediatamente quando uma ordem é aberta. Onde está o erro? (repito - funciona em todas as moedas/futuros, não funciona na prata)

Mostrar o trecho de registro (se online, a guia Especialistas) onde você pode ver a abertura e as modificações da ordem de mercado e indicar quais valores TrailingStop e TrailingStep foram usados.

Razão: