Losberechnung durch Vince

 

Portiert von

Roman 14.08.2011 06:37


Hallo Leute, ich bin auf der Suche nach dem optimalen f (für die Berechnung des Losvolumens) durch die Methode des geometrischen Mittels unter Verwendung der Methode von R. Vince.

Die Aufgabe: Gehen Sie die Auftragshistorie durch und finden Sie mit einer Schrittweite f = 0,01 von 0,01 bis 1 den optimalen Wert, bei dem die TWR maximal ist.

die beiden unteren Formeln, und der Wert des größten Verlustes bei einem Handel ist bekanntlich D=-458:

welche Aufzählungszyklen, insbesondere um das optimale f zu finden und wo im Code, zusätzlich zu organisieren.

Hier ist der Anfangscode in int deinit() . Er druckt im Strategietester über den Gewinn richtig.

//+------------------------------------------------------------------+
//| 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:

Übertragen von

Machen Sie die folgenden f, um optimale f nach R. Vince zu berechnen, wie er in seinem Buch hat:

//---------переменные для расчета лота по оптимальному 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);
  }

Können Sie mir sagen, was die zweite Zeile von oben, TWR=1.#INF, im Logbuch bedeutet, nachdem Sie den EA getestet haben ?

Was ist das? - Außerhalb der Reichweite doppelt ?

Wenn dies der Fall ist, wie lässt sich dann das optimale f berechnen?

 
Roman.:

Ich habe die folgende Funktion erstellt, um das optimale f nach R. Vince, wie in seinem Buch, zu berechnen:

Können Sie mir sagen, was die zweite Zeile von oben, TWR=1.#INF, im Logbuch bedeutet, nachdem Sie den EA getestet haben ?

Was ist das? - Außerhalb der Reichweite doppelt?

Wenn ja, wie lässt sich in diesem Fall das optimale f berechnen?


3289
Rosh 26.10.2005 20:49
Und die Zahlen "1.INF", "1.IND" bedeuten entweder zu hohe Modulo-Werte oder einen undefinierten Wert vom Typ 0/0 (glaube ich).

4464
Slawa 27.10.2005 09:59
Und "1.INF", "1.IND" bedeutet entweder zu große Werte im Modul oder einen undefinierten Wert vom Typ 0/0 (glaube ich).

Ja, das ist richtig. Es handelt sich um einen Überlauf der Float-Ordnung (1.INF) und einen Überlauf der Double-Ordnung (1.IND). Sie sollten den Divisor vor der Division durch 0 überprüfen.
 

Anton Trefolev http://forum.alpari.ru/member.php?u=56027 arbeitete an optimal f, Sie können ihn fragen. Eine nicht unbekannte Person, die einmal 11000% in (soweit ich mich erinnere) 3 Monaten erhöht hat. Dann wurde ihm der Sauerstoff abgeschnitten, indem die Spanne am Nachtkreuz vergrößert wurde. Dennoch gelang es ihm, sein Konto auf über 100.000 zu bringen, woraufhin er es schließen musste.

 
Vinin:

3289
Rosh 26.10.2005 20:49
Und die Zahlen "1.INF", "1.IND" bedeuten entweder zu große Modulo-Werte oder einen undefinierten Wert wie 0/0 (glaube ich).

4464
Slawa 27.10.2005 09:59
Und die Zahlen "1.INF" und "1.IND" bedeuten entweder zu hohe Werte modulo oder einen undefinierten Wert vom Typ 0/0 (glaube ich).

Ja, genau. Es handelt sich um einen Überlauf der Float-Ordnung (1.INF) und einen Überlauf der Double-Ordnung (1.IND). Vor dem Dividieren müssen Sie den Divisor durch 0 überprüfen.


Das ist es ja - es gibt keine Division, sondern nur eine Multiplikation (mit der Formel von Vince, das ist alles).

Mit mql können wir diese Frage also nicht lösen (korrekte Berechnung der TWR), richtig?

D.h. mit ddl, matcad usw.?

 
Vinin:

3289
Rosh 26.10.2005 20:49
Und die Zahlen "1.INF", "1.IND" bedeuten entweder zu große Modulo-Werte oder einen undefinierten Wert wie 0/0 (glaube ich).

4464
Slawa 27.10.2005 09:59
Und die Zahlen "1.INF" und "1.IND" bedeuten entweder zu hohe Werte modulo oder einen undefinierten Wert vom Typ 0/0 (glaube ich).

Ja, genau. Es handelt sich um einen Überlauf der Float-Ordnung (1.INF) und einen Überlauf der Double-Ordnung (1.IND). Sie müssen den Divisor vor der Division durch 0 überprüfen.


Was passiert, wenn der Auftragspuffer (1.INF) überläuft?

Werden nachfolgende Iterationen der f-Schleife mit dem aktuellen Ergebnis unterbrochen oder wird die Schleife weiter gezählt? Ich interessiere mich nicht für den numerischen Wert der TWR, sondern für den Wert von f, den man durch Multiplikation mit der kumulativen Gesamt-TWR erhält.

In diesem Teil des Codes:

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.:


Der Punkt ist, dass es keine Division gibt, sondern nur eine Multiplikation (unter Verwendung der Formel von Vince, das ist alles).

Also kann mql dieses Problem nicht lösen (korrekte Berechnung der TWR)?

D.h. mit ddl, matcad, etc. lösen?


Auch die Multiplikation kann einen Überlauf verursachen.
 
Vinin:

Auch bei der Multiplikation kann ein Überlauf auftreten.

Ich weiß das. Aber wie berechnet man dann das optimale f mit der Methode des geometrischen Mittels? Ich habe alle Formeln geschrieben, alle korrekt im Code.
 
Roman.:

Ich weiß das. Wie kann ich dann das optimale f mit der Methode des geometrischen Mittels berechnen? Ich habe alle Formeln geschrieben, alle korrekt im Code.

Wahrscheinlich müssen wir nur über die Optimalität nachdenken. Sie können Varianten der Berechnung finden.
 

Wie wäre es, nicht TWR mit dem vorherigen Wert (TWR_Rez) zu vergleichen, sondern ihr geometrisches Mittel G und etwas G_Rez? Denn wenn die Wurzel vom Grad K von Zahl_1 größer ist als die Wurzel vom gleichen Grad K von Zahl_2, dann ist Zahl_1 größer als Zahl_2! :))))))

Und schon bei der Berechnung der Wurzel (Variable G) kommt es zu keinem Überlauf, wenn das Produkt tatsächlich in Elemente unterteilt wird (warum sich mit Teilen abmühen) und die Wurzel aus jedem Element genommen wird. Schließlich ist die Wurzel des Produkts gleich dem Produkt der Wurzeln seiner Faktoren! :)))

Dadurch erhöht sich zwar die Rechenzeit, aber es gibt keinen Überlauf und keine Probleme. Außerdem wird sich die Rechengenauigkeit spürbar verbessern.

Wenn Sie die TWR-Variable ausdrucken möchten, speichern Sie ihre Größe in einer zusätzlichen Variablen vom Typ int und verwenden Sie Print, um z. B. die TWR-Größe zu drucken: "89605994539435e+1234121". Aber brauchen Sie das?

 
Roman.:
Ich weiß das. Wie kann ich dann das optimale f mit der Methode des geometrischen Mittels berechnen? Ich habe alle Formeln direkt im Code.
Ich werde mich mit der Berechnung des geometrischen Mittels befassen müssen.