Calcolo dei profitti degli ordini chiusi "HELP - pagina 7

 
Sergey Gritsay:
e dove esiste tutto questo? lo scrivi da qualche parte in una variabile o in un array? mostrami prima dove lo memorizzi, poi potrai vedere cosa fare dopo.
Non da nessuna parte. È necessario creare il tutto con competenza e raccogliere i dati di profitto.
 
Natashe4ka:

Ok, allora scomponiamolo: c'è un tempo di chiusura degli ordini, c'è un biglietto o un numero di ordini che coincide con il tempo di chiusura. Come possiamo combinare e calcolare il profitto di questi ordini?
Sembra facile, ma ancora non lo capisco.

Finora nessuno riesce a capire quali sono evidenziati in rosso. Abbiamo bisogno dei criteri esatti per trovare questi ordini. Cercate quindi di spiegare, come si dice, sulle dita, con immagini, ecc.
 
Sergey Gritsay:
Finora nessuno riesce a capire quali sono evidenziati in rosso. Abbiamo bisogno dei criteri esatti per trovare questi ordini. Quindi cercate di spiegare, come si dice sulle dita, con immagini e così via.

?

Perché nessuno riesce a capire questo, probabilmente intendi te stesso?

Tutto è chiaro ormai da molto tempo.

La signora vuole solo fare da sola, senza ostentare i dettagli del suo programma.

 
Sergey Gritsay:
Finora nessuno riesce a capire quali sono evidenziati in rosso. Abbiamo bisogno di criteri precisi per trovare questi ordini. Per questo motivo, cercate di spiegare, come si dice sulle dita, con immagini e così via

Sì, ho già dato una condizione di lavoro al 100% e l'ho allegata come codice pronto. Dovreste anche notare che il codice usa un metodo che non è influenzato dai riavvii del terminale, e nulla sarà perso quando il terminale è acceso e continuerà a funzionare. Ma qui inventano una ruota che funzionerà solo nel tester.

Sergey, nota anche che nel codice originale di TS quando chiudi una serie di 5 posizioni, anche l'ordine nel mezzo della chiusura viene cancellato, questo a sua volta non porterà a nulla di buono nel trading reale. In generale, tutto è chiaro per tutti, tranne che per TS.

 
Credo di capire cosa vuole ottenere Natalia
//+------------------------------------------------------------------+
//|                                                   Natashe4ka.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   color ProfitColor=0;

// START //
   LastProfitCL_1(Profit,TimeCurrent(),-1);
  
   if(Profit<0)ProfitColor=clrRed;
   else if(Profit>0)ProfitColor=clrLimeGreen;
   else ProfitColor=clrDarkGray;
  
   ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
   ObjectSet("Last Profit",OBJPROP_CORNER,1);
   ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
   ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //

  }
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();

   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderCloseTime()!=timecurent)continue;
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Вариант 2                                                               |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
     {
      timecurents=OrderCloseTime();
     }
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderCloseTime()<timecurents)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
....
 

Corretta la seconda versione della funzione

bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                    datetime timecurent,// текущее время
                    int op=-1//"op" позиция (-1 любая позиция)                
                    )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()!=op && op!=-1)continue;  
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
      if(OrderCloseTime()<timecurents)continue;

      profit+=OrderProfit()+OrderCommission()+OrderSwap();
      cnt++;
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }

..........

 
Sergey Gritsay:

Corretta la seconda versione della funzione

Grazie per il vostro aiuto.
La variante 1 non funziona correttamente
La variante 2 funziona correttamente.
Anche la mia variante funziona correttamente, ma se gli ordini vengono riportati a un altro giorno o più, il valore non è chiaro Profit 190, mentre dovrebbe essere 4,27.

Vedere lo screenshot #3https://www.mql5.com/ru/forum/162930/page3

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
  datetime t=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
       if (t<OrderCloseTime()) {t=OrderCloseTime();}
       if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 
Come si scopre, il problema non è il numero di ordini, ma il trasferimento degli ordini ad un altro giorno o più.
 
Natashe4ka:
Come si scopre, il problema non è il numero di ordini, ma il trasferimento degli ordini ad un altro giorno o più.
Chiudete in serie o cosa? Qual è il trasferimento se si chiudono tutti gli ordini in un ciclo?
 
Vitalie Postolache:
Quindi chiudete in una serie o cosa? Qual è il riporto se si chiudono tutti gli ordini in un ciclo?

Gli ordini vengono chiusi per serie, ma se non ci sono le condizioni per la chiusura, gli ordini vengono raccolti per un giorno o due, ecc.
Anche se il numero di ordini influisce anche sul valore del profitto.
Se ci sono più di 3 ordini, il valore viene calcolato solo per l'ultimo ordine chiuso.

Motivazione: