Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1679

 
Maxim Kuznetsov #:

è uno scherzo?

Ce l'hai in bianco e nero per(;;)

Beh, sì, ma c'è un modo per uscirne: quando la magia non è uguale alla magia dell'ordine.
 
Nerd Trader #:
Ebbene sì, solo che c'è un modo per uscirne: quando la magia non è uguale alla magia dell'ordine.

Prova questo

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 ordine attualmente selezionato.

E se c'è una griglia di ordini?

Qualcuno ha una funzione per calcolare la somma di tutti gli swap di una griglia di ordini per un ordine magico e uno strumento finanziario.

Grazie per l'aiuto!!!

A cosa ti serve?
 
MakarFX #:
A cosa ti serve?

Quando si chiude una grande griglia di ordini con una lunga durata della griglia, gli scambi di ordini mangiano i profitti e distorcono molto il risultato.

Voglio compensare la perdita sugli swap con questa funzione.

 
EVGENII SHELIPOV #:

Quando si chiude una grande griglia di ordini con una lunga durata della griglia, gli scambi di ordini mangiano i profitti e distorcono molto il risultato.

Voglio compensare la perdita sugli swap con questa funzione.

La rete è chiusa in profitto o in pareggio?
 
MakarFX #:

Prova questo

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);
}
Questo ha risolto il problema, avevo if (order.cmd == OP_SELLSTOP || OP_BUYSTOP) solo che il problema non era risolto.
Ma ho bisogno che passi attraverso tutti gli ordini. Il mago stesso è impostato quando viene creato solo il tappo. Non possiamo capire che il tappo è creato da OrderType() perché non c'è ancora stato; abbiamo un record preliminare del tipo di ordine in order.cmd per quello. E qui abbiamo bisogno di due cicli: uno annidato nell'altro, in modo che un'iterazione della variabile magic sia controllata con tutti gli ordini di OrdersTotal(). Ho tutto implementato, solo che c'è un loop infinito, non so perché ...
 
MakarFX #:
La griglia è chiusa a profitto o a pareggio?

Sì, a un certo livello di drawdown, c'è una perdita a zero e a nessuna perdita c'è una brutta perdita dovuta agli swap

 
Nerd Trader #:
Questo va bene, avevo if (order.cmd == OP_SELLSTOP || OP_BUYSTOP)
Ma ho bisogno che tutti gli ordini vengano passati. Il mago stesso è impostato quando viene creato solo il tappo. Non possiamo sapere che il tappo è creato da OrderType() poiché non c'è ancora stato, dobbiamo scrivere prima il tipo di ordine in order.cmd. E qui abbiamo bisogno di due cicli: uno annidato nell'altro, in modo che un'iterazione della variabile magica sia controllata con tutti gli ordini da OrdersTotal()
Mostrami dove usi 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;
}


Nel commento si dice che manda il majic all'array di scrittura, quindi non fatevi ingannare da questo, purché il majic torni al retorn.
 
EVGENII SHELIPOV #:

Sì, a un certo livello di drawdown, c'è una perdita a zero e a nessuna perdita c'è una brutta perdita dovuta agli swap

   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);
     }