торговая стратегия на базе Волновой теории Эллиота - страница 125

 
разброс случайной величины (цены) от аппроксимирующей модели (желаемой функции) не может быть меньше разброса самой случайной величины (сумма квадратов Close[i]-Close[i+1])

"не может быть меньше" - это уже сам критерий ? Или это только утверждение теоремы ?

Дело в том, что, насколько я понимаю, в данном случае это неприменимо. С помощью этого критерия можно найти порядок полинома, который является достаточным для аппроксимирующей кривой. Но кривая эта будет аппроксимировать траекторию. Вы представляете себе порядок полинома, который будет повторять в сглаженом виде поведение траектории ?
 
По простому- подгонку вызывали?
 
По простому- подгонку вызывали?

:-)
 
Книга, полностью соответствующая теме ветки (поиск решения). Кроме задач статистики приводятся примеры расчетов в Excel'е, Mathcad'е и Statistica.
В мегасписке не нашел.

 
Да, вот еще в озоне нашел ее - http://www.ozon.ru/context/detail/id/1908057/
 
Да, вот еще в озоне нашел ее - http://www.ozon.ru/context/detail/id/1908057/

Rosh, Вы могли бы отсканировать оглавление книжки? Очень хотелось бы взглянуть. А то пока через Озон её пришлют - много времени уйдёт. Ну а возможно Вы могли бы в ближайшем будущем сделать какой-то обзор книжки в рамках решения нашей задачи? То есть что могло бы на Ваш взгляд пригодиться?
 
Сделал архив из 10 необработанных фотографий, но он оказался слишком велик (более 6 Мб), поэтому выложу наверно попозже. Одну страницу по этой теме все же обработал:

 
Сохранил картинки (9 страниц содержания) в 2 архива,всего 1100 кБ

https://c.mql5.com/mql4/forum/2006/08/soderz.zip
с 1 по 5

https://c.mql5.com/mql4/forum/2006/08/soderz2.zip
с 6 по 9
 
Нашел у себя советник, торгующий по каналам регресси (так у меня написано) от 20.04.05
На MQL-II , но может кому пригодится. Автор не указан, где взял - не помню.

/*[[
VC-1hr
Lots := 0.1
Notes := Use in H1 timeframe.
Update on every tick := Yes
Enable Alerts := Yes
Disable alert once hit := No
Lots := 1
Stop Loss := 999
Take Profit := 200
Trailing Stop := 999
]]*/


// ====================================================================================================
// DECLARATION AND ASSIGNMENT
// ====================================================================================================

defines: Risk(1),mm(1),maxTradesPerPair(1);
Inputs : NumberName(1), iPeriod(21), MAShoot(50), DrawVertical(0), DrawText(0), ShowMA(0), LineWeight(1), BarsCount(0);
vars: spread(0),
Slippage(5),
sl(0),tp(0),
mode(0),
lastHigh(0),lastLow(0),lastOpen(0),lastClose(0),
target(0),
entryTS(0),
cnt(0),
first(0),
lotMM(0),
tHour(0),
CurrentTrades(0),
AccountIsMini(False);  // See comments near assignment statement below.

Var : shift(0), n_begin(0), n_end(0), n(0), a_(0), b_(0), a1(0), a2(0), a3(0), b1(0);
var : y1(0), y2(0), price(0), BarBegin(100), BarEnd(1);
var : tmp_div_high(0), tmp_div_low(0), stddiv_low(0),  stddiv_high(0), tmp_div(0);
var : x_n_up(0), x_n_down(0), x_1_up(0), x_1_down(0);
var : check_upper_chanel(false), color_1(0), color_2(0), name(""), angle(0), ratio(0), ratio_currency(0);
Var : MA(0), value(0), Bars_(170), check_low(false), check_high(false);
Var : save_low(0), save_high(0), save_shift_low(0), save_shift_high(0), save_shift(0);
Var : MAType(0), MAPrice(0);

//================================================================================================================
SetLoopCount(0);
comment("Auto Regression channel");

if BarsCount < 1 then Bars_ = Bars
else Bars_ = BarsCount;

save_low = -1;
save_high = -1;
save_shift_low = -1;
save_shift_high = -1;

check_low = false;	
check_high = false;	

MAType = MODE_SMA;
MAPrice = PRICE_CLOSE;

if Close[1] > 80 then ratio_currency = 100
else ratio_currency = 10000;

For shift = Bars_-1 Downto 0 Begin
	MA = iMAEx(iPeriod, MAType, 0, MAPrice, shift);
	
	if ShowMA then SetIndexValue(shift, MA);
	
	if MA - MAShoot/ratio_currency > Close[shift] then
	{
			
		if Close[Shift] < save_low or save_low = -1  then
		{
			check_low = true;
					
			save_low = close[Shift];
			save_shift_low = shift;
		};		
	};
	
	if MA  +  MAShoot/ratio_currency< Close[shift] then
	{
		if save_high < Close[Shift] or save_high = -1 then
		{
			check_high = true;	
			
			save_high = close[Shift];
			save_shift_high = shift;
		};
	};

	if check_low then
	{	
		if MA + MAShoot/ratio_currency < Close[shift] then 
		{
			check_low = false;	
			save_low = -1;
		};
	};
	
	if check_high then
	{
		if MA - MAShoot/ratio_currency > Close[shift] then 
		{						
			check_high = false;	
			save_high = -1;
		};
	};
	
End;

if save_shift_low > save_shift_high then
{
	n_begin = save_shift_low;
	n_end = save_shift_high;
}
else
{
	n_begin = save_shift_high;
	n_end = save_shift_low;
};

if n_end = 0 then n_end = 1; 
n = (n_begin - n_end + 1); 

a1 = 0;
a2 = 0;
a3 = 0;
b1 = 0;
a_ = 0;
b_ = 0;
y1 = 0;
y2 = 0;
tmp_div_high = 0;
tmp_div_low = 0;
tmp_div = 0;

if close[n_begin] < close[n_end] then check_upper_chanel = true
else check_upper_chanel = false;

For shift = n_begin Downto n_end Begin
	if check_upper_chanel then price = low[shift]
	else price = high[shift];
	
	a1 = a1 + shift*price;
	a2 = a2 + shift;
	a3 = a3 + price;
	b1 = b1 + shift*shift;
End;

b_ = (n*a1 - a2*a3)/(n*b1 - a2*a2);
a_ = (a3 - b_*a2)/n;
y1 = a_ + b_*n_begin;
y2 = a_ + b_*n_end;

MoveObject(	"Regression_middle" + NumberName, OBJ_TRENDLINE, Time[n_begin], y1, Time[n_end], y2, yellow, LineWeight, STYLE_SOLID);	

For shift = n_begin Downto n_end Begin
	if check_upper_chanel then price = low[shift]
	else price = high[shift];
	
	tmp_div = tmp_div + (price - (a_ + b_*shift))*(price - (a_ + b_*shift));	
End;	

stddiv_low = sqrt(tmp_div/n);
stddiv_high = sqrt(tmp_div/n);

x_n_up = y1 + 2*stddiv_high;
x_1_up = y2 + 2*stddiv_high;

x_n_down = y1 - 2*stddiv_low;
x_1_down = y2 - 2*stddiv_low;

if check_upper_chanel then  {
	color_1 = blue;
	color_2 = red;
}else{
	color_1 = red;
	color_2 = blue;
};
	
//upper
MoveObject(	"Regression_upper" + NumberName, OBJ_TRENDLINE, Time[n_begin], x_n_up, Time[n_end], x_1_up, color_1, LineWeight, STYLE_SOLID);	
//lower
MoveObject(	"Regression_lower" + NumberName, OBJ_TRENDLINE, Time[n_begin], x_n_down, Time[n_end], x_1_down, color_2, LineWeight, STYLE_SOLID);	

if  DrawText then
{	
	name = "Regression_bars_begin" + NumberName;
	MoveObject(name, OBJ_TEXT, Time[n_begin], x_n_down, Time[n_begin], x_n_down, red, 1, STYLE_SOLID);			
	SetObjectText(name, NumberToStr(n_begin,0), "System", 10, White);	
		
	name = "Regression_bars_end" + NumberName;
	MoveObject(name, OBJ_TEXT, Time[n_end], x_1_up, Time[n_end], x_1_up, red, 1, STYLE_SOLID);			
	SetObjectText(name, NumberToStr(n_end,0), "System", 10, White);	
}else{
	DelObject("Regression_bars_end" + NumberName, 0, 0, 0, 0);
	DelObject("Regression_bars_begin" + NumberName, 0, 0, 0, 0);
}

if DrawVertical then
{
	MoveObject(	"Regressin_begin" + NumberName, OBJ_VLINE, 	Time[n_begin], y1, Time[n_begin], y2, 	silver, 1, STYLE_DOT);	
	MoveObject(	"Regressin_end" + NumberName, OBJ_VLINE, 	Time[n_end], y1, Time[n_end], y2, 	silver, 1, STYLE_DOT);	
}else{
	DelObject("Regressin_begin" + NumberName, 0, 0, 0, 0);
	DelObject("Regressin_end" + NumberName, 0, 0, 0, 0);
}

//================================================================================================================


entryTS   = 4 * Point;          // Entry trailing stop - points
target    = TakeProfit * Point; // Profit target - points
lastHigh  = High[1];            // Last bar high
lastLow   = Low[1];             // Last bar low
lastOpen  = Open[1];            // Last bar open
lastClose = Close[1];           // Last bar close
spread    = Ask - Bid;          // Spread



// ====================================================================================================
// VALIDATION
// ====================================================================================================

if CurTime - LastTradeTime < 300 Then Exit;
if Bars < 100 or TakeProfit < 10 then Exit;
if IsIndirect(Symbol) = True then Exit;

if TrailingStop < 5 then
{
  print("invalid Trailing Stop");
  Exit;
};

// ====================================================================================================
// DATE CHOKE - For testing purposes
// ====================================================================================================
if TimeYear(time[0]) < 2004 then Exit;

// ====================================================================================================
// PYRAMIDING - LINEAR
// Money management risk exposure compounding
// ====================================================================================================

AccountIsMini = False; // Change to False for real trading w/ 100k/regular account
                       //        or for all backtesting, since backtests allow
                       //        fractional lots.
                       // Change to True for real trading w/ mini account

if mm <> 0 then 
{
  lotMM = Ceil(Balance * risk / 10000) / 10;

  if lotMM < 0.1 then lotMM = lots;

  if lotMM > 1 then lotMM = Ceil(lotMM);

  if AccountIsMini then lotMM = lotMM * 10;

  if lotMM > 100 then lotMM = 100;
}
else {
  lotMM = Lots; // Change mm to 0 if you want the Lots parameter to be in effect
};

// ====================================================================================================
// OPEN ORDER CHECK -
// Each instance of a script is attached to one currency pair.
// When this check executes, it sets CurrentTrades to 1 so that
// only one trade for this symbol will be open, which is enforced
// by "if CurrentTrades = 0".
// ====================================================================================================

CurrentTrades = 0;

for cnt = 1 to TotalTrades
{ 
  if OrderValue(cnt,VAL_SYMBOL) = Symbol then
  {
    CurrentTrades = CurrentTrades + 1; 
  };
};

// ====================================================================================================
// TRADE ENTRY
// ====================================================================================================

if CurrentTrades < maxTradesPerPair then
{
  //LONG TRADES ENTRY CRITERIA

  if //lastOpen < lastClose        and  // Last bar bullish, open less than close;
     check_upper_chanel = true   and  // Ask above lastHigh, and SAR less than Ask,
     y2 > Close     and  // then request order.
     tHour != TimeHour(time[0])  then
  {
    tHour=TimeMinute(time[0]);

    // Set stoploss to last bar low so that Bid must hit lastLow to exit.

    sl = x_1_down - (2 * point);
    tp = Ask + target;
  
    SetOrder(OP_BUY,
             lotMM,
             Bid,
             Slippage,
             sl,
             tp,
             LIME);
    Exit;
  };

  //SHORT TRADES ENTRY CRITERIA

  if //lastOpen > lastClose       and  // Last bar bearish, open greater than close;
     check_upper_chanel = False and  // if Bid below lastLow, and SAR greater than Bid,
     y2  < Close  and // then request order.
     tHour != TimeHour(time[0]) then
  {
    tHour=TimeMinute(time[0]);

    // Set stoploss to last bar high so that Ask must hit lastHigh to exit.

    sl = x_1_up + (2 * point);
    tp = Bid - target;

    SetOrder(OP_SELL,
             lotMM,
             Ask,
             Slippage,
             sl,
             tp,
             RED);
    Exit;
  }; 
}; // end of if CurrentTrades < maxTradesPerPair

// ====================================================================================================
// TRAILING STOP UPDATE
// ====================================================================================================

