Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1282

 
Vladimir Karputov:

O problema é com a EA. A propósito, as regras de alojamento partilhado proíbem dlls.

Costumava funcionar muito bem. Devia tê-lo experimentado no alojamento gratuito. De qualquer forma, deu 15 libras para methaquotes ))))

Obrigado pela resposta!

 

A EA abre ordens de mercado e depois modifica-as, define TP e SL. Verificação no testador. A primeira encomenda é modificada utilizando os parâmetros necessários. A segunda ordem é aberta na mesma direcção que a primeira, mas a primeira ordem é modificada de acordo com os parâmetros da segunda e a segunda permanece com zero SL e TP. Neste caso, a condição é: se SL == 0 e TP == 0, a outra ordem é modificada porque tem parâmetros não zero. Porquê? Alterar a pesquisa da primeira para a última não altera nada.

Só mais uma coisa. No testador, se duas ordens forem abertas, o lucro da ordem é mostrado na coluna lucro, ou seja, o lucro da segunda ordem é mostrado na primeira ordem aberta e vice-versa. Porquê?

Há mais. Precisamos de traçar uma linha de tendência seguindo dois extremos. A linha é traçada mas é um toco de barra em barra. Não é uma linha de tendência, mas apenas um segmento enquanto gostaríamos de ver uma linha.

void PositionModifiSell()
{
   int    i;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);                
                                    
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:

A EA abre ordens de mercado e depois modifica-as, define TP e SL. Verificação no testador. A primeira encomenda é modificada utilizando os parâmetros necessários. A segunda ordem é aberta na mesma direcção que a primeira, mas a primeira ordem é modificada de acordo com os parâmetros da segunda e a segunda permanece com zero SL e TP. Neste caso, a condição é: se SL == 0 e TP == 0, a outra ordem é modificada porque tem parâmetros não zero. Porquê? Alterar a pesquisa da primeira para a última não altera nada.

Só mais uma coisa. No testador, se duas ordens forem abertas, o lucro da ordem é mostrado na coluna lucro, ou seja, o lucro da segunda ordem é mostrado na primeira ordem aberta e vice-versa. Porquê?

Há mais. Precisamos de traçar uma linha de tendência seguindo dois extremos. A linha é traçada mas é um toco de barra em barra. Não é uma linha de tendência, apenas um segmento enquanto gostaríamos de ver uma linha.

1. Não ORDENS, mas POSIÇÕES.

2. Formule a sua pergunta - até agora, vi uma narrativa, e não vi uma pergunta ou um algoritmo para "como se gostaria que funcionasse".

 
Vladimir Karputov:

1. Não ORDENADORES, mas POSIÇÕES

2. Formule a sua pergunta - até agora vi uma narrativa, e ainda não vi a pergunta e o algoritmo "como quer que funcione".

Sabe as suas posições, uma vez que está em mql5. E há uma posição no código. A questão é porque é que a primeira posição é modificada e não a última, apesar de estar especificada na condição:

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
 
Youri Lazurenko:

É evidente que as posições estão lá, uma vez que está em mql5. E no código está a posição. A questão é porque é que a primeira posição é modificada e não a última, apesar de estar especificada na condição:

A questão é onde. Descrever o algoritmo "Quero que o algoritmo seja este ...".

 
Vladimir Karputov:

A questão é onde???? Descrever o algoritmo "Quero que o algoritmo seja assim ...".

Quando a linha de tendência é quebrada e a barra fecha acima/abaixo, abrimos uma posição com zero SL e TP. Imediatamente após a abertura, são definidos os TP e SL necessários (a posição é modificada). Porquê, não é a última posição que é modificada, mas a anterior, violando a condição:

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)

Está claro agora? Mesmo se introduzirmos o tempo de abertura de uma posição na condição, nada muda. Não há limite para o número de posições.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Quando a linha de tendência é quebrada e a barra fecha acima/abaixo, uma posição com SL e TP zero é aberta. Imediatamente após a abertura, são definidos os TP e SL necessários (a posição é modificada). Porquê, não é a última posição que é modificada, mas a anterior, violando a condição:

Está claro agora? Mesmo se introduzirmos o tempo de abertura de uma posição na condição, nada muda. Não há limite para o número de posições.

Tem a certeza de que no momento da modificação já existe uma nova posição? (Enviar uma ordem de comércio não é uma garantia de que a posição existe).

Ao introduzir a condição (SL == 0,0 e TP == 0,0) imprimir o bilhete de posição.

 
Vladimir Karputov:

