Cálculo de lote por Vince

 

Portado de

Romano 14.08.2011 06:37


Rapazes, por favor, avisem, estou atualmente procurando o f ótimo (para cálculo de volume de lote) pelo método da média geométrica usando o método de R.Vince.

A tarefa: percorrer o histórico de pedidos e com incremento f = 0,01 de 0,01 para 1, encontrar seu valor ótimo onde TWR é o máximo.

as duas fórmulas inferiores, e o valor da maior perda em um comércio é conhecido por ser D=-458:

que ciclos de enumeração, em particular para encontrar o f ideal e onde no código, adicionalmente, para organizar.

Aqui está o código de partida em int deinit() . Ele imprime corretamente em testador de estratégia sobre o lucro.

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

F, para calcular a f ideal de acordo com R. Vince, como ele tem em seu livro:

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

Você pode me dizer, o que significa a segunda linha do topo, TWR=1.#INF, no diário de bordo, depois de testar a EA ?

O que é isso? - Fora de alcance duplo ?

Se este for o caso, então como calcular o f ?

 
Roman.:

Eu fiz a seguinte função, para calcular o f ótimo de acordo com R. Vince, como em seu livro:

Você pode me dizer, o que a segunda linha do topo, TWR=1.#INF, significa no diário de bordo, depois de testar a EA ?

O que é isso? - Fora de alcance duplo?

Nesse caso, como calcular a f ?


3289
Rosh 26.10.2005 20:49
E os números "1.INF", "1.IND" significam valores muito altos em valores modulares ou valores indefinidos do tipo 0/0 (eu acho que sim).

4464
Slawa 27.10.2005 09:59
E "1.INF", "1.IND" significa ou valores muito grandes em módulo ou valores indefinidos do tipo 0/0 (acho que sim).

sim, isso mesmo. é um transbordo de ordem de flutuação (1.INF) e um transbordo de ordem dupla (1.IND). você deve verificar o divisor por 0 antes de dividir
 

Anton Trefolev http://forum.alpari.ru/member.php?u=56027 trabalhou no ótimo f, você pode perguntar a ele. Uma pessoa não desconhecida, que uma vez levantou 11000% em (até onde me lembro) 3 meses. Em seguida, o oxigênio foi cortado para ele, ampliando o espalhamento na cruz da noite para o dia. No entanto, ele conseguiu levar sua conta a mais de 100k, após o que teve que fechar a conta.

 
Vinin:

3289
Rosh 26.10.2005 20:49
E os números "1.INF", "1.IND" significam ou valores muito grandes em modulo, ou valores indefinidos como 0/0 (acho que sim).

4464
Slawa 27.10.2005 09:59
E os números "1.INF" e "1.IND" significam valores modulares muito altos ou valores indefinidos do tipo 0/0 (acho que sim).

sim, exatamente. isto é um transbordo de ordem de flutuação (1.INF) e um transbordo de ordem dupla (1.IND). antes de dividir, você precisa verificar o divisor por 0


O problema é esse - não há divisão, apenas multiplicação (usando a fórmula de Vince, só isso).

Então, usando mql, não podemos resolver esta questão (cálculo correto do TWR), certo?

Isto é, usando ddl, matcad, etc.?

 
Vinin:

3289
Rosh 26.10.2005 20:49
E os números "1.INF", "1.IND" significam ou valores muito grandes em modulo, ou valores indefinidos como 0/0 (acho que sim).

4464
Slawa 27.10.2005 09:59
E os números "1.INF" e "1.IND" significam valores modulares muito altos ou valores indefinidos do tipo 0/0 (acho que sim).

sim, exatamente. isto é um transbordo de ordem de flutuação (1.INF) e um transbordo de ordem dupla (1.IND). você tem que verificar o divisor por 0 antes de dividir


O que acontece quando o pedido flutua (1.INF) transborda?

As iterações subseqüentes do loop f são interrompidas com o resultado atual ou o loop continua a contar? Não estou interessado no valor numérico do TWR, estou interessado no valor de f obtido através da multiplicação com o TWR total cumulativo.

Neste pedaço 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.:


A questão é que não há divisão, apenas multiplicação (usando a fórmula de Vince, só isso).

Então a mql não pode resolver este problema (cálculo correto do TWR)?

Isto é, resolver com ddl, matcad, etc.?


A multiplicação também pode causar um transbordamento.
 
Vinin:

Você também pode obter um transbordamento durante a multiplicação.

Eu sei disso. Mas então como calcular a f ótima usando seu método de média geométrica? Eu escrevi todas as fórmulas, todas corretamente no código.
 
Roman.:

Eu sei disso. Então como posso calcular a f ótima usando seu método de média geométrica? Eu escrevi todas as fórmulas, todas corretamente no código.

Provavelmente só precisa pensar na otimização. Você pode encontrar variantes de cálculo.
 

Que tal comparar não o TWR com o valor anterior (TWR_Rez), mas comparar sua média geométrica G e algum G_Rez? Afinal, se a raiz do grau K do número_1 é maior que a raiz do mesmo grau K do número_2, então o número_1 é maior que o número_2! :))))))

E já calculando a raiz (variável G) não haverá transbordamento, se o produto estiver de fato dividido em elementos (por que se preocupar com partes) e tirar a raiz de cada elemento. Afinal de contas, a raiz do produto é igual ao produto das raízes de seus fatores! :)))

Ele aumentará o tempo de cálculo, mas não haverá transbordo e não haverá confusão com ele. Além disso, haverá um aumento perceptível na precisão dos cálculos.

Se você quiser imprimir a variável TWR, armazene seu tamanho em uma variável adicional do tipo int, e use Print para imprimir o tamanho TWR, por exemplo: "89605994539435e+1234121". Mas você precisa disso?

 
Roman.:
Eu sei disso. Então como posso calcular a f ótima usando seu método de média geométrica? Eu tenho todas as fórmulas bem no código.
Terei que me mexer no cálculo da média geométrica.