Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 250

 

Se è semplice, da controllare rapidamente, è qualcosa del genere:

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

Gli ordini di solito si susseguono nel tempo, ma questo non è garantito. Pertanto, la cronologia dovrebbe essere controllata. Ma per gli esperimenti questo andrà bene.

 
Aleksei Stepanenko #:

Se è semplice, da controllare rapidamente, è qualcosa del genere:

Gli ordini di solito si susseguono nel tempo, ma questo non è garantito. Pertanto, la cronologia dovrebbe essere controllata. Ma questo andrà bene per gli esperimenti.

Sono d'accordo, i tempi non sono garantiti. È per questo che voglio esaminare tutti gli ordini chiusi in base al biglietto. Conosco il biglietto d'ordine e sto cercando di contare da esso, ma qualcosa è andato storto) Quale sarebbe il modo giusto?

 
Aleksei Stepanenko #:

Se è semplice, da controllare rapidamente, è qualcosa del genere:

Gli ordini di solito si susseguono nel tempo, ma questo non è garantito. Pertanto, la cronologia dovrebbe essere controllata. Ma questo andrà bene per gli esperimenti.

Se guardiamo la cronologia, sarebbe meglio guardare gli ordini da quelli più piccoli a quelli più grandi che si chiudono al momento del ricalcolo, poiché gli ordini di mercato sono considerati da quelli più grandi a quelli più piccoli, in modo da poter considerare correttamente quelli aperti e chiusi nello stesso tick. Penso di sì)

Aleksei Stepanenko #:

Se è semplice da controllare rapidamente, allora è qualcosa del genere:

Come regola generale, gli ordini si susseguono nel tempo, ma questo non è garantito. Perciò, in un buon modo, la cronologia dovrebbe essere controllata. Ma andrà bene per gli esperimenti.

Anche il codice di Alexey non è corretto?

 
Valeriy Yastremskiy #:

Nella storia è meglio andare da meno a più ordini per tenere conto di quelli che si chiuderanno al momento del ricalcolo, sono gli ordini di mercato che contiamo da più a meno per tenere conto correttamente di aperti e chiusi nello stesso tick. Penso di sì)

Anche il codice di Alexey calcola in modo errato?

Non l'ho provato. Lo proverò ora. Vi farò sapere.

 
Aleksei Stepanenko #:

Se è semplice, da controllare rapidamente, è qualcosa del genere:

Gli ordini di solito si susseguono nel tempo, ma questo non è garantito. Pertanto, la cronologia dovrebbe essere controllata. Ma andrà bene per gli esperimenti.

L'ho controllato e ho avuto un sacco di errori durante la compilazione, li ho risolti tutti, tranne il :

if(profit>max)

Questa linea non la capisco bene. Può spiegarlo?

 
makssub #:
L'idea è di cambiare il biglietto dopo aver raggiunto un certo profitto

Il max è il limite del profitto dopo il quale il biglietto cambia. Il valore è impostato da voi.

 
Aleksei Stepanenko #:

Il max è il limite del profitto dopo il quale il biglietto cambia. Il suo valore è impostato da voi.

Il problema è diverso, se ho capito bene. Ci sono 1, 2 e 3 ordini. Non so come si formano i prezzi aperti. L'ordine 3 è chiuso, il profitto totale è uguale al profitto dell'ordine 3. Cioè dobbiamo calcolare il biglietto per l'ordine aperto prima dell'ordine 3. Allora l'ordine 2 è chiuso. Dovremmo trovare il biglietto dell'ordine aperto prima dell'ordine 2. Il profitto totale è uguale al profitto degli ordini 2 e 3.

Non capisco perché, ma sembra essere la logica).

 
Valery, non capisco bene la logica di queste due frasi.
 
Aleksei Stepanenko #:
Valery, non ho capito bene la logica di queste due frasi.

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ da principianti 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);
}

Dovrei usare la prima funzione per trovare il ticket d'ordine richiesto e la seconda funzione dovrebbe calcolare il profitto di tutti gli ordini chiusi che seguono quel ticket. Non mi interessa il profitto di quelli precedenti. Ma il secondo non lo calcola correttamente. Quando un ordine viene aperto queste 2 funzioni vengono chiamate e quindi dovrebbe essere uguale a 0, ma non lo è.
PS ha seguito il tuo consiglio, rinunciando agli array)
12° box sopra)


 

Ho pensato a tutto e l'ho fatto mio in base ai vostri consigli)

Il compito era quello di coprire un ordine perdente con altri ordini in profitto.

Lo abbiamo implementato. Abbiamo memorizzato il biglietto dell'ordine aperto dopo quello perdente; questo era il nostro punto di segnalazione. Dopo questo punto, iniziamo a calcolare il profitto dell'ordine in perdita e il profitto degli ordini chiusi dopo di esso. Vi ricordo che il primo ordine è aperto e lo chiudiamo quando raggiunge un profitto.

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

{

CloseFirst();

Stampa ("Chiudere il primo ordine perdente");

}


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