Tem a certeza de que a nova posição já está disponível no momento da modificação? (O envio de uma ordem comercial não é uma garantia de que existe uma posição).

Quando introduzir a condição (SL == 0,0 e TP == 0,0) imprima o bilhete de posição.

Sim, a segunda posição já lá está. Estou a ler o diário de bordo. O método Sell foi bem sucedido, código 10009. (Bilhete #3). E depois segue-se uma modificação, apenas da posição com bilhete #2, que também é executada com sucesso (modificação, embora, sublinho, de acordo com as condições não deveria acontecer, SL já não é 0!).

Já escreveu, tentou tanto por tempo de abertura, como por bilhete, sem sorte, modifica a posição anterior. Por exemplo:

void PositionModifiSell()
{
   int      i;
   datetime Time;
   double   sl    = 0; 
   double   tp    = 0;  
   datetime time  = 0;
   int      total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Time = m_position.Time();
               
               if(Time > time)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  time = Time;
               }
            }
         }
      }
   }
}
//------------ или
void PositionModifiSell()
{
   int      i;
   ulong  Ticket;
   double sl     = 0; 
   double tp     = 0;  
   ulong  ticket = 0;
   int    total  = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Tiсket = m_position.Ticket();
               
               if(ticket != Ticket)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кодa: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  ticket = Ticket;
               }
            }
         }
      }
   }
}
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Sim, a segunda posição já lá está. Estou a ler o diário de bordo. O método Sell foi bem sucedido, código 10009. (Bilhete #3). E depois segue-se a modificação, apenas a posição com o bilhete #2, que também é feita com sucesso.

Já escreveu, tentou tanto pela hora de abertura como por bilhete, de forma alguma, modificou a posição anterior. Por exemplo:


Isto é: Não se verifica o resultado da posição e nem sequer se quer imprimir o bilhete. Se for este o caso, anexar o código completo (anexar utilizando o botão Anexar ficheiro)

 
Vladimir Karputov:

Ou seja: Não verifica o resultado da posição e nem sequer quer imprimir o bilhete. Nesse caso, anexar o código completo (anexá-lo utilizando o botão )

Nem sequer quer imprimir o bilhete - não o percebo. Aqui está o extracto de registo.

2021.02.01 12:54:55.338 2018.01.02 17:00:00 venda no mercado 0.01 EURUSD (1.20384 / 1.20402)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 negócio #2 vender 0.01 EURUSD a 1.20384 feito (com base no pedido #2)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 negócio feito [#2 vender 0.01 EURUSD a 1.20384]

2021.02.01 12:54:55.338 2018.01.02 17:00:00 encomenda executada venda 0,01 a 1.20384 [#2 venda 0,01 EURUSD a 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 CTrade::OrderSend: venda no mercado 0,01 EURUSD [feito a 1,20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 Método Sell() completado com sucesso. Código de retorno = 10009 (feito em 1.20384)

2021.02.01 12:54:55.344 2018.01.02 17:00:00 posição modificada [#2 venda 0.01 EURUSD 1.20384 sl: 1.20813 tp: 1.20013]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 CTrade::OrderSend: modificar a posição #2 EURUSD (sl: 1.20813, tp: 1.20013) [feito]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 PositionModify() método executado com sucesso. Código de retorno = 10009 (feito).

============================================================================================================== разделил, появление второй позиции

2021.02.01 12:55:48.819 2018.01.03 09:00:00 venda no mercado 0.01 EURUSD (1.20442 / 1.20460)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 negócio #3 vender 0.01 EURUSD a 1.20442 feito (com base no pedido #3)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 negócio feito [#3 vender 0,01 EURUSD a 1.20442]

2021.02.01 12:55:48.819 2018.01.03 09:00:00 encomenda executada venda 0.01 a 1.20442 [#3 venda 0.01 EURUSD a 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 CTrade::OrderSend: venda no mercado 0.01 EURUSD [feito a 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 Método Sell() executado com sucesso. Código de retorno = 10009 (feito em 1.20442)

====================================================================================================================== após abertura com sucesso da posição, modificação, mas encomenda anterior

2021.02.01 12:55:48.821 2018.01.03 09:00:00 posição modificada [#2 venda 0.01 EURUSD 1.20384 sl: 1.20663 tp: 1.20154]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 CTrade::OrderSend: modificar a posição #2 EURUSD (sl: 1.20663, tp: 1.20154) [feito]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 PositionModify() método executado com sucesso. Código de retorno = 10009 (feito)


Afixei o código completo de modificação de posição em Sell, com opções.

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