Расчет лота по Винсу - страница 8

 
Roman.:

Для тех, кто заинтересован - удалось выйти на рабочие (средние значения) переменной оптимального f, методом среднего геометрического по Р.Винсу в эксперте, входящим в стандартную поставку МТ на основе МА (см. скрин экрана). Исходя из условий и порядка расчета оптимального f по книжке, ее значение равно 0,36. После доработки кода выложу ф-ию здесь с описанием и порядком использования для расчета объемов открываемых в последующих торгах лотов по книжке Р.Винса.

Поздравляю Вас с достигнутым успехом! :))
 
MaxZ:
Поздравляю Вас с достигнутым успехом! :))

Благодарю. Похоже, придется массив делать TWR, для надежности, как Вы и советовали.
 
MaxZ:
Поздравляю Вас с достигнутым успехом! :))


точка перегиба f = 0.36, т.е. при дальнейшем росте f, переменная TWR - уменьшается - Р.Винс прав! :-)))

 

Эмм, а как это все можно прикрутить к рабочему эксперту с простейшим определением размера лота в % от депо? А то может я прибыль недополучаю))

Я в смысле все это игры разума или имеет практическое применение с положительным эффектом?

 
Dezil:

Эмм, а как это все можно прикрутить к рабочему эксперту с простейшим определением размера лота в % от депо? А то может я прибыль недополучаю))

Я в смысле все это игры разума или имеет практическое применение с положительным эффектом?


Конечно, почитайте Р.Винса - см. посты выше в прицепе, я пока сам на демо даже не проверял... Посмотрим... :-)))

Как закончу, выложу ф-ию сюда с описанием.

 
Roman.:


Конечно, почитайте Р.Винса - см. посты выше в прицепе, я пока сам на демо даже не проверял... Посмотрим... :-)))

Как закончу, выложу ф-ию сюда с описанием.


а не ткнете что именно почитать у Винса? Как называется произведение?
 
Dezil:

а не ткнете что именно почитать у Винса? Как называется произведение?

Качайте прицеп с моего поста со 2-ой странички ветки отсюда - стр.30-32.
 
Roman.:

Кажется Я понял, где кроется ошибка...

Вернёмся к изначальному коду, который Мы уже перекрутили на несколько раз:

   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                                  
      }    

Может всё дело в том, что переменная TWR не сбрасывается в "1" при каждой итерации f?

 
MaxZ:

Кажется Я понял, где кроется ошибка...

Вернёмся к изначальному коду, который Мы уже перекрутили на несколько раз:

Может всё дело в том, что переменная TWR не сбрасывается в "1" при каждой итерации f?


Да, кстати, грамотное замечание... Возможно...вполне. Сегодня после обеда проверю и напишу здесь. Благодарю.

Тогда и массив ТВР создавать (типа этого - свежего варианта - не обязательно...

Здесь я всякими экзорциссами пытался пропорционально уменьшить ее значение в произведении (ведь ее абсолютное значение - не важно, важно сравнение на больше/меньше), дабы предотвратить переполнение при расчете оптимального f.

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

Поленился Я тогда вставить код в советника и проверить Всё лично! :)))

Да как бы ещё и советника нормального нет. Только наработки... Поэтому взял стандартного Moving Average, не оптимизирую выбрал прибыльный период и стал проверять.

Последний код, к которому Я пришёл, когда понял, что TWR не сбрасывается в "1", выглядит так:

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

Обошлось без массива TWR.

Переполнение долго будете ждать! ;D Хотя может его и не было бы вообще...

Причина обращения: