Vince에 따른 로트 계산 - 페이지 8

 
Roman. :

관심 있는 사람들을 위해 MA 기반 MT의 표준 전달에 포함된 Expert Advisor의 R. Vince에 따라 기하 평균 방법을 사용하여 최적의 f 변수의 작업(평균값)에 도달했습니다(스크린샷 참조). 책에 따라 최적의 f 를 계산하는 조건과 절차에 따라 그 값은 0.36입니다. 코드가 완성되면 R. Vince의 책에 따라 후속 경매에서 열린 로트 수량을 계산하는 데 사용하는 절차와 설명과 함께 여기에 기능을 게시할 것입니다.

성공을 축하합니다! :))
 
MaxZ :
성공을 축하합니다! :))

덕분에. 당신이 조언한 대로 안정성을 위해 어레이 TWR을 만들어야 할 것 같습니다.
 
MaxZ :
성공을 축하합니다! :))


변곡점 f = 0.36 , 즉 f가 추가로 증가하면 변수 TWR - 감소 - R. Vince가 맞습니다! :-)))

 

음, 어떻게 이 모든 것이 창고의 % 단위로 로트 크기를 가장 간단하게 결정하는 작업 전문가 고문과 연결될 수 있습니까? 아니면 내가 이익을 내지 못하는 것일 수도 있습니다.

내 말은 이 모든 것이 마인드 게임이거나 긍정적인 효과가 있는 실용적인 응용 프로그램이 있다는 것입니다.

 
Dezil :

음, 어떻게 이 모든 것이 창고의 % 단위로 로트 크기를 가장 간단하게 결정하는 작업 전문가 고문과 연결될 수 있습니까? 아니면 내가 이익을 내지 못하는 것일 수도 있습니다.

내 말은 이 모든 것이 마인드 게임이거나 긍정적인 효과가 있는 실용적인 응용 프로그램이 있다는 것입니다.


물론, R. Vince를 읽으십시오 - 트레일러의 위의 게시물을 참조하십시오. 나는 아직 데모도 확인하지 않았습니다... 어디 보자... :-)))

완료되면 여기에 설명과 함께 기능을 게시하겠습니다.

 
Roman. :


물론, R. Vince를 읽으십시오 - 트레일러의 위의 게시물을 참조하십시오. 나는 아직 데모도 확인하지 않았습니다... 어디 보자... :-)))

완료되면 여기에 설명과 함께 기능을 게시하겠습니다.


Vince에게서 정확히 무엇을 읽을지 찌르는 대신? 작품의 이름은 무엇입니까?
 
Dezil :

Vince에게서 정확히 무엇을 읽을지 찌르는 대신? 작품 이름이 뭔가요?

여기에서 분기의 두 번째 페이지에서 내 게시물에서 트레일러를 다운로드하십시오 - p.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 변수가 f를 반복할 때마다 "1"로 재설정되지 않는다는 것입니까?

 
MaxZ :

오류가 어디에 있는지 알아낸 것 같은데...

이미 여러 번 뒤틀린 원래 코드로 돌아가 보겠습니다.

아마도 요점은 TWR 변수가 f를 반복할 때마다 "1"로 재설정되지 않는다는 것입니까?


네, 그건 그렇고, 유능한 발언 ... 아마도 ... 꽤. 오늘 오후에 확인하고 여기에 올리겠습니다. 덕분에.

그런 다음 TVR 어레이를 생성할 필요가 없습니다(이와 같이 - 새로운 버전 - 필요하지 않습니다 ...

여기에서는 온갖 액막이로 최적의 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]);     
 

나는 너무 게을러서 어드바이저에 코드를 삽입하고 모든 것을 개인적으로 확인했습니다! :)))

예, 마치 정상적인 고문이 없는 것처럼. 전개만... 그래서 이동평균선 을 기준으로 최적화를 하지 않고 수익성 있는 기간을 선택하여 확인을 시작했습니다.

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 아예 존재하지 않을 수도 있겠지만...