Помощь в кодировании - страница 170

 

Да... я не знаю, насколько я рассеян. Благодаря вашему своевременному совету, числа TB_TotalCount и VACount стали правильными и абсолютно разумными. Но мои задачи по поиску VA High/Low все еще в беде, мой компьютер снова сломался с этой частью кодирования. Пытаюсь снова понять причину.

Большое спасибо Младен! Ваш совет дал мне частичную улыбку после целой белой ночи.

 

Привет, Младен,

Хочу сообщить, что наконец-то я решил оставшуюся часть своей проблемы. Пытаюсь улучшить ее еще больше.

Хотя Вы дали мне так мало помощи, как только могли в этом случае, но я обнаружил, что это иногда лучший метод обучения тех, кто учится, стоя на ногах.

От всего сердца благодарю тебя, Младен!

Счастливых дней тебе,

fareastol

 
zilliq:
Привет, Младен,

У меня получается использовать относительный и абсолютный импульс

Большое спасибо за помощь, теперь мне нужно сгладить импульс для rsx.

Zilliq

Ps: Если это может кому-то помочь:

//Относительный импульс на закрытии

ind1= close-close[1]

//Абсолютный импульс

ind2=abs(ind1)

ind3=wilderAverage[rs](ind1)

ind4=wilderAverage[rs](ind2)

ind3=(50*(ind3+ind4))/ind4

return ind3 as "RSI",0, 30, 70, 100

Zilliq

Посмотрите на этот пост: https: //www.mql5.com/en/forum/178733/page36

Там есть пример того, как это (сглаживание) может быть сделано

 

Спасибо, Младен, я посмотрю.

Хорошего дня и тысячи благодарностей за вашу помощь и работу.

Zilliq

 

Ну, если я правильно понял в вашем индикаторе rsi smoother 2, вы просто изменяете более дикое среднее значение функцией ismooth

И вы "сглаживаете" относительный и абсолютный импульс.

Я делаю то же самое с Hull average, но результат не такой, как вы видите на моей картинке.

Есть ли у вас идея, почему, или я ошибаюсь?

Спасибо Младен

И код RSI14 и RSIsmoother 45.

//Относительный моментум на закрытии

ind1= close-close[1]

//Абсолютный импульс

ind2=abs(ind1)

// Сглаживание относительного импульса с помощью средней по Халлу

v =(2*weightedAverage[round(rs/2)](ind1))-weightedAverage[rs](ind1)

ind3 = weightedAverage[Round(Sqrt(rs))](v)

// Сглаживание абсолютного импульса с помощью среднего по корпусу

v2 = (2*weightedAverage[round(rs/2)](ind2))-weightedAverage[rs](ind2)

ind4 = weightedAverage[Round(Sqrt(rs))](v2)

ind5=(50*(ind3+ind4))/ind4

return ind5 as "RSI smooth"

Я заменяю дикое среднее на T3 Tillson на обоих (относительный и абсолютный импульс), с той же проблемой

Файлы:
 

Это просто результат использования различных методов сглаживания. Разное сглаживание дает разные результаты

Если вы хотите получить результаты, сравнимые с rsi, опубликованными в потоке rsi, вы должны использовать тот тип сглаживания, который используется в этом индикаторе.

 

Спасибо Младен за ваш ответ

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

Можете ли вы объяснить с математической формулой (если возможно), как работает сглаживание функции ismooth в MT4, чтобы получить гладкий RSI, сравнимый с RSI, пожалуйста, и я буду кодировать его после того, как

Большое спасибо и хорошего дня

Zilliq

Ваш код MT4 и моя интерпретация:

// относительный импульс

double mom = iMA(NULL,0,1,0,MODE_SMA,Price,i)-iMA(NULL,0,1,0,MODE_SMA,Price,i+1);

//абсолютный импульс

double moa = MathAbs(mom);

//Сглаживание относительного импульса с помощью "функции ismooth"

double tmom = iSmooth(mom,Length,SmoothSpeed,i,0);

//Сглаживание абсолютного импульса с помощью функции "ismooth"

double tmoa = iSmooth(moa,Length,SmoothSpeed,i,1);

if (tmoa != 0)

//Вычисляем отношение 50*(RM+AM)(AM)

rsi = MathMax(MathMin((tmom/tmoa+1.0)*50.0,100.00),0.00);

else rsi = 50;

 

Zilliq

У вас есть его исходный код в этом индикаторе. Просто преобразуйте его в prorealtime

 

Мне не так просто интерпретировать функцию ismooth (MT4 настолько сложна по сравнению с PRT).

Я пытаюсь перевести код MT4 в математический код, чтобы затем закодировать его на PRT.

Пожалуйста, не могли бы вы подтвердить мою интерпретацию различных строк под каждой строкой, прежде чем я закодирую ее на PRT.

Большое спасибо, Младен

Zilliq

double iSmooth(double price,int length, double speed, int r, int instanceNo=0)

{

if (ArrayRange(workSmooth,0)!=Bars) ArrayResize(workSmooth,Bars); instanceNo *= 5; r = Bars-r-1;

if(r<=2) { workSmooth[r] = price; workSmooth[r] = price; workSmooth[r] = price; workSmooth[r] = price; return(price); }

//

//

//

//

//

_______________________________________________________________________

double beta = 0.45*(length-1.0)/(0.45*(length-1.0)+2.0);

бета = 0.45*(длина-1.0)/(0.45*(длина-1.0)+2.0)

_______________________________________________________________________

double alpha = MathPow(beta,speed);

альфа = бета^скорость

_______________________________________________________________________

workSmooth[r] = price+alpha*(workSmooth[r-1]-price);

Filt0 = price+alpha*(Filt0[1]-price);

_______________________________________________________________________

workSmooth[r] = (цена - workSmooth[r])*(1-alpha)+alpha*workSmooth[r-1];

Filt1 = (цена - Filt0 )*(1-альфа)+альфа*Filt1[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r];

Filt2 = Filt0 + Filt1

_______________________________________________________________________

workSmooth[r] = (workSmooth[r] - workSmooth[r-1])*MathPow(1.0-alpha,2) + MathPow(alpha,2)*workSmooth[r-1];

Filt3=Filt2-Filt4[1]*(1-alpha)*(1-alpha)+alpha*alpha*Filt3[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r-1];

Filt4=Filt3+Filt4[1]

_______________________________________________________________________

return(workSmooth[r]);

return Filt4

 
zilliq:
Ой, не так просто для меня интерпретировать функцию ismooth (MT4 настолько сложна по сравнению с PRT).

Я пытаюсь перевести код MT4 в математический код, чтобы затем закодировать его на PRT.

Пожалуйста, вы можете подтвердить мою интерпретацию различных строк под каждой строкой до того, как я закодирую ее на PRT.

Большое спасибо, Младен

Zilliq

double iSmooth(double price,int length, double speed, int r, int instanceNo=0)

{

if (ArrayRange(workSmooth,0)!=Bars) ArrayResize(workSmooth,Bars); instanceNo *= 5; r = Bars-r-1;

if(r<=2) { workSmooth[r] = price; workSmooth[r] = price; workSmooth[r] = price; workSmooth[r] = price; return(price); }

//

//

//

//

//

_______________________________________________________________________

double beta = 0.45*(length-1.0)/(0.45*(length-1.0)+2.0);

бета = 0.45*(длина-1.0)/(0.45*(длина-1.0)+2.0)

_______________________________________________________________________

double alpha = MathPow(beta,speed);

альфа = бета^скорость

_______________________________________________________________________

workSmooth[r] = price+alpha*(workSmooth[r-1]-price);

Filt0 = price+alpha*(Filt0[1]-price);

_______________________________________________________________________

workSmooth[r] = (цена - workSmooth[r])*(1-alpha)+alpha*workSmooth[r-1];

Filt1 = (цена - Filt0 )*(1-альфа)+альфа*Filt1[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r];

Filt2 = Filt0 + Filt1

_______________________________________________________________________

workSmooth[r] = (workSmooth[r] - workSmooth[r-1])*MathPow(1.0-alpha,2) + MathPow(alpha,2)*workSmooth[r-1];

Filt3=Filt2-Filt4[1]*(1-alpha)*(1-alpha)+alpha*alpha*Filt3[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r-1];

Filt4=Filt3+Filt4[1]

_______________________________________________________________________

return(workSmooth[r]);

возврат Filt4

Насколько я понимаю, так и должно быть, но учтите, что я никогда не работал с prorealtime.

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