<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: RSI - моя имплементация упорно не совпадает с Квиковой]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме RSI - моя имплементация упорно не совпадает с Квиковой форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 24 Apr 2026 11:14:42 +0300</pubDate>
		<item>
			<title>RSI - моя имплементация упорно не совпадает с Квиковой</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum1/message38071/topic2715/">RSI - моя имплементация упорно не совпадает с Квиковой</a></b> в форуме <a href="http://forum.quik.ru/forum1/">Система QUIK</a>. <br />
			<p>&quot;Модифицированное скользящее среднее&quot; это частный случай “экспоненциального скользящего среднего”. Для которого сглаживающая константа равна a=1/n</p><p>Где n-длина интервала</p> <br />
			<i>24.05.2019 17:19:51, Сергей Нечепуренко.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum1/message38071/topic2715/</link>
			<guid>http://forum.quik.ru/messages/forum1/message38071/topic2715/</guid>
			<pubDate>Fri, 24 May 2019 17:19:51 +0300</pubDate>
			<category>Система QUIK</category>
		</item>
		<item>
			<title>RSI - моя имплементация упорно не совпадает с Квиковой</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum1/message23811/topic2715/">RSI - моя имплементация упорно не совпадает с Квиковой</a></b> в форуме <a href="http://forum.quik.ru/forum1/">Система QUIK</a>. <br />
			Ну, конкретные вопросы там были, чуть выше кода. Но в общем-то да, только называется это не SMA, а MMA (модифицированная скользящая средняя). Теперь индикаторы совпадают. Но, пожалуй, вариант с EMA я оставлю, мне он даже больше нравится.<br />Спасибо за lua, теперь буду сверять с ним. <br />
			<i>17.04.2017 12:13:55, Василий Пупкин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum1/message23811/topic2715/</link>
			<guid>http://forum.quik.ru/messages/forum1/message23811/topic2715/</guid>
			<pubDate>Mon, 17 Apr 2017 12:13:55 +0300</pubDate>
			<category>Система QUIK</category>
		</item>
		<item>
			<title>RSI - моя имплементация упорно не совпадает с Квиковой</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum1/message23807/topic2715/">RSI - моя имплементация упорно не совпадает с Квиковой</a></b> в форуме <a href="http://forum.quik.ru/forum1/">Система QUIK</a>. <br />
			<a class="blog-p-user-name" id="bp_eA7UicsU" href="/user/4177/" bx-tooltip-user-id="4177">Василий Пупкин</a>, <br /><br />Что именно прокомментировать?<br />Есть конкретные вопросы? <br />
			<i>17.04.2017 11:36:43, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum1/message23807/topic2715/</link>
			<guid>http://forum.quik.ru/messages/forum1/message23807/topic2715/</guid>
			<pubDate>Mon, 17 Apr 2017 11:36:43 +0300</pubDate>
			<category>Система QUIK</category>
		</item>
		<item>
			<title>RSI - моя имплементация упорно не совпадает с Квиковой</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum1/message23802/topic2715/">RSI - моя имплементация упорно не совпадает с Квиковой</a></b> в форуме <a href="http://forum.quik.ru/forum1/">Система QUIK</a>. <br />
			Спасибо!<br />Можете прокомментировать (я LUA впервые вижу).<br /><br />1. Используется простая средняя, а не ЕМА, как у меня (как раз это объясняет схожесть данных).<br />2. Используется аппроксимация вида Avg(N) * (N - 1) + Close(N + 1), т.е. это SMA, а не простая средняя на самом деле.<br />
====code====
<pre>function RSI() --Relative Strength I("RSI") 
&nbsp;&nbsp;&nbsp;&nbsp;local Up = {} 
&nbsp;&nbsp;&nbsp;&nbsp;local Down = {} 
&nbsp;&nbsp;&nbsp;&nbsp;local val_Up = {} 
&nbsp;&nbsp;&nbsp;&nbsp;local val_Down = {} 
return function (I, Fsettings, ds) 
local Out = nil 
local Fsettings=(Fsettings or {}) 
local P = (Fsettings.Period or 14) 
local VT = (Fsettings.VType or "Close") 
local R = (Fsettings.round or "off") 
if I == 1 then 
&nbsp;&nbsp;&nbsp;&nbsp;Up&#91;I&#93; = 0 
&nbsp;&nbsp;&nbsp;&nbsp;Down&#91;I&#93; = 0 
end 
if I&#62;1 then 
&nbsp;&nbsp;&nbsp;&nbsp;local Val = Value(I,VT,ds) 
&nbsp;&nbsp;&nbsp;&nbsp;local ValPrev = Value(I-1,VT,ds) 
&nbsp;&nbsp;&nbsp;&nbsp;if ValPrev &#60; Val then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Up&#91;I&#93; = Val - ValPrev 
&nbsp;&nbsp;&nbsp;&nbsp;else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Up&#91;I&#93; = 0 
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;if ValPrev &#62; Val then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Down&#91;I&#93; = ValPrev - Val 
&nbsp;&nbsp;&nbsp;&nbsp;else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Down&#91;I&#93; = 0 
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;if (I == P) or (I == P+1) then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sumU = 0 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sumD = 0 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = I-P+1, I do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumU = sumU + Up&#91;i&#93; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumD = sumD + Down&#91;i&#93; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Up&#91;I&#93; = sumU/P 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Down&#91;I&#93; = sumD/P 
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;if I &#62; P+1 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Up&#91;I&#93; = (val_Up&#91;I-1&#93; * (P-1) + Up&#91;I&#93;) / P 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Down&#91;I&#93; = (val_Down&#91;I-1&#93; * (P-1) + Down&#91;I&#93;) / P 
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;if I &#62;= P then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = 100 / (1 + (val_Down&#91;I&#93; / val_Up&#91;I&#93;)) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return rounding(Out, R) 
&nbsp;&nbsp;&nbsp;&nbsp;end 
end 
end 
end</pre>
============= <br />
			<i>17.04.2017 11:25:47, Василий Пупкин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum1/message23802/topic2715/</link>
			<guid>http://forum.quik.ru/messages/forum1/message23802/topic2715/</guid>
			<pubDate>Mon, 17 Apr 2017 11:25:47 +0300</pubDate>
			<category>Система QUIK</category>
		</item>
		<item>
			<title>RSI - моя имплементация упорно не совпадает с Квиковой</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum1/message23800/topic2715/">RSI - моя имплементация упорно не совпадает с Квиковой</a></b> в форуме <a href="http://forum.quik.ru/forum1/">Система QUIK</a>. <br />
			Здравствуйте,<br />Посмотрите примеры индикаторов на Lua<br /><noindex><a href="https://forum.quik.ru/forum17/topic1157/" target="_blank" rel="nofollow">https://forum.quik.ru/forum17/topic1157/</a></noindex> <br />
			<i>17.04.2017 11:11:15, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum1/message23800/topic2715/</link>
			<guid>http://forum.quik.ru/messages/forum1/message23800/topic2715/</guid>
			<pubDate>Mon, 17 Apr 2017 11:11:15 +0300</pubDate>
			<category>Система QUIK</category>
		</item>
		<item>
			<title>RSI - моя имплементация упорно не совпадает с Квиковой</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum1/message23799/topic2715/">RSI - моя имплементация упорно не совпадает с Квиковой</a></b> в форуме <a href="http://forum.quik.ru/forum1/">Система QUIK</a>. <br />
			Пишу торговую систему и делаю для неё индикаторы, использую Квик как эталон. Застрял уже на втором. В общем, у меня упорно не совпадает RSI. Какой алгоритм используется в Квике? Подозреваю, что выбрана другая альфа.<br />Вроде реализации ведут себя схожим образом, но довольно сильно не совпадают по значениям.<br />
====code====
<pre>@Override
protected void compute() {

&nbsp;&nbsp; if (this.history.size() == this.indicatorHistory.size()) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; // we are in sync
&nbsp;&nbsp; }

&nbsp;&nbsp; if (this.isFirstRun()) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.indicatorHistory.add(null);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double gain = 0, loss = 0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &#60; this.history.size(); i++) { // skip i = 0 as we can't get delta

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double delta = this.getDelta(i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpDown upDown =&nbsp;&nbsp;new UpDown(Math.max(delta, 0), Math.max(-delta, 0));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (gain == 0) { // Seed our ema
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain = upDown.getGain();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss = upDown.getLoss();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain = this.alpha * upDown.getGain() + (1 - this.alpha) * gain;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss = this.alpha * upDown.getLoss() + (1 - this.alpha) * loss;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &#60; this.length) { // this data is too inaccurate
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.indicatorHistory.add(null);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double RS = (loss == 0) ? 0 : gain / loss;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.indicatorHistory.add(this.computeInternal(i, RS));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp; } else {

&nbsp;&nbsp; }
}

protected double getDelta(int i) {
&nbsp;&nbsp; assert i &#62; 0;
&nbsp;&nbsp; return this.history.get(i).getClose() - this.history.get(i - 1).getClose();
}

protected IndicatorValue&#60;Double&#62; computeInternal(int i, double RS) {
&nbsp;&nbsp; return new IndicatorValue&#60;&#62;(this.history.get(i).getTimestamp(), 100 - 100 / (1 + RS));
}</pre>
============= <br />
			<i>17.04.2017 11:07:12, Василий Пупкин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum1/message23799/topic2715/</link>
			<guid>http://forum.quik.ru/messages/forum1/message23799/topic2715/</guid>
			<pubDate>Mon, 17 Apr 2017 11:07:12 +0300</pubDate>
			<category>Система QUIK</category>
		</item>
	</channel>
</rss>
