Дневник робота

Дневник робота
Atom
10/3/2011
StockSharp


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

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

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

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

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

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


< 1 2 3 4  >
StockSharp

Avatar
Date: 10/18/2011
Reply


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

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

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

Code
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)
Thanks:

Alexander

Avatar
Date: 10/18/2011
Reply


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

Ariloum

Avatar
Date: 10/18/2011
Reply


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

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

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

Ariloum

Avatar
Date: 10/18/2011
Reply


2 Ален

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

StockSharp

Avatar
Date: 10/18/2011
Reply


Ariloum
2 Ален

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


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

Ariloum

Avatar
Date: 10/20/2011
Reply


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);

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

Evgeny_K

Avatar
Date: 10/20/2011
Reply


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

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

Ariloum

Avatar
Date: 10/20/2011
Reply


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

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


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

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

Evgeny_K

Avatar
Date: 10/21/2011
Reply


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


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

destr

Avatar
Date: 10/21/2011
Reply


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

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

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy