Calcul du lot par Vince

 

Porté par

Romain 14.08.2011 06:37


Les gars, s'il vous plaît conseillez, je suis actuellement à la recherche de f optimal (pour le calcul du volume de lot) par la méthode de la moyenne géométrique en utilisant la méthode de R.Vince.

La tâche : parcourir l'historique des commandes et, avec un incrément f = 0,01 de 0,01 à 1, trouver sa valeur optimale où le TWR est maximal.

les deux formules du bas, et on sait que la valeur de la plus grosse perte sur une transaction est D=-458:

quels cycles d'énumération, en particulier pour trouver le f optimal et où dans le code, en plus, pour organiser.

Voici le code de départ dans int deinit() . Il imprime dans strategy tester sur le profit correctement.

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//--- Расчет оптимального f ---

   double SUMM, MUL, HPR, TWR, G;   
   double D=-458;
   int orderIndex;
   for (orderIndex = (OrdersHistoryTotal() - 1); orderIndex >= 0; orderIndex--)
   {   
      if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY))
      {
         Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
         continue;
      }
   
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic) || (OrderCloseTime()==0))
      {
         continue;
      }  
     
         int lastType = OrderType();
         double lastLots = OrderLots();
         double lastProfit = OrderProfit() + OrderSwap(); 
         SUMM=SUMM+lastProfit;    
    }           
    
  Print("Профит = ", SUMM);  
  
  return(0);
  }

 
Vinin:

Transféré de

J'ai fait le f suivant, pour calculer le f optimal selon R. Vince, comme il l'a fait dans son livre :

//---------переменные для расчета лота по оптимальному f Ральфа Винса
int Mas_Outcome_of_transactions [10000]; // Массив профитов/убытков закрытых позиций
extern double D = -628;                  // максимальный убыток по сделке

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  if(Monitor==true)
    {
    for(int a=0;a<=3;a++)
      {
      string N=DoubleToStr(a,0);
      ObjectDelete(N);
      } 
    }
//----
//--- Расчет оптимального f ---
   int Qnt=0;                                          // Счётчик количества ордеров   
   ArrayInitialize(Mas_Outcome_of_transactions,0);     // Обнуление массива
   double f=0.01, SUMM, MUL, HPR, TWR_Rez=0, TWR=1.0, G;
   int orderIndex;
   for (orderIndex = 0; orderIndex<OrdersHistoryTotal(); orderIndex++)
   {   
      if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY))
      {
         Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
         continue;
      }
   
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic) || (OrderCloseTime()==0))
      {
         continue;
      }  
         Qnt++;                               // увеличиваем счетчик закрытых ордеров
         int lastType = OrderType();
         double lastLots = OrderLots();
         double lastProfit = OrderProfit() + OrderSwap(); 
        
         Mas_Outcome_of_transactions[Qnt] = lastProfit; // Заполняем массив профитом/лоссом по всем закрытым позициям 
         SUMM=SUMM+lastProfit;    
         //TWR = TWR*(1+f*(-lastProfit/(D)));
    }           
 //  Print("Закрытых позиций = ", Qnt, " Профит/лосс = ", SUMM);  
 
   for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально
     {  
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам
            {                                                // и считаем относительный конечный капитал (TWR)
             TWR = TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // TWR - это произведение всех HPR
             //if (TWR>TWR_Rez) {TWR_Rez = TWR; Print(" TWR = ",TWR_Rez, " при f = ", f);}  
             //   else break;       
            }
          if (TWR>TWR_Rez) {
              TWR_Rez = TWR;
              G=MathPow (TWR_Rez, 0.001988); // 1/503 сделки по данной торговой системе, как в книжке: в степени 1/N 
              Print(" TWR = ",TWR_Rez," G = ",G, " при f = ", f);} // если текущий TWR > результирующего, 
              else break;    // то результирующий делаем равным текущему, иначе переходим на след итерацию цикла по f                                  
      }      
             
   Print("Закрытых позиций = ", Qnt, " Нетто Профит/лосс = ", SUMM, " У последней ",Qnt, " закрытой позы профит/лосс = ", 
        Mas_Outcome_of_transactions[Qnt]);     
  
  return(0);
  }

Pouvez-vous me dire ce que signifie la deuxième ligne en partant du haut, TWR=1.#INF, dans le journal de bord, après avoir testé l'EA ?

Qu'est-ce que c'est ? - Double hors de portée ?

Si c'est le cas, comment calculer le f optimal ?

 
Roman.:

J'ai créé la fonction suivante, pour calculer le f optimal selon R. Vince, comme dans son livre :

Pouvez-vous me dire ce que signifie la deuxième ligne en partant du haut, TWR=1.#INF, dans le journal de bord, après avoir testé l'EA ?

Qu'est-ce que c'est ? - Double hors de portée ?

Si oui, dans ce cas, comment calculer le f optimal ?


3289
Rosh 26.10.2005 20:49
Et les chiffres "1.INF", "1.IND" signifient soit des valeurs modulo trop élevées, soit une valeur indéfinie de type 0/0 (je le pense).

4464
Slawa 27.10.2005 09:59
Et "1.INF", "1.IND" signifie soit des valeurs trop importantes dans le module, soit une valeur indéfinie de type 0/0 (je le pense).

