Calcolo del lotto da parte di Vince - pagina 8

 
Roman.:

Per coloro che sono interessati - è stato possibile raggiungere valori di lavoro (medi) della variabile f ottimale, con il metodo della media geometrica secondo R. Vince nell'EA incluso nella consegna standard della MT basata su MA (vedi schermata). In base alle condizioni e all'ordine di calcolo di f ottimale dal libro, il suo valore è 0,36. Dopo aver terminato il codice, posterò qui la funzione con la descrizione e l'ordine di utilizzo per calcolare i volumi dei lotti aperti nei futuri scambi secondo il libro di R. Vince.

Congratulazioni per il vostro successo! :))
 
MaxZ:
Congratulazioni per il vostro successo! :))

Grazie. Sembra che dovrò fare un array TWR, solo per essere sicuro, come mi hai consigliato.
 
MaxZ:
Congratulazioni per il vostro successo! :))


punto di flesso f = 0,36, cioè come f aumenta ulteriormente, la variabile TWR - diminuisce - R. Vince ha ragione! :-)))

 

Ehm, come si può allegare tutto questo a un EA funzionante con una semplice definizione di dimensione del lotto in % di depo? O forse non sto guadagnando abbastanza)))

Voglio dire, è tutto un gioco mentale o ha un'applicazione pratica con un effetto positivo?

 
Dezil:

Ehm, come si può allegare tutto questo a un EA funzionante con una semplice definizione della dimensione del lotto come % del deposito? Forse non sto guadagnando abbastanza)).

Voglio dire che tutto questo è un gioco mentale o ha un'applicazione pratica con un effetto positivo?


Certo, leggi R Vince - vedi i post sopra il trailer, non l'ho ancora provato io stesso su una demo... Vedremo... :-)))

Posterò la fiya qui appena avrò finito, con una descrizione.

 
Roman.:


Certo, leggi R. Vince - vedi i post sopra nel trailer, non l'ho ancora testato io stesso su una demo... Vedremo... :-)))

Non appena avrò finito, posterò la fic qui con una descrizione.


Potresti dirmi cosa leggere del lavoro di Vince? Qual è il titolo dell'opera?
 
Dezil:

Puoi dirmi cosa leggere di Vince? Qual è il titolo dell'opera?

Scarica il trailer dal mio post a pagina 2 del thread da qui - pagine 30-32.
 
Roman.:

Credo di aver capito dove sta l'errore...

Torniamo al codice originale, che abbiamo già stravolto alcune volte:

   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                                  
      }    

Potrebbe essere che la variabile TWR non venga resettata a "1" ad ogni iterazione di f?

 
MaxZ:

Credo di aver capito dove sta l'errore...

Torniamo al codice originale, che abbiamo già stravolto alcune volte:

Forse si tratta della variabile TWR che non viene resettata a "1" ad ogni iterazione di f?


Sì, un punto competente a proposito... Possibile... molto probabile. Lo controllerò questo pomeriggio e lo posterò qui. Grazie.

Allora non è necessario creare un array TWR (come questo - la versione fresca - neanche...

Qui ho provato tutti i tipi di esorcismi per ridurre proporzionalmente il suo valore nel prodotto (perché il suo valore assoluto non è importante, è il confronto per più/piccolo che conta), in modo da evitare l'overflow quando si calcola il f ottimale.

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]);     
 

Ero troppo pigro per incollare il codice nell'EA e controllarlo io stesso! :)))

Non ho ancora un vero e proprio Expert Advisor. Ho solo alcune idee. Ecco perché ho preso una media mobile standard senza ottimizzarla e ho scelto un periodo redditizio.

L'ultimo codice che ho provato, quando ho capito che TWR non si resetta a "1", era il seguente:

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

Nessuna matrice TWR.

Aspetterete a lungo per una tracimazione! ;D Anche se forse non sarebbe successo affatto...