Дневник робота
Atom
03.10.2011
StockSharp


Всем привет! В нашем блоге поместил два поста о результатах работы одного нашего торгового робота. Идея для стратегии моя, реализация - Муханчиков Александр. Первый пост "как бы" двухмесячной давности. Еще тогда хотел поместить его, но ждал, когда на сайте появится раздел Статьи. В итоге решил, что так все интересное пройдет и запостил в блог. Второй пост со свежими данными, только что из печки. Присоединяйтесь к обсуждению и пишите о своих успехах!

Вот выдержка из статьи

Итак, мы имеем систему с очень привлекательными показателями доходности, и нам не хотелось бы отказываться от неё. Что же делать? Давайте вернемся с устойчивости самой системы. График оптимизации значений параметра, как мы помним, имеет плохую картинку, которая предостерегает нас о возможности переоптимизации – подгонки под определенный цикл рынка. Эту подгонку под определенный период рынка мы можем увидеть, посмотрев на распределение прибыли по месяцам. ( В WLD – это вкладка By Period, выбираем период по месяцам). Если стратегия подогнана под определенный рыночный цикл, следует ожидать, что будут сильно выделяться несколько месяцев по прибыли, также будут месяцы по прибыли близкие к 0 или же вовсе убыточные.

торговые роботы

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

Вы хотите работать командой и делиться идеями?



Спасибо:


< 1 2 3 4  >
StockSharp

Фотография
Дата: 18.10.2011
Ответить


Не пощажу ваши экраны.. код ниже.

Стратегия на часовиках

Суть стратегии - если цена прошла вверх Н пунктов, потом вниз столько же, строится уровень по пику, если цена рпобивает этот уровень, ниже этого пика ставится стоп ордер на вход. После входа стоп тянется по пикам.

Код
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies
{
	public class MyStrategy : WealthScript
	{

		
		//StrategyParameter Stop;
		StrategyParameter Step;
		StrategyParameter PeakRange;
		StrategyParameter DeltaStop;
		StrategyParameter Mode;
		
		public MyStrategy()
		{
			//Stop = CreateParameter("Stop", 3000, 1000, 5000, 200);
			Step = CreateParameter("Step", 3200, 100, 3500, 100);
			DeltaStop = CreateParameter("DeltaStop", 0, 100, 3500, 100);
			PeakRange = CreateParameter("PeakRange", 2700, 900, 3000, 100);
			Mode = CreateParameter("Mode", 0, -1, 1, 1);
		}

		protected override void Execute()
		{
			
			//double stoploss = Stop.Value;
			double stoploss = Step.Value + DeltaStop.Value;
			
			double StopPrice = 0;
			double TakePrice = 0;
			double price,LowestLow,HighestHigh;
			double delta;
			
			
			DataSeries Peaks = Peak.Series( High, PeakRange.ValueInt, PeakTroughMode.Value);			
			DataSeries Troughs = Trough.Series( Low, PeakRange.ValueInt, PeakTroughMode.Value);
			
			//DataSeries HighestSeries = Highest.Series(High,Period.ValueInt);
			//DataSeries LowestSeries = Lowest.Series(Low,Period.ValueInt);
				
			double LastPeakSignalPrice = 0;
			double WorkingPeak = 0;
			double WorkingHigh = 0;
			double PeakSignalPrice = 0;			
			bool SetShortOrderMode = false;

			double LastTroughSignalPrice = 0;
			double WorkingTrough = 0;
			double WorkingLow = 0;
			double TroughSignalPrice = 0;			
			bool SetBuyOrderMode = false;
			
			double trailingStop;
			
			DataSeries PeakSignalPriceSeries = new DataSeries(Bars,"PeakSignalPriceSeries");
			DataSeries TroughSignalPriceSeries = new DataSeries(Bars,"PeakSignalPriceSeries");
			
			
			for(int bar = 20; bar < Bars.Count; bar++)
			{		
						
				PeakSignalPriceSeries[bar] = Close[bar];
				TroughSignalPriceSeries[bar] = Close[bar]; 
				
				foreach( Position p in Positions )
				{
					if ( p.Active )
					{
						if (p.PositionType == PositionType.Short)					
						{
							trailingStop = p.TrailingStop;							
							if (Peaks[bar]!= WorkingPeak)
								if (p.TrailingStop > Peaks[bar]) trailingStop = Peaks[bar];
							if (!Bars.IsLastBarOfDay(bar)) ExitAtTrailingStop(bar+1,p,trailingStop,"ExitAtTrailingStop");
						}
						if (p.PositionType == PositionType.Long)					
						{
							trailingStop = p.TrailingStop;
							if (Troughs[bar]!= WorkingTrough)
								if (p.TrailingStop < Troughs[bar]) trailingStop = Troughs[bar];
							if (!Bars.IsLastBarOfDay(bar)) ExitAtTrailingStop(bar+1,p,trailingStop,"ExitAtTrailingStop");
						}						
					}
				}				
						
				if (Mode.Value != 1)
					if (High[bar-1]>Peaks[bar-1])
					{											
						WorkingPeak	= Peaks[bar-1];
						if (WorkingHigh<High[bar-1]) WorkingHigh=High[bar-1];
						PeakSignalPrice = WorkingPeak - Step.Value;	
						SetShortOrderMode = true;
					}
							
				if ((SetShortOrderMode)&&(LastPeakSignalPrice != PeakSignalPrice))
				{
					Position p = null;
					if (!Bars.IsLastBarOfDay(bar-1))
					{
						p = ShortAtStop(bar, PeakSignalPrice);		
						PeakSignalPriceSeries[bar] = PeakSignalPrice;
					}
					if (p != null) 
					{							
						SetShortOrderMode = false;	
						LastPeakSignalPrice = PeakSignalPrice;		
						trailingStop = p.EntryPrice + stoploss;
						ExitAtTrailingStop(bar+1,p,trailingStop,"ExitAtTrailingStop");
					}
				}			
				
				if (Mode.Value != -1)
					if (Low[bar-1]<Troughs[bar-1])
					{								
						WorkingTrough = Troughs[bar-1];
						if (WorkingLow>Low[bar-1]) WorkingLow=Low[bar-1];
						TroughSignalPrice = WorkingTrough + Step.Value;	
						SetBuyOrderMode = true;
					}
							
				if ((SetBuyOrderMode)&&(LastTroughSignalPrice != TroughSignalPrice))
				{
					Position p = null;
					if (!Bars.IsLastBarOfDay(bar-1))
					{
						p = BuyAtStop(bar, TroughSignalPrice);			
						TroughSignalPriceSeries[bar] = TroughSignalPrice;
					}
					if (p != null) 
					{							
						SetBuyOrderMode = false;	
						LastTroughSignalPrice = TroughSignalPrice;
						trailingStop = p.EntryPrice - stoploss;
						ExitAtTrailingStop(bar+1,p,trailingStop,"ExitAtTrailingStop");
					}
				}	


				
			}//for

			PlotSeries( PricePane, Peaks, Color.Green, LineStyle.Dots, 3 );
			PlotSeries( PricePane, Troughs, Color.Red, LineStyle.Dots, 3 );
			
			PlotSeries( PricePane, PeakSignalPriceSeries, Color.Green, LineStyle.Solid, 1 );
			PlotSeries( PricePane, TroughSignalPriceSeries, Color.Red, LineStyle.Solid, 1 );
			
		}
	}
}
по мес.png 34 KB (572) перфоманс.png 38 KB (563)
Спасибо:

Alexander

Фотография
Дата: 18.10.2011
Ответить


Грааль? Может удалить пока никто не спалил?
Спасибо:

Ariloum

Фотография
Дата: 18.10.2011
Ответить


мой ник в скайпе - ariloum.

Почитал ветку, интересные наблюдения насчет привязки движений рынка ко времени..
Для одной из своих стратегий пару лет назад делал что-то подобное - разбивал все сделки по времени с задаваемым шагом и рисовал табличку этого распределения, в которой было видно прибыль/убытки для каждого интервала времени. Пробовал исключать "плохие" интервалы, это дало небольшой прирост прибыли.

Насчет клуба алготрейдеров - хорошая идея, буду рад принять посильное участие в брэйнштормах и тестировании идей.
Спасибо:

Ariloum

Фотография
Дата: 18.10.2011
Ответить


2 Ален

У меня есть похожая стратегия, суть ее в следующем :
По 2м последним пикам рисуется линия, если последний пик ниже(выше) предыдущего пика происходит вход в лонг(шорт) на пробое линии.
Пики по хаям - для входа в лонг, по лоям - для шортов, визуально получаются линии "\" и "/".
Трейлинг стоп в процентах, для примера - каждые 5% стоп подтягивается на 2-3%.
Спасибо:

StockSharp

Фотография
Дата: 18.10.2011
Ответить


Ariloum
2 Ален

У меня есть похожая стратегия, суть ее в следующем :
По 2м последним пикам рисуется линия, если последний пик ниже(выше) предыдущего пика происходит вход в лонг(шорт) на пробое линии.
Пики по хаям - для входа в лонг, по лоям - для шортов, визуально получаются линии "\" и "/".
Трейлинг стоп в процентах, для примера - каждые 5% стоп подтягивается на 2-3%.


как результаты? лучше или сравнимы?
Спасибо:

Ariloum

Фотография
Дата: 20.10.2011
Ответить


Alen

как результаты? лучше или сравнимы?


Да наверное примерно так же, в последний раз в 2009 году тестировал..
Может быть и чуть похуже т.к. часто входит против тренда (для улучшения нужно прикрутить трендовый фильтр).

Хотел попробовать скормить твою стратежку веалзлабу, не получается - график багается вот так:


У тебя веалзлаб какой версии? Я поставил 5.4.20. Еще у ВЛД довольно специфичный импорт котировок - нельзя сразу указать нормальный таймфрейм (те же часовики).

Что означают цифры у этих параметров?
Step = CreateParameter("Step", 3200, 100, 3500, 100);
DeltaStop = CreateParameter("DeltaStop", 0, 100, 3500, 100);
PeakRange = CreateParameter("PeakRange", 2700, 900, 3000, 100);
Mode = CreateParameter("Mode", 0, -1, 1, 1);

По описанному мной алго попозже выложу статистику.
Спасибо:

Evgeny_K

Фотография
Дата: 20.10.2011
Ответить


Цитата:
Еще у ВЛД довольно специфичный импорт котировок - нельзя сразу указать нормальный таймфрейм (те же часовики).

Выбирай при импорте 60 минут.
Спасибо:

Ariloum

Фотография
Дата: 20.10.2011
Ответить


Evgeny_K
Цитата:
Еще у ВЛД довольно специфичный импорт котировок - нельзя сразу указать нормальный таймфрейм (те же часовики).

Выбирай при импорте 60 минут.


А там есть такая возможность?
Я пробовал импортировать .wl файлы котировок ММВБ(скачанные с рутрекера) и .txt(скачанные с Финама).
И там и там возможные интервалы представлены следующие:
Tick
Secont
Minute
Daily
...
Yearly

Я не очень понимаю логику девелоперов - почему после минутного таймфрейма идут дневки?
Спасибо:

Evgeny_K

Фотография
Дата: 21.10.2011
Ответить


Цитата:
А там есть такая возможность?
Я пробовал импортировать .wl файлы котировок ММВБ(скачанные с рутрекера) и .txt(скачанные с Финама).
И там и там возможные интервалы представлены следующие:
Tick
Secont
Minute
Daily
...
Yearly


Да. Выбираешь Minute, а в следующем поле печатаешь 60.
Спасибо:

destr

Фотография
Дата: 21.10.2011
Ответить


Ariloum
Я не очень понимаю логику девелоперов - почему после минутного таймфрейма идут дневки?

Потому что любое время меньшее дня, но большее минуты можно задать в следующем поле Bar Interval. Т.е. часы задёшь как минуты с Bar interval 60
Спасибо:
< 1 2 3 4  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy