Поиск «сильного движения цены»

По «сильным движением цены» будем считать изменение цены не менее чем на Param1 пунктов в течение Param7P периодов графика. Пример сильного изменения цены приведен на рисунке.

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

Во многих алгоритмах, анализирующих поведение цены на графиках нескольких валютных пар, рекомендуется использование глобальных переменных с целью передачи информации, обработанной одним советником, для использования в другом советнике. В следующем фрагменте текста программы определяются значения глобальных переменных EurUp, EurDown, EurMiddle, ChfUp, ChfDown, ChfMiddle, GbpUp, GbpDown, GbpMiddle, соответствующие максимальной, минимальной и средней цене валюты в течение выбранного интервала времени. Длительность временного интервала определена в периодах графика.

defines: VisibleBars(42);

.........

VisiblePeriods=VisibleBars-1;

.........

//опр границы ценового коридора для разных валютных пар

Up1=High[Highest(MODE_HIGH, VisibleBars,VisiblePeriods)];

Down1=Low[Lowest(MODE_LOW, VisibleBars,VisiblePeriods)];

Middle1=(Up1+Down1)/2;

//Alert(Symbol," Up1=",Up1," Down1=",Down1," Middle1=",Middle1);

//зададим глобальные переменные

if Symbol = "EURUSD" then

{

SetGlobalVariable("EurUp",Up1);

SetGlobalVariable("EurDown",Down1);

SetGlobalVariable("EurMiddle",Middle1);

}

else

{ if Symbol = "USDCHF" then

{

SetGlobalVariable("ChfUp",Up1);

SetGlobalVariable("ChfDown",Down1);

SetGlobalVariable("ChfMiddle",Middle1);

}

else

{ if Symbol = "GBPUSD" then

{

SetGlobalVariable("GbpUp",Up1);

SetGlobalVariable("GbpDown",Down1);

SetGlobalVariable("GbpMiddle",Middle1);

}

}; // else if Symbol = "GBPUSD"

}; // else if Symbol = "EURUSD"

В случае, когда расчеты некоторой стратегии «привязаны» к определенной величине периода ценового графика, рекомендуется выполнять в советнике проверку периода графика, к которому подключен советник, а именно:

if Period <> 1 then

{

Alert("For Symbol=", Symbol,

"Расчеты невозможно выполнить. Период графика Period= ",Period);

exit;

};

Далее рассмотрим алгоритм поиска сильного движения цены.

Информацию о наличии сильного движения цены (скачка цен) в одном направлении будем хранить в переменных N14Up и N14Down, которые будут иметь следующие значения:

скачок вниз – N14Down = 2,

скачок вверх – N14Up = 2,

нет скачка – N14Up = 0, N14Down = 0.

Информацию о времени обнаружения скачка будем хранить в переменной JumpTime. Будем считать, что информация о наличии скачка является актуальной в течение периода времени длительностью ValidTime1, т.е. необходимо постоянно выполнять следующую проверку:

//если есть скачек и его срок действия не истек, то не ищем новый скачек

if N14Up > 1 then

{ if JumpTime < CurTime-ValidTime1 then

N14Up=0;

};

if N14Down > 1 then

{ if JumpTime < CurTime-ValidTime1 then

N14Down=0;

};

Для поиска нового ценового скачка величиной не менее Param1 пунктов на графике используем t периодов (t=Param8P).

В приведенном далее фрагменте текста программы ценовым скачком считается изменение цены, удовлетворяющее следующему условию:

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

//ищем скачек вверх

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

if N14Up < 1 then

{

//здесь если скачка вверх не было давно

for ii0=FirstBarJump to Param8P

{

//свечка на М1 вверх на 14 пунктов

for ii1=1 to Param7P //!!!!для уменьшения длины скачка!!!!!! еще нет JumpSearchTime!!!!

{

//if Open[ii0+ii1] - Open

//if Close[ii0] - Open[ii0+Param7P] >= Param1 then

if Close[ii0] - Open[ii0+ii1] >= Param1 then

{ //!!!!!! чтобы проверить интервальный цвет внутри скачка (use JumpTimeChecked)!!!!!!!

N14Up=2;

JumpTime=Time[ii0];

JumpTimeChecked=Time[ii0+ii1]; //+Param7P];

//отметим скачек значком на графике

SetArrow(JumpTime,High[ii0],67,White);

// FileWrite(h1,"CandleUP",N14Up,ii0, TimeYear(Time[ii0]),TimeMonth(Time[ii0]),TimeDay(Time[ii0]),

// TimeHour(Time[ii0]),TimeMinute(Time[ii0]),TimeSeconds(Time[ii0]),

// Close[ii0],High[ii0],Close[ii0+1]);

break;

};

//опр продолжилось ли движение цены в направлении свечки

}; //for ii1

if N14Up > 1 then break;

}; //for ii0=0 to Param8P

}; //if N14Up < 1

Поиск резкого уменьшения цены выполняется аналогично.

//ищем скачек вниз

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

if N14Down < 1 then

{

for ii0=FirstBarJump to Param8P

{

//свечка на М1 вниз на 14 пунктов

for ii1=1 to Param7P //!!!!для уменьшения длины скачка!!!!!! еще нет JumpSearchTime!!!!

{

// if Open[ii0+Param7P] - Close[ii0] >= Param1 then

if Open[ii0+ii1] - Close[ii0] >= Param1 then

{ N14Down=2;

JumpTime=Time[ii0];

JumpTimeChecked=Time[ii0+ii1]; // +Param7P];

//отметим скачек значком на графике

SetArrow(JumpTime,Low[ii0],68,Red);

// FileWrite(h1,"CandleDown",N14Up,ii0, TimeYear(Time[ii0]),TimeMonth(Time[ii0]),TimeDay(Time[ii0]),

// TimeHour(Time[ii0]),TimeMinute(Time[ii0]),TimeSeconds(Time[ii0]),

// Close[ii0],High[ii0],Close[ii0+1]);

break;

};

//опр продолжилось ли движение цены в направлении свечки

}; //for ii1

if N14Down > 1 then break;

}; //for ii0=0 to Param8P

}; //if N14Down < 1

Информацию о наличии либо отсутствии ценового скачка запишем в глобальные переменные для использования в другом советнике.

if Symbol="USDCHF" then

{

if N14Up > 1 then

{ SetGlobalVariable("ChfJump",2);

SetGlobalVariable("ChfJumpTime",JumpTime);

}

else

{ if N14Down > 1 then

{ SetGlobalVariable("ChfJump",-2);

SetGlobalVariable("ChfJumpTime",JumpTime);

}

else

{ SetGlobalVariable("ChfJump",0);

SetGlobalVariable("ChfJumpTime",10);

};

}; //else

}

else //if Symbol="USDCHF"

{

if Symbol="EURUSD" then

{

if N14Up > 1 then

{ SetGlobalVariable("EurJump",2);

SetGlobalVariable("EurJumpTime",JumpTime);

}

else

{ if N14Down > 1 then

{ SetGlobalVariable("EurJump",-2);

SetGlobalVariable("EurJumpTime",JumpTime);

}

else

{ SetGlobalVariable("EurJump",0);

SetGlobalVariable("EurJumpTime",10);

};

}; //else

};

}; //else if Symbol="USDCHF"

Аналогично определяются значения переменной GbpJump.

Следующим шагом работы алгоритма является процесс сравнения значения цены, на котором остановилось сильное движение, относительно ценового коридора на графике. При этом параметры ценового коридора можно взять в заранее определенных глобальных переменных. В итоге создаются новые глобальные переменные EurCorridor, ChfCorridor, GbpCorridor, значения которых определяются следующим образом:

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

EurCorridor = 2, или ChfCorridor = 2, или GbpCorridor = 2,

в противном случае

EurCorridor = 0, или ChfCorridor = 0, или GbpCorridor = 0.

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

EurCorridor = -2, или ChfCorridor = -2, или GbpCorridor = -2,

в противном случае

EurCorridor = 0, или ChfCorridor = 0, или GbpCorridor = 0.

//ОПРЕДЕЛИТЬ КОРИДОР

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

if Symbol="USDCHF" then

{

if N14Up > 1 then

{ Middle1=GetGlobalVariable("ChfMiddle");

if Close[0] > Middle1 then

SetGlobalVariable("ChfCorridor",2)

else

SetGlobalVariable("ChfCorridor",0);

} //if N14Up > 1

else

{ if N14Down > 1 then

{ Middle1=GetGlobalVariable("ChfMiddle");

if Close[0] < Middle1 then

SetGlobalVariable("ChfCorridor",-2)

else

SetGlobalVariable("ChfCorridor",0);

}

else

SetGlobalVariable("ChfCorridor",0);

}; //else if N14Up > 1

}//if Symbol="USDCHF"

else

{

if Symbol="EURUSD" then

{

if N14Up > 1 then

{ Middle1=GetGlobalVariable("EurMiddle");

if Close[0] > Middle1 then

SetGlobalVariable("EurCorridor",2)

else

SetGlobalVariable("EurCorridor",0);

} //if N14Up > 1

else

{ Middle1=GetGlobalVariable("EurMiddle");

if N14Down > 1 then

{ if Close[0] < Middle1 then

SetGlobalVariable("EurCorridor",-2)

else

SetGlobalVariable("EurCorridor",0);

}

else

SetGlobalVariable("EurCorridor",0);

}; //else if N14Up > 1

};//if Symbol="EURUSD"

};// else if Symbol="USDCHF"

Аналогично определяются значения переменной GbpCorridor.

Одновременное отличие от нуля переменных

EurJump ¹ 0 и EurCorridor ¹ 0,

или

ChfJump ¹ 0 и ChfCorridor ¹ 0,

или

GbpJump ¹ 0 и GbpCorridor ¹ 0

указывает на то, что на ценовом графике соответствующей валютной пары обнаружено сильное движение цены, которое выходит за пределы ценового коридора, образованного боковым трендом. Данный факт может быть использован в советниках, реализующих некоторую механическую торговую систему.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: