Расчет лота по Винсу

 

Перенесено

Roman 14.08.2011 06:37


Ребята, подскажите, сейчас по Р.Винсу ищу оптимальное 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 по Р. Винсу, как у него в книжке:

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

Подскажите, что означает в журнале, после тестирования советника, вторая строчка сверху, а именно TWR=1.#INF ?

Что это? - Выход за границы диапазона double?

Если это так, в таком случае, как рассчитать оптимальную f ?

 
Roman.:

Изготовил следующую ф-ию, для расчета оптимального f по Р. Винсу, как у него в книжке:

Подскажите, что означает в журнале, после тестирования советника, вторая строчка сверху, а именно TWR=1.#INF ?

Что это? - Выход за границы диапазона double?

Если это так, в таком случае, как рассчитать оптимальную 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 (я так думаю).

да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0
 

Антон Трефолев http://forum.alpari.ru/member.php?u=56027 работал по оптимальному f, можете у него спросить. Небезызвестный человек, в свое время поднявший 11000% за (насколько помню) 3 месяца. Затем ему перекрыли кислород путем расширения спреда на ночном кроссе. Тем не менее удалось разогнать счет до больше 100к, после чего памм пришлось закрыть.

 
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 (я так думаю).

да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0


В том то и дело, что там нет деления, сплошное умножение (по его Р.Винса формуле и все).

Т.е. средствами mql данный вопрос (правильного рассчета TWR) не решить?

Т.е. решать через ddl, маткад и т.д.?

 
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 (я так думаю).

да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0


Что происходит при переполнении порядка float (1.INF)?

Прерываются последующие итерации цикла по f с выдачей текущего результата? или дальше цикл считает? Меня не интересует численное значение TWR, меня интересует значение f, полученное через умножение с накопительным итогом TWR.

В этом участке кода:

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, маткад и т.д.?


При умножении тоже можно получить переполнение.
 
Vinin:

При умножении тоже можно получить переполнение.

Я это знаю. А как тогда рассчитать оптимальное f по его метОде среднего геометрического? Я все формулы, все правильно в коде прописАл.
 
Roman.:

Я это знаю. А как тогда рассчитать оптимальное f по его метОде среднего геометрического? Я все формулы, все правильно в коде прописАл.

Наверно просто подумать надо над оптимальностью. Варианты расчета можно найти.
 

А если сравнивать не TWR с предыдущим значением (TWR_Rez), а сравнивать их среднее геометрическое G и какое-то G_Rez? Ведь если корень степени K из числа_1 больше корня той же степени K из числа_2, то и число_1 больше числа_2! :))))))

А уже рассчитывая корень (переменную G) не будет никакого переполнения, если произведение и правда разбить по элементам (зачем возиться с частями) и от каждого элемента брать корень. Ведь корень произведения равен произведению корней его сомножителей! :)))

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

А если Вы задумаете выводить переменную TWR, то тогда придётся хранить её разрядность в дополнительной переменной типа int, и в Print'е выводить разрядность TWR, например: "89605994539435e+1234121". Но надо ли Вам это?

 
Roman.:
Я это знаю. А как тогда рассчитать оптимальное f по его метОде среднего геометрического? Я все формулы, все правильно в коде прописАл.
Шаманить с подсчетом геометрического среднего.
Причина обращения: