Cálculo del lote por Vince - página 8

 
Roman.:

Para aquellos que estén interesados - fue posible alcanzar valores de trabajo (promedio) de la variable óptima f, por el método de la media geométrica según R. Vince en el EA incluido en la entrega estándar de la MT basada en MA (ver captura de pantalla). Según las condiciones y el orden de cálculo de la f óptima por el libro, su valor es 0,36. Después de terminar el código, publicaré aquí la función con la descripción y la orden de uso para calcular los volúmenes de lotes abiertos en futuras operaciones según el libro de R. Vince.

Enhorabuena por su éxito. :))
 
MaxZ:
Enhorabuena por su éxito. :))

Gracias. Parece que tendré que hacer una matriz TWR, sólo para estar seguro, como aconsejaste.
 
MaxZ:
Enhorabuena por su éxito. :))


punto de inflexión f = 0,36, es decir, a medida que f aumenta, la variable TWR - disminuye - R. ¡Vince tiene razón! :-)))

 

¿Cómo se puede adjuntar todo esto a un EA que funcione con una simple definición del tamaño del lote como % del depósito? O tal vez no estoy haciendo suficiente beneficio)))

¿Es todo un juego mental o tiene una aplicación práctica con un efecto positivo?

 
Dezil:

Um, ¿cómo se puede adjuntar todo esto a un EA que funcione con una simple definición del tamaño del lote en % de la deposición? Tal vez no esté obteniendo suficientes beneficios)).

¿Todo esto es un juego mental o tiene una aplicación práctica con un efecto positivo?


Claro, leer R Vince - ver los mensajes de arriba en el trailer, ni siquiera he probado en una demo a mí mismo todavía ... Veremos... :-)))

Publicaré la fiya aquí en cuanto la termine, con una descripción.

 
Roman.:


Por supuesto, leer R. Vince - ver los mensajes de arriba en el trailer, ni siquiera he probado yo mismo en la demo todavía ... Veremos... :-)))

En cuanto termine, publicaré el fic aquí con una descripción.


¿Podría decirme qué leer de la obra de Vince? ¿Cuál es el título de la obra?
 
Dezil:

¿Puedes decirme qué debo leer de Vince? ¿Cuál es el título de la obra?

Descargue el tráiler de mi post en la página 2 del hilo desde aquí - páginas 30-32.
 
Roman.:

Creo que he descubierto dónde está el error...

Volvamos al código original, que ya hemos retorcido varias veces:

   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                                  
      }    

¿Podría ser que la variable TWR no se restablezca a "1" en cada iteración de f?

 
MaxZ:

Creo que he descubierto dónde está el error...

Volvamos al código original, que ya hemos retorcido varias veces:

¿Tal vez se trate de que la variable TWR no se restablezca a "1" en cada iteración de f?


Sí, un punto competente por cierto... Posiblemente... muy posiblemente. Lo comprobaré esta tarde y lo publicaré aquí. Gracias.

Entonces no es necesario crear una matriz TWR (como esta - la versión fresca - tampoco...

Aquí he probado todo tipo de exorcismos para reducir proporcionalmente su valor en el producto (porque su valor absoluto no es importante, lo que importa es la comparación por más/menos), para evitar el desbordamiento al calcular la f óptima.

for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально
     {  
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам
            {                                                // и считаем относительный конечный капитал (TWR)
             //TWR = MathPow(TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))),0.33); // TWR - это произведение всех HPR                    
             Mas_TWR[orderIndex] = (1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // заполняем массив значениями HPR                               
            }
          //Print ("Mas_TWR[Qnt]= ", Mas_TWR[Qnt]); 
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++)         
              {
               TWR = MathSqrt(TWR*Mas_TWR[orderIndex]);}
               
          if (TWR>TWR_Rez)
              {
                TWR_Rez = TWR;               
                //G = MathPow(TWR_Rez, 1/N);
                     // G1 = G1*MathPow(Mas_TWR[orderIndex], 1/N);
                     //G=MathPow (TWR_Rez, 0.0054054); // 1/185 сделки по данной торговой системе, как в книжке: в степени 1/N 
                Print(" TWR_Rez = ",DoubleToStr(TWR_Rez,8), " при f = ", f); 
                                                       // если текущий TWR > результирующего
              } 
          else 
              {
                TWR_Rez = TWR;
               // G=MathPow (TWR_Rez, 1/N);
                Print(" А это уже меньше: TWR_Rez = ",DoubleToStr(TWR_Rez,8), " при f = ", f);                                                     
              }       
      }      
             
   Print("Закрытых позиций = ", Qnt, " Нетто Профит/лосс = ", SUMM, " У последней ",Qnt, " закрытой позы профит/лосс = ", 
        Mas_Outcome_of_transactions[Qnt]);     
 

Me ha dado pereza pegar el código en el EA y comprobarlo yo mismo. :)))

Todavía no tengo un Asesor Experto adecuado. Sólo tengo algunas ideas. Por eso tomé una Media Móvil estándar sin optimizarla y elegí un periodo rentable.

El último código que probé, cuando entendí que TWR no se reiniciará a "1", fue el siguiente:

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

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//--- Расчет оптимального f ---
   int Qnt = 0, Orders = OrdersHistoryTotal();        // Счётчик количества ордеров   
   ArrayInitialize(Mas_Outcome_of_transactions, 0);   // Обнуление массива
   double f, D, SUMM, TWR, G, G_Rez, Pow = 1/NormalizeDouble(Orders, 0);
   int orderIndex;
   
   for (orderIndex = 0; orderIndex < Orders; 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();
      
      if (orderIndex == 0 || lastProfit < D)
         D = lastProfit;
      
      Mas_Outcome_of_transactions[Qnt] = lastProfit;  // Заполняем массив профитом/лоссом по всем закрытым позициям 
      SUMM=SUMM+lastProfit;
      Qnt++;                                          // увеличиваем счетчик закрытых ордеров    
   }
   
   Print("D = ", DoubleToStr(D, 2), " Pow = ", DoubleToStr(Pow, 8));
   
   for (f = 0.01; f<=1.0; f=f+0.01)                   // цикл перебора переменной f для поиска оптимального ее значения,
   {                                                  // при котором G - максимально
      G = 1;
      for ( orderIndex = 1; orderIndex < Qnt; orderIndex++) // при заданной f проходим по всем закрытым ордерам
      {                                                     // и считаем среднее геометрическое от TWR
         TWR = 1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D));
         G *= MathPow(TWR, Pow);
      }
      if (G > G_Rez)
      {
         G_Rez = G;
         Print("G = ", G, " при f = ", f);
      }           // если текущий G > результирующего, то результирующий делаем равным текущему
      else break; // иначе переходим на следующую итерацию цикла по f
   }
   
   Print("Закрытых позиций = ",   Qnt,
         " Нетто Профит/лосс = ", SUMM,
         " У последней ",         Qnt,
         " закрытой позы профит/лосс = ", Mas_Outcome_of_transactions[Qnt-1]);
   
   return(0);
}

No hay matriz TWR.

Esperarás mucho tiempo a que se produzca un desbordamiento. ;D Aunque tal vez no hubiera ocurrido en absoluto...