Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 100

 
alexey1979621:
Olá a todos! A questão é a seguinte. Como medir a distância entre Alto e Baixo da primeira, segunda, terceira vela e prescrever a condição de que esta distância de cada vela não deve ser inferior a, digamos, 10 pontos. Agradecemos antecipadamente.

Aqui estão as variáveis do ambiente de mercado para ajudá-lo https://docs.mql4.com/ru/predefined/variables
 
artmedia70:
Revolta dos robôs... :)


Aha ha ha ha. yosuf, Cyborg lhe enviou... )))))))
 
artmedia70:

Aqui está um EA para testar a função. Ela contém a função em si e sua chamada. Antes de ligar, você tem que preparar uma mensagem, que pode ser de até quatro linhas. O comprimento de cada linha, se bem me lembro, não deve exceder 64 caracteres. É por isso que dividi uma mensagem em várias linhas. Cada linha de uma mensagem pode ser emitida em uma cor diferente. É um pouco claro no código - primeiro preparamos linhas de mensagem, depois chamamos a função. Não comentei muito lá - escrevi-o de uma só vez há muito tempo. Agora eu já esqueci para o que existe. Se eu tiver alguma dúvida, vou me lembrar, mas agora só me lembro das coisas necessárias.

E um peru:

É assim que é... Espero que você pegue o jeito.

É claro que posso fazer um subpavimento em vez de o fazer sair para o gráfico principal na janela do indicador, mas sou muito preguiçoso ... :)



Artem, eu vi seu código, o peru é a bomba: )))). Em essência, tudo está claro com mais, embora eu tenha visto alguns pontos na implementação, um pouco diferente do que eu teria feito, mas isso é uma coisa menor.

Eis o que é interessante. Somente o que está no perito é impresso no peru. Mas como você a utiliza em seu benefício?

 
hoz:


Artem, eu vi seu código, o peru é a bomba: )))). Em essência, tudo está claro com mais, embora eu tenha visto alguns pontos na implementação, um pouco diferente do que eu teria feito, mas isso é apenas bagatelas.

Eis o que é interessante. Somente o que está no Expert Advisor é impresso na mesa giratória. Mas como posso utilizá-lo em meu benefício?

Eu não entendo a pergunta. Ele substitui a função Print(). Emite todas as mensagens para a janela do acusador. Você pode definir cores para cada linha de uma mensagem (como prioridade de mensagem). Mais conveniente do que imprimir. Esse é todo o uso.
 

É uma função. Esse especialista é apenas para mostrar o que a função faz. Portanto, use essa função para exibir suas mensagens de sua EA.

Esse especialista só mostra como utilizá-lo.

 
artmedia70:

É uma função. Esse especialista é apenas para mostrar o que a função faz. Portanto, use essa função para exibir suas mensagens de sua EA.

Esse especialista só mostra como utilizá-lo.


Embora sim... É uma função... Eu perdi o mais importante enquanto estava descobrindo :(
 

Há uma nova dor de cabeça. Eis o que é preciso para que isso aconteça:

1. Há uma série de ordens no mercado, ou seja, há ordens de mercado e ordens pendentes no mercado o tempo todo.

2. Em um certo momento em que a última ordem aberta até agora é fechada por um TP, precisamos fechar todas as ordens que foram abertas e apagar todas as ordens pendentes também.

Eu o fiz desta maneira (coloquei na função de início()):

for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)              
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Função GetLastOrderState() verifica se a última encomenda está fechada:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                    // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
          lastOrderOpenTime = OrderOpenTime();
   }
   Comment("Время открытия последнего открытого ордера = ", lastOrderOpenTime);
   for (int h=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(h, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      
      if (OrderOpenPrice() == lastOrderOpenTime)
          lastOrderCloseTime = OrderCloseTime();
   }
  // Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

E depois funciona apagando ordens de mercado pendentes e fechando. Vejo que não está funcionando corretamente de alguma forma. Minha função está bem?

Entendo que a função está em ordem por idéia. Mas a lógica não está bem aqui. Você tem alguma idéia sobre este assunto? Acontece que, de qualquer forma, mesmo quando nenhuma das ordens da EA foi fechada pela TP, tudo é fechado num piscar de olhos depois de ter sido aberto pelo sinal...

 
hoz:

Aha ha ha ha. yosuf, Cyborg lhe enviou... )))))))
Ainda assim, um bom e ágil proger. Como se todos os problemas fossem seus, pois esse destino retribuirá, inquestionavelmente, ou, se deparará com o graal.
 
yosuf:
Ainda assim, um bom e simpático proger. Como se todos os problemas fossem dele, pois esse destino recompensará, inquestionavelmente, ou, se deparará com o graal.


Mas não havia nenhuma especificidade e, portanto, nenhuma dúvida. Eu não sei o que responder.... Você deve tentar explicar a situação da maneira mais clara possível para obter uma resposta.
 
hoz:

Há uma nova dor de cabeça. Eis o que é preciso para que isso aconteça:

1. Há uma série de ordens no mercado, ou seja, há ordens de mercado e ordens pendentes no mercado o tempo todo.

2. Em um determinado momento, quando a última ordem aberta até agora é fechada por um TP, precisamos fechar todas as ordens que foram abertas e apagar todas as ordens pendentes também.

Eu o fiz desta forma (coloquei-o na função start() )):

Função GetLastOrderState() verifica se a última encomenda está fechada:

E depois funciona apagando ordens de mercado pendentes e fechando. Vejo que não está funcionando corretamente de alguma forma. Minha função está bem?

Entendo que a função está em ordem por idéia. Mas a lógica não é boa aqui. Você tem alguma idéia sobre este assunto? Acontece que, de qualquer forma, mesmo que nenhuma das ordens da EA tenha fechado na TP, tudo é fechado num piscar de olhos depois de ter sido aberto pelo sinal...

Victor, pegue a função testada e comprovada de Kim que verifica se uma posição é fechada pela TP:

isCloseLastPosByTake - Retorna uma bandeira para fechar a última posição no take. Encontrar em Apenas funções úteis
E depois fechar tudo.

Razão: