확률 지표. 호기심 많은 관찰.

 

제 생각에는 - 스토캐스틱은 자동 거래에 있어 상당히 유망한 지표입니다.

그러나 모든 것이 그렇게 간단하지 않다는 것이 밝혀졌습니다! 연습과 기술을 위해 급하게 가장 간단한(문자 그대로 12줄) Stochastic Expert Advisor를 만들었습니다. "과잉"이 없습니다.

입구 - 신호선의 본선을 건너는 것. 각기:

 int start ()
  {
 
 
double StochK_0 = iStochastic ( NULL , 0 , K_period , D_period , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double StochK_1 = iStochastic ( NULL , 0 , K_period , D_period , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
 
double StochD_0 = iStochastic ( NULL , 0 , K_period , D_period , 3 , MODE_SMA , 0 , MODE_PLUSDI , 0 ) ;
 
 
//===== Ищем возможность войти в рынок ==================================================
 
int Orders = OrdersTotal () ;     //получаем кол-во открытых ордеров
if ( Orders == 0 )                 //если нет открытых ордеров
  {  
//---------проверяем условие на покупку----------------------------
  if   (  ( StochK_1 < StochD_0 )  &&
          ( StochK_0 > StochD_0 )  )
   {
  ticket = ... ...          
   }
 
//--------проверяем условие на продажу------------------------------
  if  (   ( StochK_1 > StochD_0 )  &&
          ( StochK_0 < StochD_0 )) 
   {       
  ticket =... ...       
   }

그런 다음 눈으로 최적화하고 테스터에서 1년 반 동안 운전했습니다. 그리고 여기에서 그것이 발견되었거나 오히려 나의 오랜 관찰이 확인되었습니다! 스토캐스틱은 대칭적인 지표가 전혀 아닙니다. 많은 사람들이 생각하는 것처럼. 지표의 동적 범위는 구조로 인해 다양한 방식으로 가격 변동을 위아래로 표시합니다!

이것이 우리가 수동 및 자동을 사용하는 이유입니다. SELL 포지션을 열 때 거래할 때 때때로 우리는 처음에 불리한 상황에 놓이게 됩니다.

기호 GBPUSD (영국 파운드 vs 미국 달러) 기간 4시간(H4) (2006.01.01 - 2007.08.31)

모든 틱 모델링(각 틱의 프랙탈 보간으로 사용 가능한 모든 가장 작은 기간을 기반으로 함)

시뮬레이션 품질 90.00% 초기 보증금 10000.00

순이익 3667.00

총 이익 9801.02

총 손실 -6134.02 이익 1.60

예상 승리 13.94 절대 하락 202.02 최대 하락 438.24 (3.25%) 상대 하락 3.25% (438.24)

총 거래 263

숏포지션(%원) 134(51.49%)

롱포지션(%원) 129(67.44%)

수익성 있는 거래(전체의 %) 156(59.32%)

손실 거래(전체의 %) 107(40.68%)

가장 큰 수익을 내는 거래 130.00

무역 손실 -60.56

평균 승리 거래 62.83

무역 손실 -57.33

모든 레이아웃, 옵션 및 매개 변수를 사용하여 다양한 쌍에 대한 표시기를 사용할 때 긴 거래가 짧은 거래보다 더 유망하다는 것이 항상 밝혀졌습니다.

항상 긴 거래에서 수익성 있는 거래의 수는 최대 80%로 밝혀졌습니다.

그리고 짧은 것에서 - 기껏해야 - 50/55%.

또한 이것은 신호 라인 의 입구와 과매수 / 과매도 수준, 심지어 iOnArray에도 있습니다 ...

결론 - 스토캐스틱을 사용하는 경우 매수와 매도의 매개변수를 별도로 설정해야 합니다. 저것들. 두 개의 지표를 사용하십시오.

 

스토캐스틱은 값을 소급하여 변경하는 역겨운 속성을 가지고 있습니다. 특히 더 높은 기간에서 값을 가져오는 경우에 그렇습니다.

이 문제가 아니라면 더 나은 지표를 찾기 어려울 것입니다!

그리고 더 조잡한 지표는 찾기 어렵습니다!

 
Aleksey24 :

스토캐스틱은 값을 소급하여 변경하는 역겨운 속성을 가지고 있습니다. 특히 더 높은 기간에서 값을 가져오는 경우에 그렇습니다.

이 문제가 아니라면 더 나은 지표를 찾기 어려울 것입니다!


말도 안되는 소리. 이런 스토캐스틱 어디서 봤어?
 
leonid553 :

스토캐스틱은 대칭적인 지표가 전혀 아닙니다. 많은 사람들이 생각하는 것처럼. 지표의 동적 범위는 구조로 인해 다양한 방식으로 가격 변동을 위아래로 표시합니다!

역시 같은 결론. 스토캐스틱 공식을 아시나요?
 

아니다. 99/1.

전체 스토캐스틱 코드는 'Stochastic Oscillator, Stochastic' 에서 사용할 수 있다는 것을 알고 계셨습니까?

다음과 같은 사실에 대해 유죄인 코드의 어딘가를 손가락으로 가리키는 것이 어렵습니까?

- "SELL 포지션을 열 때, 때때로 우리는 처음에 불리하게 된다"?

- "스토캐스틱은 값을 소급적으로 바꾸는 역겨운 성질을 가지고 있다"?

 

여기에 여러분 모두를 위한 확률론의 비대칭성에 대한 분명한 증거가 있습니다.

표시기에 매달린 채널은 하단에서 지속적으로 좁아지고 상단에서 넓어집니다. 아니면 여기에서 수식을 숫자로 지루하게 분해해야합니까?

 

스토캐스틱 공식을 피상적으로 살펴보면 비대칭의 "유죄"가 지표의 단극성이라고 높은 확률로 이미 가정할 수 있습니다!

그리고 나는 "소급적으로 가치"의 변화에 대해 아무 말도 할 수 없습니다. 만나지 않았습니다.

 

그리고 "거울"공식은 무엇을 줄 것입니까?

%K = 100*SUM(MAX(HIGH, Pk)-CLOSE), Sk) / SUM(MAX(HIGH, Pk) - MIN(LOW, Pk)), Sk)

 

바로 알기 어렵습니다. 미러 인디케이터의 코드를 작성해야 합니다. 그래프에서 구성을 비교하십시오.

자동 거래의 경우 표시의 차이가 중요합니다. 일반 칠면조에서 Bai를 입력합니다. 거울 위에서 - in Cell.

 

좋은 소스 코드를 사용할 수 있으며 쉽게 교체할 수 있습니다. 인식을 위해서만 이론상 더 자연스러울 것입니다.

%K = 100*(1-SUM(MAX(HIGH, Pk)-CLOSE), Sk) / SUM(MAX(HIGH, Pk) - MIN(LOW, Pk)), Sk))

 
leonid553 :

스토캐스틱 공식을 피상적으로 살펴보면 비대칭의 "유죄"가 지표의 단극성이라고 높은 확률로 이미 가정할 수 있습니다!

그리고 나는 "소급적으로 가치"의 변화에 대해 아무 말도 할 수 없습니다. 만나지 않았습니다.

표시기의 단극성 - 수정 가능:
- 표준 표시기에서
 iStochastic
Bid에 의해 형성된 High 및 Close가 사용됩니다. 이것이 요점입니다. 이게 가장 큰 실수!!! 특히 스토캐스틱!!! 그리고 특히 짧은 기간 동안!
나는 프로그래머가 아니며 엄격하게 판단하지 않으며 스스로 표준 스토캐스틱을 완성했습니다. 올바르게 작동:
 //+------------------------------------------------------------------+
//| $Stochastic. mq4 |
//| Vladimir |
//+------------------------------------------------------------------+
 
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1 80
#property indicator_level2 50
#property indicator_level3 20
 
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
//---- input parameters
extern int KPeriod = 6 ;
extern int DPeriod = 2 ;
extern int Slowing = 1 ;
//---- buffers
double MainBuffer [] ;
double SignalBuffer [] ;
double HighesBuffer [] ;
double LowesBuffer [] ;
//----
int draw_begin1 = 0 ;
int draw_begin2 = 0 ;
double CHigh , CClose ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init ()
{
string short_name ;
//---- 2 additional buffers are used for counting.
IndicatorBuffers ( 4 ) ;
SetIndexBuffer ( 2 , HighesBuffer ) ;
SetIndexBuffer ( 3 , LowesBuffer ) ;
//---- indicator lines
SetIndexStyle ( 0 , DRAW_LINE ) ;
SetIndexBuffer ( 0 , MainBuffer ) ;
SetIndexStyle ( 1 , DRAW_LINE ) ;
SetIndexBuffer ( 1 , SignalBuffer ) ;
//---- name for DataWindow and indicator subwindow label
short_name = " Stochastic( " + KPeriod + " , " + DPeriod + " , " + Slowing + " ) " ;
IndicatorShortName ( short_name ) ;
SetIndexLabel ( 0 , short_name ) ;
SetIndexLabel ( 1 , " Signal " ) ;
//----
draw_begin1 = KPeriod + Slowing ;
draw_begin2 = draw_begin1 + DPeriod ;
SetIndexDrawBegin ( 0 , draw_begin1 ) ;
SetIndexDrawBegin ( 1 , draw_begin2 ) ;
//----
CHigh = MarketInfo ( Symbol () , MODE_SPREAD ) * MarketInfo ( Symbol () , MODE_POINT ) ; // Вычисляем спред
CClose = CHigh / 2.0 ; // Спред пополам
//----
return ( 0 ) ;
}
//+------------------------------------------------------------------+
//| Stochastic oscillator |
//+------------------------------------------------------------------+
int start ()
{
int i , k ;
int counted_bars = IndicatorCounted () ;
double price ;
//----
if ( Bars <= draw_begin2 ) return ( 0 ) ;
//---- initial zero
if ( counted_bars < 1 )
{
for ( i = 1 ; i <= draw_begin1 ; i ++ ) MainBuffer [ Bars - i ] = 0 ;
for ( i = 1 ; i <= draw_begin2 ; i ++ ) SignalBuffer [ Bars - i ] = 0 ;
}
//---- minimums counting
i = Bars - KPeriod ;
if ( counted_bars > KPeriod ) i = Bars - counted_bars - 1 ;
while ( i >= 0 )
{
double min = 1000000 ;
k = i + KPeriod - 1 ;
while ( k >= i )
{
price = Low [ k ] ;
if ( min > price ) min = price ;
k --;
}
LowesBuffer [ i ] = min ;
i --;
}
//---- maximums counting
i = Bars - KPeriod ;
if ( counted_bars > KPeriod ) i = Bars - counted_bars - 1 ;
while ( i >= 0 )
{
double max =- 1000000 ;
k = i + KPeriod - 1 ;
while ( k >= i )
{
price = High [ k ] + CHigh ;
if ( max < price ) max = price ;
k --;
}
HighesBuffer [ i ] = max ;
i --;
}
//---- %K line
i = Bars - draw_begin1 ;
if ( counted_bars > draw_begin1 ) i = Bars - counted_bars - 1 ;
while ( i >= 0 )
{
double sumlow = 0.0 ;
double sumhigh = 0.0 ;
for ( k = ( i + Slowing - 1 ) ; k >= i ; k -- )
{
sumlow += Close [ k ] + CClose - LowesBuffer [ k ] ;
sumhigh += HighesBuffer [ k ] - LowesBuffer [ k ] ;
}
if ( sumhigh == 0.0 ) MainBuffer [ i ] = 100.0 ;
else MainBuffer [ i ] = sumlow / sumhigh * 100 ;
i --;
}
//---- last counted bar will be recounted
if ( counted_bars > 0 ) counted_bars --;
int limit = Bars - counted_bars ;
//---- signal line is simple movimg average
for ( i = 0 ; i < limit ; i ++ )
SignalBuffer [ i ] = iMAOnArray ( MainBuffer , Bars , DPeriod , 0 , MODE_SMA , i ) ;
//----
return ( 0 ) ;
}
//+------------------------------------------------------------------+
사유: