Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1516

 
MakarFX

Merci pour la réponse, béquille et pas une mauvaise solution, mais en termes de mon idée, il fonctionne un peu incorrecte, parce que la balance est flottante, probablement il ne le fait pas instantanément et dans certains cas, mes ordres ont commencé à fermer avec moins pour une raison quelconque. La croissance a été telle qu'elle devait l'être, mais le drawdown avec ces moins a également augmenté. J'ai tout abandonné et j'ai décidé de fixer manuellement les limites de pullback, de sorte que je devrais les ajuster quotidiennement.

 
Порт-моне тв:

Merci pour la réponse, béquille et pas une mauvaise solution, mais en termes de mon idée, il fonctionne un peu incorrecte, parce que la balance est flottante, probablement il ne le fait pas instantanément et dans certains cas, mes ordres ont commencé à fermer avec moins pour une raison quelconque. La croissance a été telle qu'elle devait l'être, mais le drawdown avec ces moins a également augmenté. J'ai décidé d'abandonner et de fixer manuellement les limites de trading et de devoir les ajuster quotidiennement.

La fonction fonctionne correctement.

Essayez comme ceci

//+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0;
   if(AccountBalance()>0) {b = AccountBalance()-DayProfit();}
   return(b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0; datetime st=iTime(_Symbol,PERIOD_D1,0);
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol() == _Symbol)
           { 
            if(OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return(p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

et ajouter la mise à jour du solde à la fonction de clôture de l'ordre

   if(OrderClose(бла бла бла))
     {
      StartBalance(); Print("Order Close");
     }
 
Maxim Kuznetsov:

saisir le changement de jour et calculer la valeur du solde à ce moment-là.

Ce n'est pas pour rien qu'ils ont dit "trouvez le bon indicateur" - cela ne tient pas dans quelques lignes de code. C'est un algorithme assez volumineux.

attraper le changement de jour est facile, "le numéro du jour connu n'est pas égal au numéro du jour précédent", mais plus loin c'est difficile


Alg. " Calculer le solde à l'instant D(à l'exclusion des retraits/remplacements et d'un bug concernant les swaps et les commissions).

Solde: = solde du compte courant. C'est AccountBalance().

Pour tous les ordres de marché fermés dans l'historique :

si l'heure de clôture se situe entre D et le courant, Balance -= OrderProfit()+OrderSwap()+OrderCommision() ;

à l'issue de l'énumération, le solde est la valeur souhaitée...

MAIS, la commission est prélevée (c'est-à-dire qu'elle affecte la ligne de solde) à l'ouverture, et nous la prenons en compte à la clôture ; les swaps sont pris au changement de jour, et nous ne la prendrons à nouveau en compte qu'à la clôture.

et en cas de grande profondeur D, il y a une chance de ne pas obtenir tous les ordres requis dans un dépassement

 
Порт-моне тв:

Merci pour la réponse, béquille et pas une mauvaise solution, mais en termes de mon idée, il fonctionne un peu incorrecte, parce que la balance est flottante, probablement il ne le fait pas instantanément et dans certains cas, mes ordres ont commencé à fermer avec moins pour une raison quelconque. La croissance a été telle qu'elle devait l'être, mais le drawdown avec ces moins a également augmenté. J'ai abandonné et j'ai décidé de fixer manuellement les limites de trading et j'ai dû les ajuster quotidiennement.

Je suis déjà perdu dans vos suggestions et conseils, alors peut-être que mon conseil est complètement hors sujet, mais désolé...

Je comprends ce dont j'ai besoin au début de la journée pour fixer le solde et pour la journée pour compter les profits/pertes en fonction desquels je dois prendre la décision de continuer ou non le trading ...

Voici donc la décision

datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if(dayTime != iTime(_Symbol, PERIOD_D1, 0);
 {
  dayBalance = AccountInfoDouble(ACCOUNT_BALANCE));
  dayTime = iTime(_Symbol, PERIOD_D1, 0);
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

Si l'Expert Advisor doit être relancé dans la journée, vous devez envisager le calcul des profits/pertes des ordres du jour en tenant compte des swaps et des commissions et calculer le solde du début de la journée dans OnInit().

Je crois aux capacités de Makar, il peut montrer tout cela déjà dans le code...

 

Bonjour. Pouvez-vous me dire comment déterminer le numéro de la barre actuelle à partir du début de la journée ?

Comment déterminer le numéro de la barre actuelle à partir du début de la journée ?

Merci.

 
prom18:

Bonjour. Pouvez-vous me dire comment déterminer le numéro de la barre actuelle à partir du début de la journée ?

Comment déterminer le numéro de la barre actuelle à partir du début de la journée ?

Merci.

      double BarNumber=NormalizeDouble((TimeCurrent()-iTime(_Symbol,PERIOD_D1,0))/60/Period()+0.5,0);

c'est la barre actuelle, si la dernière barre est fermée, alors -0.5

 
MakarFX:

est la barre actuelle, si la dernière barre est fermée, alors -0.5

Merci. Je vais essayer.

 
MakarFX:

c'est la barre actuelle, si elle a été fermée en dernier, -0.5

il ne fonctionnera pas sur les minutes et les exotiques.

nombre de barres != nombre d'unités de comptage

les barres sont juste sautées à la fois, en 15 minutes il peut y avoir des barres de 12 minutes.

mieux vaut utiliser iBarShift()

 
Maxim Kuznetsov:

il est préférable d'utiliser la fonction native iBarShift()

Je ne sais pas comment.

 
MakarFX:

Je ne sais pas comment.

Fonction

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}