Calcul du profit d'un ordre fermé "HELP - page 4

 
Renat Akhtyamov:

Non, cette ligne est supprimée. C'est un calcul de profit, ça ne marche pas comme ça.

Où se trouve la commande de fermeture dans le code ?

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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);
   }

et dans la condition de clôture

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

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

Le 1 ne compte pas, le 2 compte correctement, le 3 ne compte pas 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);
   }

et dans la condition de clôture

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

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

1 ne compte pas, 2 compte correctement, 3 ne compte pas 0

et c'est tout.

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

Et encore une chose.

Vos commandes sont-elles fermées selon le ticket ?

Vous devez donc vous souvenir de l'heure de début pour fermer la série plus tôt.

En d'autres termes, lorsque la décision de fermer une série vient d'être prise, il importe peu qu'elle soit effectivement fermée ou non.

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

Je comprends votre insistance, mais je vous ai donné une version fonctionnelle, avec une bonne fonction de fermeture d'une série de positions pour le trading réel, qui ne fonctionne pas dans le testeur.

Il compte et se souvient de tout, même si le terminal est redémarré.

Voici un test, il suffit de l'exécuter dans le testeur, et de comparer les résultats avec l'historique des transactions.

PS. J'ai oublié d'écrire le code - voici le correctif

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

Je comprends votre insistance, mais je vous ai donné une version fonctionnelle, avec une bonne fonction de fermeture d'une série de positions pour le trading réel, qui ne fonctionne pas dans le testeur.

Il compte et se souvient de tout, même si le terminal est redémarré.

Voici un test, il suffit de l'exécuter dans le testeur, et de comparer les résultats avec l'historique des transactions.

Comment puis-je appliquer cela à mon code ?

La valeur deLastProfitCL détermine monaction ultérieure.

 
Renat Akhtyamov:

mais autrement

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

Une dernière chose.

Vos commandes sont-elles fermées sur un ticket ?

Il faut donc se souvenir que le moment de la fermeture de la série est encore plus précoce.

En d'autres termes, lorsque la décision de fermer une série vient d'être prise, il importe peu qu'elle soit effectivement fermée ou non.

Si l'ordre est clôturé par le stop, alors{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} manquera déjà la valeur du profit.
 
Natashe4ka:

Comment puis-je appliquer cela à mon code ?

J'ai la valeurLastProfitCL quidétermine la suite de l'action.

C'est donc clair, il suffit de l'appliquer comme bon vous semble.

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

Déclarer"LastProfit" une fois et l'utiliser là où c'est nécessaire.

 
Natashe4ka:
Si l'ordre est fermé par un stop, alors{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} manquera déjà la valeur du bénéfice

Oui, il le fera.

Vous pouvez vérifier chaque tick pour voir combien d'ordres vivants restent.

Si c'est le même, vous devez vous souvenir de l'heure du tic-tac précédent.

Alors vous obtiendrez ce dont vous avez besoin.

Mais les arrêts ne se produisent généralement pas dans les automates.

 
Natashe4ka:
S'il se ferme sur un stop,{t=TempsCourant();CloseOrder(OrderTicket();}{DeleteAll();} manquera déjà la valeur de profit.

Il ne comptera que ceux qui ont été clôturés en dernier dans le temps, et ne dépend pas du montant de la clôture.

En général, la tâche n'est pas complètement claire, donc pas de discussion supplémentaire.

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

J'ai tout écrit ici, je ne comprends plus le problème :

Dossiers :
e_info.mq4  10 kb
 
Vitaly Muzichenko:

Ici, tout est exposé, je ne comprends plus la tâche :

OK, merci.
 

Ceci est également correct si "cnt" est mis à zéro, mais alors la valeur est à nouveau incompréhensible comme dans la capture d'écran 3 (devrait être une valeur de profit de 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);
   }

Raison: