Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 250

 

Se é simples, para verificar rapidamente, é algo parecido com isto:

   double profit = 0;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if(OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                  if(profit>max)
                    { 
                    cnt=OrdersTicket();
                    break;
                    }                  
                 }
              }
           }
        }
     }

As ordens geralmente seguem umas às outras a tempo, mas isto não é garantido. Portanto, a cronologia deve ser verificada. Mas para experiências isso servirá.

 
Aleksei Stepanenko #:

Se é simples, para verificar rapidamente, é algo parecido com isto:

As ordens geralmente seguem umas às outras a tempo, mas isto não é garantido. Portanto, a cronologia deve ser verificada. Mas isto servirá para experiências.

Concordo, o momento não é garantido. É por isso que quero passar por todas as ordens fechadas pelo bilhete. Eu conheço o bilhete de pedido e estou tentando contar a partir dele, mas algo deu errado) Qual seria o caminho certo?

 
Aleksei Stepanenko #:

Se é simples, para verificar rapidamente, é algo parecido com isto:

As ordens normalmente seguem umas às outras a tempo, mas isto não é garantido. Portanto, a cronologia deve ser verificada. Mas isto servirá para experiências.

Se olharmos através da história, seria melhor olhar através das ordens de menor para maior que fechariam no momento do recálculo, pois as ordens de mercado são consideradas de maiores para menores para que pudéssemos considerar corretamente aquelas abertas e fechadas no mesmo carrapato. Eu acho que sim)

Aleksei Stepanenko #:

Se é simples verificar rapidamente, então é algo parecido com isto:

Como regra geral, as ordens seguem umas às outras a tempo, mas isto não é garantido. Portanto, de uma boa maneira, a cronologia deve ser verificada. Mas serve para experiências.

O código do Alexey também não está correto?

 
Valeriy Yastremskiy #:

Na história, é melhor passar de menos para mais ordens para levar em conta aquelas que fecharão no momento do recálculo, são as ordens de mercado que contamos de mais para menos para contabilizar corretamente as ordens abertas e fechadas no mesmo tick. Eu acho que sim)

O código do Alexey também calcula incorretamente?

Eu não tentei. Vou tentar agora. Eu o informarei.

 
Aleksei Stepanenko #:

Se é simples, para verificar rapidamente, é algo parecido com isto:

As ordens geralmente seguem umas às outras a tempo, mas isto não é garantido. Portanto, a cronologia deve ser verificada. Mas serve para experiências.

Verifiquei e recebi muitos erros durante a compilação, corrigi todos eles, exceto :

if(profit>max)

Esta linha, eu não a entendo muito bem. Você pode explicar isso?

 
makssub #:
A idéia é mudar o bilhete depois de atingir um certo lucro

O máximo é o limite do lucro após o qual o bilhete muda. O valor é estabelecido por você.

 
Aleksei Stepanenko #:

O máximo é o limite do lucro após o qual o bilhete muda. Seu valor é estabelecido por você.

O problema é diferente, se eu o entendi corretamente. Há 1, 2 e 3 pedidos. Não sei como são formados os preços abertos. A ordem 3 está fechada, o lucro total é igual ao lucro da ordem 3. Isto é, precisamos calcular o bilhete para o pedido aberto antes do pedido 3 . Em seguida, o pedido 2 é fechado. Devemos encontrar o bilhete do pedido aberto antes do pedido 2. O lucro total é igual ao lucro dos pedidos 2 e 3.

Não entendo por que, mas parece ser a lógica).

 
Valery, eu não entendo totalmente a lógica dessas duas frases.
 
Aleksei Stepanenko #:
Valery, eu não entendia totalmente a lógica dessas duas frases.

Fórum sobre Comércio, Sistemas Automatizados de Comércio e Testes de Estratégia

FAQ de Iniciantes MQL4 MT4 MetaTrader 4

makssub, 2021.09.01 16:38

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   
   
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return(tick); 
   }              
int TickF = FindTicket();
int CalculateProfitHistory() 
{
  double _point;
  int    i, _ototal = OrdersHistoryTotal(), _profit=0;
  for   (i = 0; i < OrdersHistoryTotal(); i++) 
  {
    if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
      if (OrderSymbol() == Symbol())
      {
        if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0) 
           {
              if (StringFind(OrderSymbol(), "") < 0) 
                 _point = 0.0001; 
              else _point = 0.01;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
  return(_profit);
}

Eu deveria usar a primeira função para encontrar o ticket de pedido requerido e a segunda função deveria calcular o lucro de todos os pedidos fechados após aquele ticket. Não estou interessado no lucro dos anteriores a isso. Mas o segundo não o calcula corretamente. Quando uma ordem é aberta, estas 2 funções são chamadas e, portanto, deve ser igual a 0, mas não é.
O PS seguiu seu conselho, desistiu de arrays)
12ª caixa acima)


 

Pensei em tudo e o fiz meu com base em suas dicas)

A tarefa era cobrir uma ordem perdida com outras ordens com lucro.

Nós o implementamos. Memorizamos o bilhete do pedido aberto após o perdido; este foi o nosso ponto de relatório. Após este ponto, começamos a calcular o lucro da ordem deficitária e o lucro das ordens fechadas após a mesma. Deixe-me lembrar que o primeiro pedido é aberto e nós o fechamos quando ele atinge um lucro.

se ( (CalculateProfitHistory() + FirstProfit() >= Lucro)

{

CloseFirst();

Imprimir ("Fechar o primeiro pedido perdido");

}


double CalculateProfitHistory() 
{
   double profit = 0;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderMagicNumber() == Magic )
               {
                  if (Ticket !=0)
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return(profit);
}
Razão: