У вас не стоит Flash Player
Настройки
#66853 - Sat Dec 06 2014 09:38 AM Оптимизация и результат тестирования
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Здравствуйте!

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

При этом если тестирую другой скрипт, то все работает нормально.

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

Собственно сам скрипт:
Code:


#region Using block
using System.Collections.Generic;

using TSLab.Script;

using TSLab.Script.Handlers;

using TSLab.Script.Optimization;

using TSLab.Script.Helpers;

using TSLab.DataSource;

#endregion

#region Пространство имен системы

namespace TSLab.Sistema
{    
    public class System_Sistemar : IExternalScript
	{
    	#endregion
    	
    	//Переменные для обслуживания
    	
    	#region Переменные для обслуживания позиций
    	
    	      public bool signalBuy; //Сигнал на покупку
		public bool signalShort; //Сигнал на продажу
		public IPosition LongPos, ShortPos;		// Сигналы на вход в длинную и короткую позиции
				
		#endregion
		
        // Инициализация параметров оптимизации
        
        #region Оптимизационные параметры Индикаторов
        public OptimProperty _periodatr = new OptimProperty(10,5,20,1); 
        
        public OptimProperty _periodADX = new OptimProperty(10,5,20,1); // Период ADX
                
        public OptimProperty _adxLevel = new OptimProperty(10,5,20,1); // Уровень ADX
        public ConstGen ADX_Line = new ConstGen(); // Уровень индикатора в виде константы
        
        public OptimProperty _Dm_period = new OptimProperty(10,5,20,1); // Период для DM
	    	    
	    public OptimProperty _EMA = new OptimProperty(10,5,20,1); // Период EMA
	   	    
	    public Time _Time_Session = new Time(); // Инициализация времени
	    
	   #endregion
        
        #region Оптимизационные параметры Take and Stop
        
        public OptimProperty _winLoss = new OptimProperty(10,5,20,1); // Отношение риска к прибыли для Лонга
                
        public OptimProperty _atrStop = new OptimProperty(10,5,20,1); //Процент отдаления стоп-лосса от цены входа в позицию для Лонга
                		
            	    
	    #endregion
        
	    // Основной диапазон Системы
	    
	    #region Диапазон Инструмента и первой свечи
		public void Execute(IContext ctx, ISecurity source)
		{         
		    int StartBar = 130;
		
        #endregion
		    
			// Получение параметров для системы
			
			#region Параметры для Take and Stop
			double orderStop=0; // Объявление переменной для Стоп 
            
            double orderTake=0; // Объявление переменной для Таке Профита 
           
			int atrStop = _atrStop; // Забираем значение % Стоп лоса для Лонга
		    int winLoss = _winLoss; // Забираем Отношение риска к прибыли для Лонга
		    			
			#endregion
			
			#region Параметры для Индикаторов
						           	
		    int periodADX = _periodADX; // Забираем значение периода ADX
		    this.ADX_Line.Value = _adxLevel;// Забираем значение константы для уровня из оптимизированного параметра.
		    
		    int adxLevel = _adxLevel; // Забираем значение уровня ADX
		    int periodatr = _periodatr; // Забираем значение периода ATR для Лонга
		    int Dm_period = _Dm_period; // Забираем значение периода DM
		    int EMA =  _EMA; // Забираем значение  Ema
				    		    
		    #endregion
		       
		    // Расчеты индикаторов и take profit
		    
		    #region Индикаторы
		    
		    // Вычесляю ADX, DM
			var nAdx = ctx.GetData("ADX", new[] { periodADX.ToString() },
            () => new  ADXFull() { Context = ctx, Period = periodADX }.Execute(source));
		    
			    
		    var nDm = ctx.GetData("+DI", new[] { Dm_period.ToString() },
		    () => new DIP() { Context = ctx, Period = Dm_period }.Execute(source));
               
			    
		    IList<double> ADX_Line = ctx.GetData("ADX_line", new[] {this.ADX_Line.Value.ToString() },
		    delegate {return this.ADX_Line.Execute(ctx);}); // Строим нужную линию
		                 	
			//Вычисляю ATR и Время
			
			IList<double> ATR = ctx.GetData("ATR", new[] {periodatr.ToString() },
			delegate { return Series.AverageTrueRange(source.Bars, periodatr); });
						
			IList<double> Time_Session = ctx.GetData("Время1", new[] {_Time_Session.ToString()},
			delegate {return this._Time_Session.Execute(source);});
						
			//Вычесляю Ema
			IList<double> Ema  = ctx.GetData("Ema", new[] {EMA .ToString() },
			delegate { return Series.EMA(source.ClosePrices,EMA); });			
					
			#endregion
			
			#region Takeprofit and StopLoss
				
			#endregion
			
			// Графики и значения
			
			#region  Отрисовка панелей
			
			// Отрисовка основного окна
			
		    IPane mainPane = ctx.CreatePane("График", 100D, false); // Берем основную панель 
		    mainPane.Visible = true;
		    IGraphList mainPane_source_chart = mainPane.AddList("График",source,CandleStyles.BAR_CANDLE,true, true, true, true, 65024,PaneSides.RIGHT); // Отрисовка Цены
		    source.ConnectSecurityList(mainPane_source_chart);
                       
            mainPane.AddList("EMA", Ema, ListStyles.LINE,new Color(0, 0, 255), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка ЕМА
            
            	      
            // Отрисовка ADX, DM 
	        
	        IPane ADXPane = ctx.CreatePane("ADX_Long", 25, false, false); // Добавление панели для ADX_Long
	        ADXPane.AddList("ADX_line", ADX_Line, ListStyles.LINE,new Color(0, 0, 0), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка уровня ADX

	        ADXPane.AddList("ADX", nAdx, ListStyles.LINE,new Color(0, 0, 255), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка графика ADX 

	        ADXPane.AddList("Dm", nDm, ListStyles.LINE,new Color(0, 255, 0), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка графика DM+

	        ADXPane.UpdatePrecision(PaneSides.RIGHT, 4); // Количество знаков после запятой
	
             #endregion
	        						
			#region Значения для первой свечи
			
			int barsCount = source.Bars.Count;
			for (int bar = StartBar; bar < barsCount; bar++)
			{
		    #endregion
		    
		    // Параметры и Сигналы
		    
			#region Сброс параметров
			
		    signalBuy = false;
                signalShort = false;
                
                nDm [bar] = nDm [bar]*100;
                                               
            #endregion
                
            #region Сигналы на вход в позицию
            
				
			   
		#endregion
 
 			// Исполнение сигналов
				
			#region	Выполнение сигналов для длинной позиции
			
			LongPos = source.Positions.GetLastActiveForSignal("OpenLong",bar);
				
				if (LongPos == null) // Если нет активной длинной позиции
				{
					if (signalBuy) // Если есть сигнал Buy,
					{
						source.Positions.BuyIfGreater(bar+1,1,source.HighPrices[bar]+2, "OpenLong"); // Выдаем ордер на открыте новой длинной позиции
						orderStop = source.LowPrices[bar] - ((ATR [bar] / 100) * atrStop); // Устанавливаем стоп-лосс
						orderTake = source.HighPrices [bar] + ((ATR [bar] / 100) * atrStop * winLoss); // Устанавливаем Таке Профит
					}
				}
				else if (Time_Session[bar]>213000)// Если есть активная длинная позиция и время больше 23:30
				{
					    LongPos.CloseAtMarket(bar+1, "Time Stop Long"); // Позиция закрывается по рынку
				}
				else// Если есть активная длинная позиция
				{
					    LongPos.CloseAtStop(bar+1, orderStop, "Long_Stop"); // Пробуем выйти по Стопу
					    LongPos.CloseAtProfit(bar+1,orderTake,"Long take_profit"); // Пробуем выйти по Таке Профиту
				}
				#endregion
		
			#region Выполнение сигналов для короткой позиции
			
			ShortPos = source.Positions.GetLastActiveForSignal("OpenShort",bar);
				
				if (ShortPos == null) // Если нет активной короткой позиции
				{
					if (signalShort) // Если есть сигнал Short
					{
					source.Positions.SellIfLess(bar+1,1,source.LowPrices[bar]-2, "OpenShort"); // Выдаем ордер на открыте новой короткой позиции.
					orderStop = source.HighPrices[bar] + ((ATR [bar] / 100) * atrStop); //устанавливаем стоп-лосс
					orderTake = source.LowPrices[bar] - ((ATR [bar] / 100) * atrStop * winLoss); // Устанавливаем Таке Профит
					}
				}
				else if (Time_Session[bar]>213000)// Если есть активная короткая позиция и время больше 23:30
				{
					    ShortPos.CloseAtMarket(bar+1, "Time Stop Short"); // Позиция закрывается по рынку
				}
				else // Если есть активная короткая позиция, 
				{
					ShortPos.CloseAtStop(bar+1, orderStop, "Short_Stop"); // Пробуем выйти по Стопу
					ShortPos.CloseAtProfit(bar+1,orderTake,"Short take_profit"); // Пробуем выйти по Таке Профиту
				}
				#endregion
				
					}
		}
    }
 }				
		
	



Диапазоны для оптимизации удалил сознательно!


Отредактировано Vladimir2803 (Sat Dec 06 2014 10:32 AM)

Наверх
#66856 - Sat Dec 06 2014 02:26 PM Re: Оптимизация и результат тестирования [Re: Vladimir2803]
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Нашел проблему, она заключалась в строчке

nDm [bar] = nDm [bar]*100;

Не знаю как она и повлияла на происходящее.

Если кто понял проблему напишите пожалуйста, что бы больше такого не повторить

Наверх


Moderator:  ViL, sar