У вас не стоит Flash Player
Настройки
#7616 - Thu Jul 01 2010 07:08 PM Стратегия High-Low с фильтром NRTR
Laber Offline
journeyman

Registered: Mon Jun 28 2010
Записи: 59
Скрипт High-Low - пример очень простой, но при этом достаточно эффективной стратегии на языке C#.

Система основана на пробитии уровней Максимум за/Минимум за.
На этот раз мы дополнительно ужесточим условия системы и посмотрим на результаты. Еще одним условием входа в позиции (Long/Short) будет фильтр на основе NRTR (выходы оставим без изменений).

Для реализации стратегии необходимо использовать индикатор NRTR.
NRTR (Nick Rypock Trailing Reverse) – индикатор, основанный на подходе, который используется в «Скользящем фильтре» (информации по нему много в сети, достаточно забить в поисковик Trailing Reverse). Суть данного индикатора – фильтрация незначительных колебаний цен в период тренда и определение разворота тенденции. В итоге мы получаем формулы:

Для восходящих трендов:
NRTR = Highest(Close, period)*(1-(K/100)),

Для нисходящих трендов:
NRTR = Lowest(Close, period)*(1+(K/100)),

Где К – коэффициент, который задается человеком, использующим этот индикатор и отвечающий за величину, на которую значение индикатора отстоит от локальных экстремумов цены.

По-сути, NRTR – это Максимум за/Минимум за, сдвинутые по оси цены на коэф. К и объединенные в одну кривую по определенному правилу.

Для удобства код индикатора вынесен в отдельную функцию (GenNRTR). Код постарался подробно откомментировать, чтобы можно было его быстрее и удобней читать и использовать.
Комментарии и пожелания приветствуются!

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

http://konkop.narod.ru/nrma.htm


Вот так эта система выглядит в коде:

Ссылка на файл: http://www.tslab.ru/ubb/ubbthreads.php?u..._nrtr_script.cs
Code:
/*================================================================================
 * Стратегия: High-Low с фильтром на основе NRTR
 * Платформа: TSLab версия 1.1.7.0
 * Дата создания: 01.07.2010
 * Реализовано: Laber
 *================================================================================*/
 
using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;

namespace TSLab.High_Low_NRTR
{

	public class System_High_Low_NRTR : IExternalScript
	{
		//================================================================================
		// функция вычисления индикатора NRTR (последовательность значений)
		// Period -  период скользящей средней для расчета NRTR
		// Multiple - множитель для расчета NRTR
		public IList<double> GenNRTR(ISecurity source, int Period, double Multiple)
		{
			double vNRTR;
			double K, PrevK;
			double Reverse = 0;
			double Price;
			double HighPrice;
			double LowPrice;
			int Trend = 0;
			int NewTrend;
			
			IList<double> nNRTR = new List<double>(source.Bars.Count);

			//--------------------------------------------------------------------------------
			K = source.ClosePrices[0];
			vNRTR = source.ClosePrices[0];
			HighPrice = source.HighPrices[0];
			LowPrice = source.LowPrices[0];
			for (int bar = 0; bar < source.Bars.Count-1; bar++)
			{
				//--------------------------------------------------------------------------------
				#region calculate values
				Price = source.ClosePrices[bar];

				PrevK = K;
				K = (PrevK + (Price - PrevK) / Period) * Multiple;
				
				NewTrend = 0;
				if (Trend >= 0)
				{
					if (Price > HighPrice) HighPrice = Price;
					Reverse = HighPrice - K;
					if (Price <= Reverse)
					{
						NewTrend = -1;
						LowPrice = Price;
				 		Reverse = LowPrice + K;
					}
				}
				if (Trend <= 0)
				{
					if (Price < LowPrice) LowPrice = Price;
					Reverse = LowPrice + K;
					if (Price >= Reverse)
					{
						NewTrend = +1;
						HighPrice = Price;
				 		Reverse = HighPrice - K;
					}
				}
				if (NewTrend != 0) Trend = NewTrend;
				
				// значение NRTR
				vNRTR = Reverse;
				
				#endregion
				//--------------------------------------------------------------------------------
				// добавление нового значения в последовательность
				nNRTR.Add(vNRTR);
			}
			return nNRTR;
			
		}
		

		//================================================================================
		// Параметры оптимизации задаются при помощи типа OptimProperty.
		// Параметры оптимизации для длинных позиций 
		public OptimProperty High1Period = new OptimProperty(85, 10, 100, 5);
		public OptimProperty Low1Period = new OptimProperty(60, 10, 100, 5);

		// Параметры оптимизации для коротких позици
		public OptimProperty Low2Period = new OptimProperty(70, 10, 100, 5);
		public OptimProperty High2Period = new OptimProperty(85, 10, 100, 5);

		// Параметры оптимизации для расчета индикатора NRMA
		// ParamPeriod - параметр оптимизации для периода скользящей средней
		// ParamMultiple - параметр оптимизации для множителя
		public OptimProperty ParamPeriod = new OptimProperty(10, 2, 20, 2);
		public OptimProperty ParamMultiple = new OptimProperty(0.1, 0.1, 1, 0.1);
		
		//================================================================================
		public virtual void Execute(IContext ctx, ISecurity source)
		{
			#region Variables
			int MDir; // напраление индикатора NRTR (+1 вверх, -1 вниз)
			double vNRTR; // значение NRTR для текущего бара
			int Period; // период скользящей средней для расчета NRTR
			double Multiple; // множитель для расчета NRTR
			double Price; // текущая цена закрытия
			#endregion
			//--------------------------------------------------------------------------------
			// Obtain parameters
			Period = ParamPeriod;
			Multiple = ParamMultiple;
			MDir = 0;
			
			// серия значений индикатора NRTR
			// кэширование с учетом параметров Period и Multiple
			IList<double> nNRTR = ctx.GetData("NRTR", new[] {Period.ToString()+"_"+Multiple.ToString()},
			delegate { return GenNRTR(source, Period, Multiple); });
			
			// серия значений для направления скользящей средней
			IList<double> nMDir = new List<double>(source.Bars.Count);
			//================================================================================
			#region Вычисляем максимумы и минимумы.
			// Используем GetData для кеширования данных и ускорения оптимизация.
			// При неиспользовании кэша увеличивается объем обрабатываемых данных, что ведет к сильному замедлению оптимизации.
			// Следует учесть, что необходимо перечислить абсолютно все изменяемые переменные используемые в вычислениях.
			// Не соблюдение этого правила приведет к некорректной работе и результатам оптимизации.
			IList<double> high1 = ctx.GetData("Highest", new[] {High1Period.ToString()},
			delegate { return Series.Highest(source.HighPrices, High1Period); });
			IList<double> low1 = ctx.GetData("Lowest", new[] {Low1Period.ToString()},
			delegate { return Series.Lowest(source.LowPrices, Low1Period); });
			IList<double> high2 = ctx.GetData("Highest", new[] {High2Period.ToString()},
			delegate { return Series.Highest(source.HighPrices, High2Period); });
			IList<double> low2 = ctx.GetData("Lowest", new[] {Low2Period.ToString()},
			delegate { return Series.Lowest(source.LowPrices, Low2Period); });
 
			#endregion
			// =================================================
			#region прорисовка графиков
			// Берем основную панель (Pane).
			IPane mainPane = ctx.First;
		 
			// Отрисовка графиков.
			mainPane.AddList(string.Format("High1({0}) [{1}]", High1Period, source.Symbol), high1, ListStyles.LINE,
			0x00ff00, LineStyles.SOLID, PaneSides.RIGHT);
			mainPane.AddList(string.Format("Low1({0}) [{1}]", Low1Period, source.Symbol), low1, ListStyles.LINE,
			0xff0000, LineStyles.SOLID, PaneSides.RIGHT);
			mainPane.AddList(string.Format("Low2({0}) [{1}]", Low2Period, source.Symbol), low2, ListStyles.LINE,
			0xff0000, LineStyles.DASH, PaneSides.RIGHT);
			mainPane.AddList(string.Format("High2({0}) [{1}]", High2Period, source.Symbol), high2, ListStyles.LINE,
			0x00ff00, LineStyles.DASH, PaneSides.RIGHT);
			
			mainPane.AddList("NRTR", nNRTR, ListStyles.LINE, 0xa000a0, LineStyles.SOLID, PaneSides.RIGHT);

			#endregion
			// =================================================
			#region Основной цикл обработки (торговля).
			
			int barsCount = source.Bars.Count;
			for (int bar = 0; (bar < barsCount-1); bar++)
			{
				//--------------------------------------------------------------------------------
				#region calculate values
				// значение NRTR
				vNRTR = nNRTR[bar];
				Price = source.ClosePrices[bar];

				// изменение направления индикатора NRTR
				if ((MDir > -1) && (vNRTR < Price)) MDir = -1;
				if ((MDir < 1) && (vNRTR > Price)) MDir = 1;
				
				// добавление новых значений в последовательность
				nMDir.Add(MDir);
				         
				#endregion
				//--------------------------------------------------------------------------------
				#region execute signals
				//--------------------------------------------------------------------------------
				// выполнение сигналов для длинной позиции
				IPosition LongPos = source.Positions.GetLastActiveForSignal("LN");
				if (LongPos == null)
				{
					// Если нет активной длинной позиции, 
					if (MDir > 0)
					{
						// если направление индикатора NRMA вверх
						// выдаем условный ордер на открыте новой длинной позиции.
						source.Positions.BuyIfGreater(bar + 1, 1, high1[bar], "LN");
					}
				}
				else
				{
					// Если есть активная длинная позиция, 
					// выдаем условный ордер на закрыте длинной позиции.
					LongPos.CloseAtStop(bar + 1, low1[bar], "LX");
				}
				//--------------------------------------------------------------------------------
				// выполнение сигналов для короткой позиции
				IPosition ShortPos = source.Positions.GetLastActiveForSignal("SN");
				if (ShortPos == null)
				{
					// Если нет активной короткой позиции, 
					if (MDir < 0)
					{
						// если направление индикатора NRMA вниз
						// выдаем условный ордер на открыте новой короткой позиции.
						source.Positions.SellIfLess(bar + 1, 1, low2[bar], "SN");
					}
				}
				else
				{
					// Если есть активная короткая позиция, 
					// выдаем условный ордер на закрыте короткой позиции.
					ShortPos.CloseAtStop(bar + 1, high2[bar], "SX");
				}
				#endregion
			}
			#endregion
			//================================================================================
			#region прорисовка графиков
			// Создаем дополнительную панель.
			IPane FilterPane = ctx.CreatePane("Filtr", 10, false, false);

			// Отрисовка графика фильтра позиции
			FilterPane.AddList(string.Format("Filter NRTR"), nMDir, ListStyles.LINE,
			0x00ff00, LineStyles.SOLID, PaneSides.RIGHT);
			
 			#endregion
			// =================================================
		}
	}
}




На графике отображены границы ценовых каналов:





Результаты тестирования стратегии.


Кривая капитала:




Отчет с результатами тестирования:





В прикрепленных файлах можно найти всю необходимую информацию по этой стратегии.



Attachments
chart.png (9018 downloads)
Description: сриншот графика с границами ценовых каналов

profit.png (8314 downloads)
Description: скриншот кривой капитала (доходности стратегии)

report.png (8343 downloads)
Description: скриншот отчета по результатам тестирования

high_low_nrtr_scheme.xml (1029 downloads)
Description: блок-схема в xml-формате

high_low_nrtr_script.cs (1403 downloads)
Description: скрипт на C#




Отредактировано Laber (Thu Jul 01 2010 07:10 PM)

Наверх
#7630 - Thu Jul 01 2010 09:21 PM Re: Стратегия High-Low с фильтром NRTR [Re: Laber]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
Против рынка торгует.Хороший пример.
_________________________
Делаю простые вещи.

Наверх
#7631 - Thu Jul 01 2010 09:27 PM Re: Стратегия High-Low с фильтром NRTR [Re: profit]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
Вариант по рынку сделаете икс м л?
_________________________
Делаю простые вещи.

Наверх
#10033 - Fri Aug 13 2010 05:54 PM Re: Стратегия High-Low с фильтром NRTR [Re: profit]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
NRTR очень интересный фильтр.На форуме в примерах нет такого индикатора до сих пор.Где его взять?И ещё в вашем примере открытие в лонг происходит когда фильтр находится выше цены.Как сменить полярность вашему примеру?
_________________________
Делаю простые вещи.

Наверх
#10037 - Fri Aug 13 2010 06:57 PM Re: Стратегия High-Low с фильтром NRTR [Re: profit]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
Вот нашёл кажись. MDir < 0
_________________________
Делаю простые вещи.

Наверх
#10038 - Fri Aug 13 2010 06:59 PM Re: Стратегия High-Low с фильтром NRTR [Re: profit]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
Ещё бы с хай лоу разобратся как настраивать.
_________________________
Делаю простые вещи.

Наверх
#10039 - Fri Aug 13 2010 07:02 PM Re: Стратегия High-Low с фильтром NRTR [Re: profit]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
Где то я уже это видел.

На сколько я понял это не намного сложнее чем кубики.

Как расписание добавить правильно?
_________________________
Делаю простые вещи.

Наверх
#23545 - Sat Mar 19 2011 08:30 AM Re: Стратегия High-Low с фильтром NRTR [Re: profit]
serg Offline
Pooh-Bah

Registered: Fri May 14 2010
Записи: 1663
Loc: Россия
М-р Laber !
при пользовании вашей Нi Lo + NRTR обнаружил что короткие позы не открываются....может что то я не узрел ? Хотя сам скрипт работает но только в лонг....
Заранее благодарен)))
PS Хотя я может и зря спрашиваю...."... был толмач только его в кипятке сварили.." или нет:)))


Attachments
NRTR.JPG (761 downloads)
NRTR результаты.JPG (889 downloads)
NRTR результаты кривая.JPG (975 downloads)



Отредактировано serg (Sat Mar 19 2011 04:07 PM)

Наверх
#23644 - Mon Mar 21 2011 10:45 AM Re: Стратегия High-Low с фильтром NRTR [Re: serg]
serg Offline
Pooh-Bah

Registered: Fri May 14 2010
Записи: 1663
Loc: Россия
и все же кто нибудь ответить ? или все таки сварили... )))

Наверх


Moderator:  ViL, sar