Cálculo del lote por Vince

 

Portado de

Roman 14.08.2011 06:37


Chicos, por favor, aconsejadme, actualmente estoy buscando la f óptima (para el cálculo del volumen del lote) por el método de la media geométrica utilizando el método de R.Vince.

La tarea: recorrer el historial de pedidos y con el incremento f = 0,01 de 0,01 a 1, encontrar su valor óptimo donde la TWR sea máxima.

las dos fórmulas inferiores, y se sabe que el valor de la mayor pérdida en una operación es D=-458:

qué ciclos de enumeración, en particular para encontrar la f óptima y en qué parte del código, además, organizar.

Este es el código inicial en int deinit() . Imprime en el probador de estrategias sobre el beneficio correctamente.

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

Transferido de

Hecha la siguiente f, para calcular la f óptima según R. Vince, como tiene en su libro:

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

¿Puedes decirme qué significa la segunda línea desde arriba, TWR=1.#INF, en el libro de registro, después de probar el EA ?

¿Qué es? - ¿Fuera de rango doble?

Si es así, ¿cómo calcular la f óptima?

 
Roman.:

He hecho la siguiente función, para calcular la f óptima según R. Vince, como en su libro:

¿Puedes decirme qué significa la segunda línea desde arriba, TWR=1.#INF, en el registro, después de que el EA haya sido probado ?

¿Qué es? - ¿Doble fuera de rango?

Si es así, en ese caso, ¿cómo calcular la f óptima?


3289
Rosh 26.10.2005 20:49
Y los números "1.INF", "1.IND" significan valores demasiado altos en el módulo o un valor indefinido de tipo 0/0 (creo que sí).

4464
Slawa 27.10.2005 09:59
Y "1.INF", "1.IND" significan valores demasiado grandes en el módulo o un valor indefinido de tipo 0/0 (creo que sí).

sí, es cierto. se trata de un desbordamiento de orden float (1.INF) y de un desbordamiento de orden double (1.IND). debería comprobar el divisor por 0 antes de dividir
 

Anton Trefolev http://forum.alpari.ru/member.php?u=56027 trabajó en la f óptima, puedes preguntarle. Una persona no desconocida que una vez subió un 11000% en (que yo recuerde) 3 meses. Entonces se le cortó el oxígeno ampliando la extensión de la cruz nocturna. No obstante, consiguió que su cuenta superara los 100.000 euros, tras lo cual tuvo que cerrarla.

 
Vinin:

3289
Rosh 26.10.2005 20:49
Y los números "1.INF", "1.IND" significan valores demasiado grandes en el módulo, o un valor indefinido como 0/0 (eso creo).

4464
Slawa 27.10.2005 09:59
Y los números "1.INF" y "1.IND" significan o bien valores demasiado altos módulo o valor indefinido de tipo 0/0 (creo que sí).

sí, exactamente. se trata de un desbordamiento de orden flotante (1.INF) y de un desbordamiento de orden doble (1.IND). antes de dividir, hay que comprobar el divisor por 0


Esa es la cuestión: no hay división, sólo multiplicación (usando la fórmula de Vince, eso es todo).

Por lo tanto, utilizando mql, no podemos resolver esta cuestión (cálculo correcto de TWR), ¿verdad?

¿Por ejemplo, utilizando ddl, matcad, etc.?

 
Vinin:

3289
Rosh 26.10.2005 20:49
Y los números "1.INF", "1.IND" significan valores demasiado grandes en el módulo, o un valor indefinido como 0/0 (eso creo).

4464
Slawa 27.10.2005 09:59
Y los números "1.INF" y "1.IND" significan o bien valores demasiado altos módulo o valor indefinido de tipo 0/0 (creo que sí).

sí, exactamente. se trata de un desbordamiento de orden flotante (1.INF) y de un desbordamiento de orden doble (1.IND). hay que comprobar el divisor por 0 antes de dividir


¿Qué ocurre cuando se desborda el flotador de la orden (1.INF)?

¿Las siguientes iteraciones del bucle f se interrumpen con el resultado actual o el bucle sigue contando? No me interesa el valor numérico de la TWR, sino el valor de f que se obtiene al multiplicarlo por la TWR total acumulada.

En este trozo de código:

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


La cuestión es que no hay división, sólo multiplicación (usando la fórmula de Vince, eso es todo).

¿Entonces mql no puede resolver este problema (cálculo correcto de la TWR)?

Es decir, ¿resolver con ddl, matcad, etc.?


La multiplicación también puede provocar un desbordamiento.
 
Vinin:

También se puede producir un desbordamiento durante la multiplicación.

Lo sé. Pero entonces, ¿cómo calcular la f óptima utilizando su método de la media geométrica? He escrito todas las fórmulas, todas correctamente en el código.
 
Roman.:

Lo sé. Entonces, ¿cómo puedo calcular la f óptima utilizando su método de la media geométrica? He escrito todas las fórmulas, todo correctamente en el código.

Probablemente sólo hay que pensar en la optimización. Puede encontrar variantes de cálculo.
 

¿Qué tal si no comparamos TWR con el valor anterior (TWR_Rez), sino que comparamos su media geométrica G y algún G_Rez? Después de todo, si la raíz de grado K de número_1 es mayor que la raíz del mismo grado K de número_2, ¡entonces número_1 es mayor que número_2! :))))))

Y ya calculando la raíz (variable G) no habrá desbordamiento, si efectivamente se divide el producto en elementos (para qué molestarse con las partes) y se toma la raíz de cada elemento. Al fin y al cabo, la raíz del producto es igual al producto de las raíces de sus factores. :)))

Aumentará el tiempo de cálculo, pero no habrá desbordamiento y no habrá problemas con él. Además, la precisión de los cálculos aumentará notablemente.

Si desea imprimir la variable TWR, almacene su tamaño en una variable adicional de tipo int, y utilice Print para imprimir el tamaño de TWR, por ejemplo: "89605994539435e+1234121". Pero, ¿lo necesitas?

 
Roman.:
Lo sé. Entonces, ¿cómo puedo calcular la f óptima utilizando su método de la media geométrica? Tengo todas las fórmulas en el código.
Tendré que juguetear con el cálculo de la media geométrica.