Calcolo dei profitti degli ordini chiusi "HELP - pagina 4

 
Renat Akhtyamov:

No, questa linea viene rimossa. Questo è un calcolo del profitto, non funziona così.

Dove si trova il comando di chiusura nel codice - c'è

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

e nella condizione di chiusura

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 non conta, 2 conta correttamente, 3 non conta 0.

 
Natashe4ka:
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

e nella condizione di chiusura

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 non conta, 2 conta correttamente, 3 non conta 0

e questo è tutto.

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

E un'altra cosa.

I vostri ordini sono chiusi secondo il biglietto?

Quindi è necessario ricordare l'ora di inizio per chiudere prima la serie

Cioè, quando una decisione di chiudere una serie è stata appena formata, non importa se effettivamente si chiuderà o meno

 
Natashe4ka:
//+----------------------------------------------------------------------------+

Capisco la tua insistenza, ma ti ho dato una versione funzionante, con una buona funzione di chiusura di una serie di posizioni per il trading reale, non funzionante nel tester.

Conta e ricorda tutto, anche se il terminale viene riavviato.

Ecco un test, basta eseguirlo nel tester, e confrontare i risultati con la storia delle transazioni

PS. Ho dimenticato di scrivere il codice - ecco la correzione

File:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

Capisco la tua insistenza, ma ti ho dato una versione funzionante, con una buona funzione di chiusura di una serie di posizioni per il trading reale, non funzionante nel tester.

Conta e ricorda tutto, anche se il terminale viene riavviato.

Ecco un test, basta eseguirlo nel tester, e confrontare i risultati con la storia delle transazioni

Come posso applicare questo al mio codice?

Il valore diLastProfitCL determina la miaulteriore azione

 
Renat Akhtyamov:

ma per il resto

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

Un'altra cosa.

I vostri ordini si chiudono su un biglietto?

Quindi è necessario ricordare il tempo della chiusura della serie anche prima

Cioè, quando una decisione di chiudere una serie è stata appena formata, non importa se effettivamente si chiuderà o meno

Se l'ordine è chiuso dallo stop, allora{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} mancherà già il valore del profitto
 
Natashe4ka:

Come posso applicare questo al mio codice?

Ho il valoreLastProfitCL chedetermina ulteriori azioni

Quindi è chiaro, basta applicarlo come meglio si crede.

  double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit")));
  
  Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );

Dichiarare"LastProfit" una volta e usarlo dove necessario

 
Natashe4ka:
Se l'ordine è chiuso da uno stop, allora{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} mancherà già il valore del profitto

Sì, lo farà.

Puoi controllare ogni tick per vedere quanti ordini live sono rimasti.

Se è lo stesso, allora dovresti ricordare l'ora del tick precedente.

Allora otterrete ciò di cui avete bisogno.

Ma gli arresti di solito non avvengono negli automi

 
Natashe4ka:
Se chiude su uno stop,{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} mancherà già il valore del profitto

Conta solo quelli chiusi per ultimi nel tempo, e non dipende dall'importo di chiusura.

In generale, il compito non è completamente chiaro, quindi non ci sono altre discussioni.

//---------------------------------------------------------

Qui vedi la descrizione, non capisco più il problema:

File:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

Qui è tutto disposto, non capisco più il compito:

OK, grazie.
 

Questo è anche corretto se "cnt" è impostato a zero, ma allora il valore è di nuovo incomprensibile come nello screenshot 3 (dovrebbe essere un valore di profitto di 4,27)

double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  int cnt=0;
  double LastProfit=0;
   for(i=0;i<OrdersHistoryTotal();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 ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
       }
  return(LastProfit);
   }

Motivazione: