文斯的地段计算

 

移植自

罗曼 14.08.2011 06:37


嘿,伙计们,请指点迷津,我正在用R.Vince的方法通过几何平均法寻找最佳f(用于计算手数)。

任务:通过订单历史,以增量f=0.01从0.01到1,找到其最佳值,其中TWR是最大的。

底部两个公式,已知交易中最大损失的价值为D=-458

哪些枚举循环,特别是要找到最佳的f,以及在代码的什么地方,另外,要组织好。

下面是int deinit() 的起始代码。它在策略测试器中正确地打印了有关利润。

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

转自

做了以下f,根据R.Vince的说法,计算出最佳的f,正如他在书中所说。

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

你能告诉我,在测试了EA之后,从顶部开始的第二行,TWR=1.#INF,在日志中是什么意思

它是什么?- 超出范围的双?

如果是这样的话,那么如何计算出最佳的F?

 
Roman.:

我做了以下函数,按照R.Vince的说法,计算出最佳的F,正如他书中所说。

你能告诉我,在测试EA后,日志中从头开始的第二行,TWR=1.#INF 是什么意思

它是什么?- 超出范围的替身?

如果是这样,在这种情况下,如何计算出最佳的F?


3289
Rosh 26.10.2005 20:49
数字 "1.INF"、"1.IND "意味着模数值太高或0/0类型的未定义值(我想是这样)。

4464
Slawa 27.10.2005 09:59
而 "1.INF"、"1.IND "意味着模块中的数值太大,或者是0/0类型的未定义值(我认为如此)。

是的,这是正确的。它是一个浮点数的溢出(1.INF)和一个双数的溢出(1.IND)。
 

安东-特雷福列夫http://forum.alpari.ru/member.php?u=56027,从事最优F的工作,你可以问他。一个不知名的人,曾经在(我记得的)3个月内筹集了11000%。然后通过扩大隔夜十字架上的散布,切断了对他的氧气。尽管如此,他还是设法让自己的账户达到了10万以上,之后他不得不关闭账户。

 
Vinin:

3289
Rosh 26.10.2005 20:49
数字 "1.INF"、"1.IND "意味着模数值过大,或者像0/0这样的未定义值(我想是这样)。

4464
Slawa 27.10.2005 09:59
数字 "1.INF "和 "1.IND "意味着要么是过高的模数值,要么是0/0类型的未定义值(我想是这样)。

是的,完全正确。这是一个浮点数的溢出(1.INF)和一个双倍数的溢出(1.IND)。


这就是问题所在--没有除法,只有乘法(使用文斯的公式,就这样)

所以,使用mql,我们无法解决这个问题(正确计算TWR),对吗?

例如,使用ddl、matcad等?

 
Vinin:

3289
Rosh 26.10.2005 20:49
数字 "1.INF"、"1.IND "意味着模数值过大,或者像0/0这样的未定义值(我想是这样)。

4464
Slawa 27.10.2005 09:59
而 "1.INF "和 "1.IND "的数字意味着要么是太高的数值模数,要么是0/0类型的未定义值(我想是这样)。

是的,完全正确。这是一个浮点数的溢出(1.INF)和一个双倍数的溢出(1.IND)。


当订单浮动(1.INF)溢出时会发生什么?

f循环的后续迭代是以当前的结果中断,还是循环一直在计数?我对TWR的数值不感兴趣,我感兴趣的是通过与累计总TWR相乘得到的f值。

在这段代码中。

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


关键是,没有除法,只有乘法(使用文斯的公式,就是这样)

所以mql不能解决这个问题(正确计算TWR)?

即用ddl、matcad等解决?


乘法也会导致溢出。
 
Vinin:

在乘法过程中也会出现溢出。

我知道。但接下来如何用其几何平均 法计算出最佳的f?我已经写好了所有的公式,在代码中全部正确。
 
Roman.:

我知道。那么我如何用其几何平均法计算出最佳的f?我已经写好了所有的公式,在代码中全部正确。

可能只需要考虑优化的问题。你可以找到计算的变体。
 

不比较TWR与前一个值(TWR_Rez),而是比较它们的几何平均数G和一些G_Rez如何?毕竟,如果数_1的K度根大于数_2的相同K度的根,那么数_1就大于数_2!:))))))

而且已经计算了根(变量G),就不会有溢出,如果乘积确实被分成了几个元素(为什么要用部分呢),从每个元素中取根。毕竟,积的根等于其因子的根的乘积!:)))

这将增加计算时间,但不会有溢出,也不会有大惊小怪的情况。此外,计算精度也会有明显的提高。

如果你想打印TWR变量,把它的大小存储在一个额外的int类型的 变量中,然后用Print来打印TWR的大小,比如说。"89605994539435e+1234121".但你需要它吗?

 
Roman.:
我知道。那么我如何用其几何平均法计算出最佳的f?我已经把所有的公式都写在了代码里。
我得摆弄一下计算几何 平均数的方法。