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

 
Maxim Kuznetsov #:

isto é uma piada?

Você o tem em preto e branco para(;;)

Bem, sim, mas há uma saída: quando a magia não se iguala à magia da ordem.
 
Nerd Trader #:
Bem, sim, só há uma saída: quando a magia não se iguala à magia da ordem.

Tente isto

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
 
EVGENII SHELIPOV ordem atualmente selecionada?

E se houver uma grade de ordens?

Alguém tem uma função para calcular a soma de todas as trocas de uma grade de ordens por uma ordem mágica e um instrumento financeiro?

Obrigado pela ajuda!!!

Para que você precisa dele?
 
MakarFX #:
Para que você precisa dele?

Ao fechar uma grande grade de pedidos com uma longa vida útil, as trocas de pedidos se transformam em lucros e distorcem muito o resultado.

Quero compensar a perda em swaps com esta função.

 
EVGENII SHELIPOV #:

Ao fechar uma grande grade de pedidos com uma longa vida útil, as trocas de pedidos se transformam em lucros e distorcem muito o resultado.

Quero compensar a perda em swaps com esta função.

A grade está fechada com lucro ou com o breakeven?
 
MakarFX #:

Tente isto

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
Isso o resolveu, eu tinha se (order.cmd == OP_SELLSTOP || OP_BUYSTOP) apenas o problema não foi resolvido.
Mas preciso que ele passe por todas as ordens. O mago em si é definido quando apenas a rolha é criada. Não podemos entender que a rolha é criada pelo OrderType() porque ainda não foi criada; temos um registro preliminar do tipo de pedido em ordem.cmd para isso. E aqui precisamos de dois loops: um aninhado no outro, para que uma iteração da magia variável seja verificada com todas as ordens da OrderTotal(). Tenho tudo isso implementado, só que há um loop infinito, não sei por que ...
 
MakarFX #:
A grade está fechada com lucro ou com o breakeven?

Sim, a um certo nível de drawdown, há uma perda a zero e a nenhuma perda há uma perda feia devido a swaps

 
Nerd Trader #:
Tudo bem, eu tinha if (order.cmd == OP_SELLSTOP || OP_BUYSTOP)
Mas eu preciso que todas as ordens sejam aprovadas. O mago em si é definido quando apenas a rolha é criada. Não podemos saber que a rolha é criada por OrderType() já que ainda não foi criada, precisamos escrever o tipo de pedido em order.cmd com antecedência. E aqui precisamos de dois loops: um aninhado no outro, para que uma iteração da variável mágica seja verificada com todas as ordens de OrderTotal()
Mostre-me onde você usa GetMagic(...)
 
void OpenOrder(int db = -1){

  if(db == -1){
    Print("'db' должен иметь корректное значение");
    return;
  }

  Order order;

  //Если бид в границах ДБ (его хай/лоу) то инициализируем ордер для селстопа или байстопа
  if(Bid > db_last.low && Bid < db_last.hight){
    if(db == BEAR) order.InitForSell(SELLSTOP);
    if(db == BULL) order.InitForBuy(BUYSTOP);
  }

 ...

  if(order.is_init == true)
  {
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 10, 
    order.sl_price, order.tp_price, "", GetMagic(order), 0, order.arrow_color);

    if(order_send == -1){
      Print(order.error_text," | ",GetLastError()," db_last.third ",db_last.third,
        " | db_last.size_open_to_low ",db_last.size_open_to_low," | order.sl_price: ",
        order.sl_price," | order.cmd ",order.cmd);
      ResetLastError();
      return;
    }
  }
}

...

int GetMagic(Order &order)
{
  int magic = 0;
  //Если должен быть открыт стопордер и если есть уже открытые или отложенные 
  //ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать 
  //для нашего ордера уникальный маджик и отправить его на запись в массив
  if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
    if(OrdersTotal() >= 1)
      for(;;){
        magic++;
        for(int i = OrdersTotal(); i > 0 ; i --)
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) != false)
            if(magic != OrderMagicNumber())
              return magic;
            
      }
    //Если нет открытых или отложенных ордеров то увеличиваем значение 
    //маджика, чтобы он равнялся единице и отправляем на запись в массив
    else if (OrdersTotal() == 0)
      return (magic + 1);
  return magic;
}


Diz no comentário que envia o majic para a matriz de escrita, portanto não se deixe enganar por isso, desde que o majic volte para o retorno.
 
EVGENII SHELIPOV #:

Sim, a um certo nível de drawdown, há uma perda a zero e a nenhuma perda há uma perda feia devido a swaps

   double GetOrderSwap()
     {
      double order_swap = 0;
      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)
                 {
                  order_swap += OrderSwap();
                 }
              }
           }
        }
      return(order_swap);
     }