oui, c'est exact. c'est un dépassement de l'ordre des flottants (1.INF) et un dépassement de l'ordre des doubles (1.IND). vous devriez vérifier le diviseur par 0 avant de diviser
 

Anton Trefolev http://forum.alpari.ru/member.php?u=56027 a travaillé sur le f optimal, vous pouvez lui demander. Une personne non inconnue qui a une fois augmenté de 11000% en (autant que je m'en souvienne) 3 mois. Puis on lui a coupé l'oxygène en élargissant l'écart sur la croix de nuit. Il a néanmoins réussi à faire passer son compte à plus de 100 000, après quoi il a dû le fermer.

 
Vinin:

3289
Rosh 26.10.2005 20:49
Et les nombres "1.INF", "1.IND" signifient soit des valeurs modulo trop grandes, soit une valeur indéfinie comme 0/0 (je pense).

4464
Slawa 27.10.2005 09:59
Et les nombres "1.INF" et "1.IND" signifient soit des valeurs trop élevées modulo, soit une valeur indéfinie de type 0/0 (je le pense).

oui, exactement. il s'agit d'un dépassement d'ordre flottant (1.INF) et d'un dépassement d'ordre double (1.IND). avant de diviser, il faut vérifier le diviseur par 0


Le problème, c'est qu'il n'y a pas de division, mais une multiplication (en utilisant la formule de Vince, c'est tout).

Donc, en utilisant mql, nous ne pouvons pas résoudre cette question (calcul correct du TWR), n'est-ce pas ?

C'est-à-dire en utilisant ddl, matcad, etc. ?

 
Vinin:

3289
Rosh 26.10.2005 20:49
Et les nombres "1.INF", "1.IND" signifient soit des valeurs modulo trop grandes, soit une valeur indéfinie comme 0/0 (je pense).

4464
Slawa 27.10.2005 09:59
Et les chiffres "1.INF" et "1.IND" signifient soit des valeurs modulo trop élevées, soit une valeur indéfinie de type 0/0 (je le pense).

oui, exactement. il s'agit d'un dépassement d'ordre flottant (1.INF) et d'un dépassement d'ordre double (1.IND). vous devez vérifier le diviseur par 0 avant de diviser


Que se passe-t-il lorsque le flottant de commande (1.INF) déborde ?

Les itérations suivantes de la boucle f sont-elles interrompues avec le résultat actuel ou la boucle continue-t-elle à compter ? Je ne suis pas intéressé par la valeur numérique de la RTT, je suis intéressé par la valeur de f obtenue par multiplication avec la RTT totale cumulée.

Dans ce morceau de code :

for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально
     {  
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам
            {                                                // и считаем относительный конечный капитал (TWR)
             TWR = TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // TWR - это произведение всех HPR                
            }
          if (TWR>TWR_Rez) {
              TWR_Rez = TWR;
              G=MathPow (TWR_Rez, 0.001988); // 1/503 сделки по данной торговой системе, как в книжке: в степени 1/N 
              Print(" TWR = ",TWR_Rez," G = ",G, " при f = ", f);} // если текущий TWR > результирующего, 
              else break;    // то результирующий делаем равным текущему, иначе переходим на след итерацию цикла по f                                  
      }      
 
Roman.:


Le fait est qu'il n'y a pas de division, juste une multiplication (en utilisant la formule de Vince, c'est tout).

Donc mql ne peut pas résoudre ce problème (calcul correct du TWR) ?

C'est-à-dire résoudre avec ddl, matcad, etc ?


La multiplication peut également provoquer un débordement.
 
Vinin:

Vous pouvez également obtenir un débordement lors d'une multiplication.

Je le sais. Mais alors comment calculer le f optimal en utilisant sa méthode de moyenne géométrique? J'ai écrit toutes les formules, toutes correctement dans le code.
 
Roman.:

Je le sais. Alors comment puis-je calculer le f optimal en utilisant la méthode de la moyenne géométrique ? J'ai écrit toutes les formules, toutes correctement dans le code.

Il faut probablement juste penser à l'optimalité. Vous pouvez trouver des variantes de calcul.
 

Que diriez-vous de comparer non pas les TWR avec la valeur précédente (TWR_Rez), mais de comparer leur moyenne géométrique G et un certain G_Rez ? Après tout, si la racine de degré K du nombre_1 est supérieure à la racine du même degré K du nombre_2, alors le nombre_1 est supérieur au nombre_2! :))))))

Et déjà en calculant la racine (variable G) il n'y aura pas de débordement, si le produit est effectivement divisé en éléments (pourquoi s'embêter avec les parties) et prendre la racine de chaque élément. Après tout, la racine du produit est égale au produit des racines de ses facteurs! :)))

Cela augmentera le temps de calcul, mais il n'y aura pas de débordement et pas de problème avec cela. En outre, la précision des calculs sera sensiblement améliorée.

Si vous voulez imprimer la variable TWR, stockez sa taille dans une variable supplémentaire de type int, et utilisez Print pour imprimer la taille du TWR, par exemple : "89605994539435e+1234121". Mais en avez-vous besoin ?

 
Roman.:
Je le sais. Comment puis-je alors calculer le f optimal en utilisant la méthode de la moyenne géométrique ? J'ai toutes les formules dans le code.
Je vais devoir jouer avec le calcul de la moyenne géométrique.