Calcolo del lotto da parte di Vince

 

Portato da

Romano 14.08.2011 06:37


Ragazzi, per favore consigliatemi, attualmente sto cercando la f ottimale (per il calcolo del volume del lotto) con il metodo della media geometrica usando il metodo di R.Vince.

Il compito: passare attraverso la storia degli ordini e con incremento f = 0,01 da 0,01 a 1, trovare il suo valore ottimale dove TWR è massimo.

le due formule inferiori, e il valore della più grande perdita su un trade è noto per essere D=-458:

quali cicli di enumerazione, in particolare per trovare il f ottimale e dove nel codice, inoltre, per organizzare.

Ecco il codice iniziale in int deinit() . Stampa in strategy tester sul profitto in modo corretto.

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

Trasferito da

Fatto il seguente f, per calcolare f ottimale secondo R. Vince, come ha nel suo 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);
  }

Puoi dirmi cosa significa la seconda linea dall'alto, TWR=1.#INF, nel registro, dopo aver testato l'EA ?

Che cos'è? - Doppio fuori portata?

Se questo è il caso, allora come calcolare la f ottimale?

 
Roman.:

Ho fatto la seguente funzione, per calcolare f ottimale secondo R. Vince, come nel suo libro:

Puoi dirmi cosa significa la seconda linea dall'alto, TWR=1.#INF, nel registro, dopo aver testato l'EA ?

Che cos'è? - Doppio fuori portata?

Se sì, in questo caso come calcolare la f ottimale?


3289
Rosh 26.10.2005 20:49
E i numeri "1.INF", "1.IND" significano o valori troppo alti di modulo o un valore indefinito di tipo 0/0 (credo di sì).

4464
Slawa 27.10.2005 09:59
E "1.INF", "1.IND" significa o valori troppo grandi nel modulo o un valore indefinito di tipo 0/0 (credo di sì).

Sì, è giusto. è un overflow di ordine float (1.INF) e un overflow di ordine doppio (1.IND). dovresti controllare il divisore per 0 prima di dividere
 

Anton Trefolev http://forum.alpari.ru/member.php?u=56027 ha lavorato su f ottimale, puoi chiedere a lui. Una persona non sconosciuta che una volta ha raccolto 11000% in (per quanto mi ricordo) 3 mesi. Poi l'ossigeno gli è stato tolto allargando la diffusione sulla croce notturna. Ciononostante è riuscito a portare il suo conto a più di 100k, dopodiché ha dovuto chiudere il conto.

 
Vinin:

3289
Rosh 26.10.2005 20:49
E i numeri "1.INF", "1.IND" significano o troppo grandi nei valori modulo, o un valore indefinito come 0/0 (credo di sì).

4464
Slawa 27.10.2005 09:59
E i numeri "1.INF" e "1.IND" significano o valori troppo alti modulo o un valore indefinito di tipo 0/0 (credo di sì).

Sì, esattamente. questo è un overflow di ordine float (1.INF) e un overflow di ordine doppio (1.IND). prima di dividere, dovete controllare il divisore per 0


Questo è il punto - non c'è divisione, solo moltiplicazione (usando la formula di Vince, tutto qui).

Quindi, usando mql, non possiamo risolvere questa domanda (calcolo corretto di TWR), giusto?

Cioè usando ddl, matcad, ecc.

 
Vinin:

3289
Rosh 26.10.2005 20:49
E i numeri "1.INF", "1.IND" significano o troppo grandi nei valori modulo, o un valore indefinito come 0/0 (credo di sì).

4464
Slawa 27.10.2005 09:59
E i numeri "1.INF" e "1.IND" significano o valori troppo alti modulo o un valore indefinito di tipo 0/0 (credo di sì).

Sì, esattamente. questo è un overflow di ordine float (1.INF) e un overflow di ordine doppio (1.IND). dovete controllare il divisore per 0 prima di dividere


Cosa succede quando l'ordine float (1.INF) trabocca?

Le iterazioni successive del ciclo f vengono interrotte con il risultato corrente o il ciclo continua a contare? Non mi interessa il valore numerico del TWR, mi interessa il valore di f ottenuto attraverso la moltiplicazione con il TWR totale cumulativo.

In questo pezzo di codice:

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


Il punto è che non c'è divisione, solo moltiplicazione (usando la formula di Vince, tutto qui).

Quindi mql non può risolvere questo problema (calcolo corretto del TWR)?

Cioè risolvere con ddl, matcad, ecc.


La moltiplicazione può anche causare un overflow.
 
Vinin:

Si può ottenere un overflow anche durante la moltiplicazione.

Lo so. Ma allora come calcolare f ottimale usando il suo metodo della media geometrica? Ho scritto tutte le formule, tutte correttamente nel codice.
 
Roman.:

Lo so. Allora come posso calcolare la f ottimale usando il suo metodo della media geometrica? Ho scritto tutte le formule, tutte correttamente nel codice.

Probabilmente bisogna solo pensare all'ottimalità. Si possono trovare varianti di calcolo.
 

Che ne dite di confrontare non la TWR con il valore precedente (TWR_Rez), ma di confrontare la loro media geometrica G e una certa G_Rez? Dopo tutto, se la radice di grado K del numero_1 è maggiore della radice dello stesso grado K del numero_2, allora il numero_1 è maggiore del numero_2! :))))))

E già calcolando la radice (variabile G) non ci sarà overflow, se il prodotto è effettivamente diviso in elementi (perché preoccuparsi delle parti) e prendere la radice da ogni elemento. Dopo tutto, la radice del prodotto è uguale al prodotto delle radici dei suoi fattori! :)))

Aumenterà il tempo di calcolo, ma non ci sarà nessun overflow e nessuna confusione. Inoltre, ci sarà un notevole aumento della precisione di calcolo.

Se volete stampare la variabile TWR, memorizzate la sua dimensione in una variabile aggiuntiva di tipo int, e usate Print per stampare la dimensione TWR, per esempio: "89605994539435e+1234121". Ma ne avete bisogno?

 
Roman.:
Lo so. Allora come posso calcolare la f ottimale usando il suo metodo della media geometrica? Ho tutte le formule nel codice.
Dovrò armeggiare con il calcolo della media geometrica.