Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
et où est-ce que tout cela existe ? est-ce que vous l'écrivez quelque part dans une variable ou un tableau ? montrez-moi d'abord où vous le stockez, ensuite vous pourrez voir ce qu'il faut faire ensuite.
OK, alors décomposons : il y a une heure de clôture des ordres, il y a un ticket ou un nombre d'ordres qui coïncident avec l'heure de clôture. Comment combiner et calculer le bénéfice de ces commandes?
Cela semble facile, mais je ne le comprends toujours pas.
Jusqu'à présent, personne n'a réussi à trouver ceux qui sont surlignés en rouge. Nous avons besoin des critères exacts pour trouver ces commandes. Essayez donc d'expliquer, comme on dit sur les doigts, avec des images et ainsi de suite.
?
Pourquoi personne ne peut comprendre cela, vous voulez probablement dire vous-même ?
Tout est clair depuis longtemps maintenant.
Madame veut juste le faire par elle-même, sans étaler les détails de son programme.
Jusqu'à présent, personne n'a pu comprendre quels sont ceux qui sont surlignés en rouge. Nous avons besoin de critères précis pour trouver ces commandes. Pour cette raison, essayez d'expliquer, comme on dit sur les doigts, avec des images, etc.
Oui, j'ai déjà donné une condition de fonctionnement à 100% et je l'ai jointe en tant que code prêt à l'emploi. Il faut également noter que le code utilise une méthode qui n'est pas affectée par les redémarrages du terminal, et rien ne sera perdu lorsque le terminal sera rallumé et continuera à fonctionner. Mais ici, ils inventent une roue qui ne fonctionnera que dans le testeur.
Sergey, notez également que dans le code TS original, lorsque vous fermez une série de 5 positions, l'ordre au milieu de la fermeture est également supprimé, ce qui ne mènera à rien de bon dans le trading réel. En général, tout est clair pour tout le monde, sauf pour le TS.
//| 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);
}
//+------------------------------------------------------------------+
Correction de la deuxième version de la fonction
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);
}
..........
Correction de la deuxième version de la fonction
Merci pour votre aide.
La variante 1 ne fonctionne pas correctement
La variante 2 fonctionne correctement.
Ma variante fonctionne également correctement, mais si les ordres sont reportés à un autre jour ou plus, la valeur n'est pas claire Profit 190, alors qu'elle devrait être 4,27.
Voir la capture d'écran n°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);
}
Il s'avère que le problème n'est pas le nombre de commandes mais le transfert des commandes à un autre jour ou plus.
Alors vous fermez dans une série ou quoi ? Quel est le report si vous fermez tous les ordres en un seul cycle ?
Les ordres sont clôturés par série, mais s'il n'y a pas de conditions de clôture, les ordres sont rassemblés pour un jour ou deux, etc.
Cependant, le nombre de commandes affecte également la valeur du bénéfice.
S'il y a plus de 3 ordres, la valeur est calculée pour le dernier ordre clôturé uniquement.