if CurrentTrades = 0 then exit;

for cnt = 1 to TotalTrades
{ 
  if OrderValue(cnt,VAL_SYMBOL) = Symbol then 
  {
    if OrderValue(cnt,VAL_TYPE) = OP_BUY then 
    {
      // If Bid - Open is now higher than entryTS pips profit,
      // and the stop loss order is lower than
      // entryTS pips below the Bid, then adjust the stop loss part of
      // the order to the Bid - entryTS pips

      if (Bid - OrderValue(cnt,VAL_OPENPRICE)) > (entryTS) then
      {
        if OrderValue(cnt,VAL_STOPLOSS) < x_1_down then
        {
          ModifyOrder(OrderValue(cnt,VAL_TICKET),
                      OrderValue(cnt,VAL_OPENPRICE),
                      x_1_down - (2 * point),
                      OrderValue(cnt,VAL_TAKEPROFIT),
                      BLUE);
          Exit;
        }; 
      };
      
      // if Stop Loss > Open Price then Set Takeprofit 

      if OrderValue(cnt,VAL_STOPLOSS) >= OrderValue(cnt,VAL_OPENPRICE) then
      {
        ModifyOrder(OrderValue(cnt,VAL_TICKET),
                    OrderValue(cnt,VAL_OPENPRICE),
                    OrderValue(cnt,VAL_STOPLOSS),
                    Ask + TakeProfit * Point,
                    BLUE);
        Exit;
      };
    }; // end OP_BUY check

    if OrderValue(cnt,VAL_TYPE) = OP_SELL then
    {
      // If Open - Ask is now higher than entryTS pips profit,
      // and the stop loss order is higher than
      // entryTS pips above the Ask, then adjust the stop loss part of
      // the order to Ask + entryTS pips

      if (OrderValue(cnt,VAL_OPENPRICE) - Ask) > (entryTS) then
      {
        if OrderValue(cnt,VAL_STOPLOSS) > x_1_up then
        {
          ModifyOrder(OrderValue(cnt,VAL_TICKET),
                      OrderValue(cnt,VAL_OPENPRICE),
                      x_1_up + (2 * point),
                      OrderValue(cnt,VAL_TAKEPROFIT),
                      BLUE);
          Exit;
        };
      };

      // if Stop Loss < Open Price then Set Takeprofit 

      if OrderValue(cnt,VAL_STOPLOSS) <= OrderValue(cnt,VAL_OPENPRICE) then
      {
        ModifyOrder(OrderValue(cnt,VAL_TICKET),
                    OrderValue(cnt,VAL_OPENPRICE),
                    OrderValue(cnt,VAL_STOPLOSS),
                    Bid - TakeProfit * Point,
                    BLUE);
        Exit;
      };
    };  // end OP_SELL check
  }; // end Symbol check
}; // end for cnt=1 to TotalTrades


 
Сделал архив из 10 необработанных фотографий, но он оказался слишком велик (более 6 Мб), поэтому выложу наверно попозже. Одну страницу по этой теме все же обработал:


Есть в постулатах, изложенных в книге (насколько я вижу по опубликованной странице) достаточно серьезная неточность (ИМХО: непонимание сути процесса). Все дело в том, что ЦЕНА НЕ ЯВЛЯЕТСЯ ФУНКЦИЕЙ ВРЕМЕНИ. Во всяком случае достоверно доказать это невозможно.
В той постановке, что я описывал, подход построен из тех соображений, что определить функцией какого параметра является цена достоверно не представляется возможным. Еще сделано предположение, что цена является функцией супперпозиции внешних факторов. Это мы пытаемся аппроксимировать изменения цены и связать их с изменением времени, что не есть суть одно и то же. То есть время не является независимой (варьируемой) переменной, оно само зависит от некоторых факторов. Имеется ввиду некоторое внутреннее время системы в момент которого и происходит некоторое событие. Внешний же наблюдатель, наблюдая все это извне в своей системе координат, может сделать совершенно неверные выводы. Пример: стоим на трассе и считаем количество прошедших машин в любую из сторон. Конечно по набору некоторой информации можно утверждать, что количество машин, проезжающих по трассе есть функция времени, но так ли это ? Специально привел пример, для которого несуразность очевидна. Здесь все сложнее ;).

С уважением, Владислав.
Удачи и попутных трендов.
Причина обращения: