Le Système de Trading utilise deux indicateurs iStochastic (Oscillateur Stochastique) et un iRSI (Indice de Force Relative).
Idée originale — cxa, code MQL5 — barabashkakvn.
Il calcule la taille des lots en fonction de l'analyse des transactions fermées :
//+------------------------------------------------------------------+
//| Calcul de la taille de lot optimale |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int losses=0; // nombre de transactions perdantes sans interruption
//--- sélection de la taille de lot
lot=NormalizeDouble(m_account.FreeMargin()*MaximumRisk/1000.0,2);
//--- calcul du nombre d'ordres perdants sans interruption
if(DecreaseFactor>0)
{
//--- récupération de l'historique des transactions
HistorySelect(TimeCurrent()-86400,TimeCurrent()+86400);
//---
uint total=HistoryDealsTotal();
//--- pour toutes les transactions
for(uint i=0;i<total;i++)
{
if(!m_deal.SelectByIndex(i))
{
Print("Erreur dans l'historique !");
break;
}
if(m_deal.Symbol()!=Symbol() || m_deal.Entry()!=DEAL_ENTRY_OUT)
continue;
//---
if(m_deal.Profit()>0)
break;
if(m_deal.Profit()<0)
losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- retour de la taille de lot
if(lot<0.1)
lot=0.1;
return(lot);
}
//| Calcul de la taille de lot optimale |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int losses=0; // nombre de transactions perdantes sans interruption
//--- sélection de la taille de lot
lot=NormalizeDouble(m_account.FreeMargin()*MaximumRisk/1000.0,2);
//--- calcul du nombre d'ordres perdants sans interruption
if(DecreaseFactor>0)
{
//--- récupération de l'historique des transactions
HistorySelect(TimeCurrent()-86400,TimeCurrent()+86400);
//---
uint total=HistoryDealsTotal();
//--- pour toutes les transactions
for(uint i=0;i<total;i++)
{
if(!m_deal.SelectByIndex(i))
{
Print("Erreur dans l'historique !");
break;
}
if(m_deal.Symbol()!=Symbol() || m_deal.Entry()!=DEAL_ENTRY_OUT)
continue;
//---
if(m_deal.Profit()>0)
break;
if(m_deal.Profit()<0)
losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- retour de la taille de lot
if(lot<0.1)
lot=0.1;
return(lot);
}
Résultats des Backtests sur EURUSD et USDJPY :
Commentaire 0