Исчо один критерий

 

Очень хочется иметь универсальный критерий для оценки ТС, который дает всего одну цифирку . Предполагаю, что счас запинаете под лавку, потому как в этой теме сколько трейдеров столько и мнений . Мои поиски привели к следующему алгоритму .Есть обычнаяТС со стопами профитами положит отрицательными сделками . Формируется кумулятивный массив реальных сделок вида сд1,сд1+сд2,сд1+сд2+сд3 и тд. Формируется кумулятивный массив идеальных сделок каждая сделка закрывается по ТР . Теперь каждый массив можно представит как вектор N мерного пространства, а так как размерность векторов одинакова то косинус угла между ними будет равен коэффициенту корреляции, между реальными и идеальными сделками . Ниже привожу код

double Korrel (int mgkor,int totkor )
   {
   // расчитывается косиснус угла между векторами первый вектор это результаты торговых сделок 
   // второй вектор результаты идеальных торговых сделок ( в этом варианте каждая сделка закроется по TP )
   // входные переменные mgkor-магик ,  totkor-количество последних сделок по которым требуется заключение  
   double  vectorg[1],vecideal[1];
   double  r,Profit,CumProfit,sredn_torg,summv1,summv2,summv1v2 ;
   double  Profitideal,CumProfitideal,srednideal;
   int i,j ;
   ArrayResize(vectorg, totkor);
   ArrayResize(vecideal, totkor);
   for (i=OrdersHistoryTotal()-1 ; i>=0 ;i--)// составляем вектор результатов сделки реальой и идеальной ТС
      {
         OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)  ;
         if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderMagicNumber()==mgkor)
              {
                if( OrderType() ==OP_BUY )
                 { Profit=(OrderClosePrice()-OrderOpenPrice())*OrderLots()*AccountLeverage( ) ;// считаем профиты для лонг реальной
                   Profitideal=(OrderTakeProfit()-OrderOpenPrice())*OrderLots()*AccountLeverage() ;}// для идеальной системы 
                if( OrderType() ==OP_SELL )   
                 { Profit=(OrderOpenPrice()-OrderClosePrice())*OrderLots()*AccountLeverage( ) ; //  и шорт реальной
                   Profitideal=(OrderOpenPrice()-OrderTakeProfit())*OrderLots()*AccountLeverage() ;}//  для идеальной системы
                vectorg[totkor-j-1]=Profit ;  // в самом большом индексе последняя сделка .Чем меньше индекс тем старше результат сделки.
                vecideal[totkor-j-1]=Profitideal ; // в результате имеем два массива один реальных торгов ,другой идеальных 
                 if (j == totkor-1)  break  ;
                 j++ ;
              }
      }
   for (i=1; i < totkor ;i++)  // из предыдущих результатов сделок делаем кумулятивную сумму результатов торгов вида 
     {                         //  сд1,сд1+сд2,сд1+сд2+сд3 и т.д. для реальных и идеальных торгов 
      CumProfit=vectorg[i] ;
      vectorg[i]=CumProfit+vectorg[i-1];
      CumProfitideal=vecideal[i] ;
      vecideal[i]=CumProfitideal+vecideal[i-1] ;
     }
     for ( i=1 ;i < totkor  ; i++)  // сумма всех последних totkor сделок для расчета среднего значения 
            {  
               srednideal=srednideal+vecideal[i];
               sredn_torg=sredn_torg+vectorg[i] ;   
            }  
            sredn_torg=sredn_torg/totkor ;  // среднее значение сделки 
            srednideal=srednideal/totkor ; // среднее значение идеальной торговой системы  
     for(i=0 ; i<totkor ;i++) // расчитывам коэффициент корреляции между идеальной торговлей  и реальной торговлей 
      {
         summv1=summv1+MathPow(vectorg[i]-sredn_torg,2) ;
         summv2=summv2+MathPow(vecideal[i]-srednideal,2) ;
         summv1v2=summv1v2+(vectorg[i]-sredn_torg)*(vecideal[i]-srednideal) ;
      }
      r=summv1v2/(MathSqrt(summv1)*MathSqrt(summv2)) ;// отношение скалярного произведения к произведению норм этих векторов       
    return(r) ;  // только надо брать не реальные вектора а разницу вектора и среднего значения иначе коэфф корреляции будет зави-
    // сеть от единици измерения. Юкио Сато Обработка сигналов первое знакомство . 
   }

Как обычно если по теме то любые подзатыльники с благодарностью .

 
Вы что-то вроде КПД предлагаете. Это уже было. :) В одноименной теме. Однако ваш способ оригинальный.
 

При подсчете косинуса в расчетах Profit-ов умножение на AccountLeverage() бессмыслено.

Чтобы функция корректно работала и для случая нескольких торговых инструментов в истории сделок, надо заменить в вышеприведенном коде AccountLeverage() на MarketInfo(OrderSymbol(), MODE_TICKVALUE) / MarketInfo(OrderSymbol(), MODE_POINT).

 
Profitideal=(OrderTakeProfit()-OrderOpenPrice())...

слишком уж идеальный получается :)

MFE, MAE посмотрите https://www.mql5.com/ru/users/Liliput

 
getch писал(а) >>

При подсчете косинуса в расчетах Profit-ов умножение на AccountLeverage() бессмыслено.

Чтобы функция корректно работала и для случая нескольких торговых инструментов в истории сделок, надо заменить в вышеприведенном коде AccountLeverage() на MarketInfo(OrderSymbol(), MODE_TICKVALUE) / MarketInfo(OrderSymbol(), MODE_POINT).

Согласен с вами, это остатки отпредыдущего варианта . При сделках постоянным лотом вполне подойдет OrderClosePrice()-OrderOpenPrice()

 
Swan писал(а) >>

слишком уж идеальный получается :)

MFE, MAE посмотрите https://championship.mql4.com/2008/ru/users/Liliput/reports

Коэффициенты MFE, MAE здесь не учитываются .

Был опробован подход в котором советник тогующий на реальных торгах допускался к торговле по результатам виртуальных торгов ( обратная связь ), правда критерий был другой, но в целом направление перспективное .Задача - сделать адекватный критерий оценки ТС, а как его использовать это другое, например как переключатель между различными ТС .

 
ivandurak >>:

Коэффициенты MFE, MAE здесь не учитываются .

Был опробован подход в котором советник тогующий на реальных торгах допускался к торговле по результатам виртуальных торгов ( обратная связь ), правда критерий был другой, но в целом направление перспективное .Задача - сделать адекватный критерий оценки ТС, а как его использовать это другое, например как переключатель между различными ТС .

интересная мысль

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