- Код:
//+------------------------------------------------------------------+
//| JMA.mq4 |
//| Spiggy |
//| |
//+------------------------------------------------------------------+
#property copyright "Spiggy"
#property link ""
//----
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int Len=14;
extern int phase=0;
extern int BarCount=300;
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
// variable definitions
bool firstTime=True;
int AccountedBars=0;
int jj=0;
int ii=0;
int shift=0;
double series=0;
//----
double vv=0;
double v1=0;
double v2=0;
double v3=0;
double v4=0;
double s8=0;
double s10=0;
double s18=0;
double s20=0;
int v5=0;
int v6=0;
double s28=0;
double s30=0;
int s38=0;
int s40=0;
int s48=0;
int s50=0;
int s58=0;
int s60=0;
double s68=0;
double s70=0;
double f8=0;
double f10=0;
double f18=0;
double f20=0;
double f28=0;
double f30=0;
double f38=0;
double f40=0;
double f48=0;
double f50=0;
double f58=0;
double f60=0;
double f68=0;
double f70=0;
double f78=0;
double f80=0;
double f88=0;
double f90=0;
double f98=0;
double fA0=0;
double fA8=0;
double fB0=0;
double fB8=0;
double fC0=0;
double fC8=0;
double fD0=0;
double f0=0;
double fD8=0;
double fE0=0;
double fE8=0;
int fF0=0;
double fF8=0;
int value2=0;
double JMA=0;
double prevtime=0;
//----
double list[127];
double ring1[127];
double ring2[10];
double buffer[61];
//----
ArrayInitialize(list,0);
ArrayInitialize(ring1,0);
ArrayInitialize(ring2,0);
ArrayInitialize(buffer,0);
//----
if (firstTime)
{
AccountedBars=Bars-BarCount;
firstTime=False;
}
if ((CurTime()-prevtime)<30)
return(-1);
//----
prevtime=CurTime();
//SetLoopCount(0);
{
s28=63;
s30=64;
for( ii=1;ii<=s28;ii++)
{
list[ii]=-1000000;
}
for( ii=s30;ii<=127 ;ii++ )
{
list[ii]=1000000;
}
f0=1;
}
//----
for( shift=BarCount;shift>=0;shift-- )
{
series=Close[shift];
if (fF0 < 61)
{
fF0= fF0 + 1;
buffer[fF0]=series;
} //{ main cycle }
if (fF0 > 30)
{
if (Len < 1.0000000002)
{
f80=0.0000000001; //{1.0e-10}
}
else
{
f80=(Len - 1)/2.0;
}
if (phase < -100)
{
f10=0.5;
}
else
{
if (phase > 100)
{
f10=2.5;
}
else
{
f10=phase/100 + 1.5;
}
}
v1=MathLog(MathSqrt(f80));
v2=v1;
if (v1/MathLog(2.0) + 2.0 < 0.0)
{
v3=0;
}
else
{
v3=v2/MathLog(2.0) + 2.0;
}
f98=v3;
//----
if (0.5<=f98 - 2.0)
{
f88=f98 - 2.0;
}
else
{
f88=0.5;
}
f78=MathSqrt(f80) * f98;
f90=f78/(f78 + 1.0);
f80=f80 * 0.9;
f50=f80/(f80 + 2.0);
//----
if (f0!=0)
{
f0=0;
v5=0;
for( ii=1;ii <=29;ii++)
{
if (buffer[ii+1]!=buffer[ii])
{
v5=1.0;
}
}
fD8=v5*30.0;
if (fD8==0)
{
f38=series;
}
else
{
f38=buffer[1];
}
f18=f38;
if (fD8 > 29)
fD8=29;
}
else
fD8=0;
//----
for( ii=fD8;ii>=0;ii-- )
{ //{ another bigcycle...}
value2=31-ii;
if (ii==0)
{
f8=series;
}
else
{
f8=buffer[value2];
}
f28=f8 - f18;
f48=f8 - f38;
if (MathAbs(f28) > MathAbs(f48))
{
v2=MathAbs(f28);
}
else
{
v2=MathAbs(f48);
}
fA0=v2;
vv=fA0 + 0.0000000001; //{1.0e-10;}
//----
if (s48<=1)
{
s48=127;
}
else
{
s48=s48 - 1;
}
if (s50<=1)
{
s50=10;
}
else
{
s50=s50 - 1;
}
if (s70 < 128)
s70=s70 + 1;
s8=s8 + vv - ring2[s50];
ring2[s50]=vv;
if (s70 > 10)
{
s20=s8/10;
}
else
s20=s8/s70;
//----
if (s70 > 127)
{
s10=ring1[s48];
ring1[s48]=s20;
s68=64;
s58=s68;
while(s68 > 1)
{
if (list[s58] < s10)
{
s68=s68 *0.5;
s58=s58 + s68;
}
else
if (list[s58]<=s10)
{
s68=1;
}
else
{
s68=s68 *0.5;
s58=s58 - s68;
}
}
}
else
{
ring1[s48]=s20;
if (s28 + s30 > 127)
{
s30=s30 - 1;
s58=s30;
}
else
{
s28=s28 + 1;
s58=s28;
}
if (s28 > 96)
{
s38=96;
}
else
s38=s28;
if (s30 < 32)
{
s40=32;
}
else
s40=s30;
}
//----
s68=64;
s60=s68;
while(s68 > 1)
{
if (list[s60]>=s20)
{
if (list[s60 - 1]<=s20)
{
s68=1;
}
else
{
s68=s68 *0.5;
s60=s60 - s68;
}
}
else
{
s68=s68 *0.5;
s60=s60 + s68;
}
if ((s60==127) && (s20 > list[127]))
s60=128;
}
if (s70 > 127)
{
if (s58>=s60)
{
if ((s38 + 1 > s60) && (s40 - 1 < s60))
{
s18=s18 + s20;
}
else
if ((s40 > s60) && (s40 - 1 < s58))
s18=s18 + list[s40 - 1];
}
else
if (s40>=s60)
{
if ((s38 + 1 < s60) && (s38 + 1 > s58))
s18=s18 + list[s38 + 1];
}
else
if (s38 + 2 > s60)
{
s18=s18 + s20;
}
else
if ((s38 + 1 < s60) && (s38 + 1 > s58))
s18=s18 + list[s38 + 1];
if (s58 > s60)
{
if ((s40 - 1 < s58) && (s38 + 1 > s58))
{
s18=s18 - list[s58];
}
else
if ((s38 < s58) && (s38 + 1 > s60))
s18=s18 - list[s38];
}
else
{
if ((s38 + 1 > s58) && (s40 - 1 < s58))
{
s18=s18 - list[s58];
}
else
if ((s40 > s58) && (s40 < s60))
s18=s18 - list[s40];
}
}
if (s58<=s60)
{
if (s58>=s60)
{
list[s60]=s20;
}
else
{
for( jj=s58 + 1;jj<=s60 - 1;jj++)
{
list[jj - 1]=list[jj];
}
list[s60 - 1]=s20;
}
}
else
{
for( jj=s58 - 1;jj>=s60;jj-- )
{
list[jj + 1]=list[jj];
}
list[s60]=s20;
}
if (s70<=127)
{
s18=0;
for(jj=s40;jj<=s38;jj++)
{
s18=s18 + list[jj];
}
}
f60=s18/(s38 - s40 + 1);
if (fF8 + 1 > 31)
{
fF8=31;
}
else
fF8=fF8 + 1;
//----
if (fF8<=30)
{
if (f28 > 0)
{
f18=f8;
}
else
f18=f8 - f28 * f90;
if (f48 < 0)
{
f38=f8;
}
else
f38=f8 - f48 * f90;
fB8=series;
//{EasyLanguage does not have "continue" statement}
if (fF8!=30)
{
continue;
}
if (fF8==30)
{
fC0=series;
if (MathCeil(f78)>=1)
{
v4=MathCeil(f78);
}
else
v4=1;
fE8=MathCeil(v4);
if (MathFloor(f78)>=1)
{
v2=MathFloor(f78);
}
else
v2=1;
fE0=MathCeil(v2);
if (fE8==fE0)
{
f68=1;
}
else
{
v4=fE8 - fE0;
f68=(f78 - fE0)/v4;
}
if (fE0<=29)
{
v5=fE0;
}
else
v5=29;
if (fE8<=29)
{
v6=fE8;
}
else
v6=29;
fA8=(series - buffer[fF0 - v5]) * (1 - f68)/fE0 + (series - buffer[fF0 - v6]) * f68/fE8;
}
}
else
{
if (f98>=MathPow(fA0/f60, f88))
{
v1=MathPow(fA0/f60, f88);
}
else
v1=f98;
if (v1 < 1)
{
v2=1;
}
else
{
if (f98>=MathPow(fA0/f60, f88))
{
v3=MathPow(fA0/f60, f88);
}
else
v3=f98;
v2=v3;
}
f58=v2;
f70=MathPow(f90, MathSqrt(f58));
if (f28 > 0)
{
f18=f8;
}
else
{
f18=f8 - f28 * f70;
}
if (f48 < 0)
{
f38=f8;
}
else
{
f38=f8 - f48 * f70;
}
}
}
if (fF8 > 30)
{
f30=MathPow(f50, f58);
fC0=(1 - f30) * series + f30 * fC0;
fC8=(series - fC0) * (1 - f50) + f50 * fC8;
fD0=f10 * fC8 + fC0;
f20=-f30 * 2;
f40=f30 * f30;
fB0=f20 + f40 + 1;
fA8=(fD0 - fB8) * fB0 + f40 * fA8;
fB8=fB8 + fA8;
}
JMA= fB8;
}
if (fF0<=30)
{
JMA=0;
}
//Print ("JMA is " + JMA + " shift is " + shift);
ExtMapBuffer1[shift]=JMA;
//----
if (shift>0)
{
AccountedBars=AccountedBars+1;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Cтратегия форекс 2 JMA System
Стратегии форекс на основе Скользящих средних
Для торговли по Cтратегии форекс 2 JMA System лучше всего подходит валютная пара EURUSD, 15 минутный интервал (M15), при этом перед началом торговли рекомендую определить естественные уровни сопротивления и поддержки на периоде H1.
* Для торговли рекомендую выбрать ДЦ форекс с Metatrader 4
На 15 минутный график EURUSD устанавливаем:
1) Jurik Moving Average c периодом 40 - JMA (40)
2) Jurik Moving Average c периодом 80 - JMA (80)
Открытие торговой позиции по стратегии форекс 2 JMA System:
1) Открываем сделки по направлению скользящих средних JMA (На buy, если быстрая JMA (40), выше медленной JMA (80), на sell - наоборот).
2) Для открытия сделки по тренду, необходимо чтобы сам тренд был “свежим”, т.е. был основным трендом данной сессии.
3) Если пересечение скользящих JMA случилось в утреннее время (От 03:00 до 12:00 по МСК), то открыть сделку можно лишь после того как произойдет откат к медленной скользящей, т.е. JMA (40) (должно быть закрытие свечи не дальше чем на 15 пипсов от медленной JMA (40)), либо если цена располагается уже поблизости, либо даже намного ниже самой скользящей средней JMA (40).
Так же для утренних пересечений есть еще одно правило: если на рынке нет преобладающего тренда и наклон JMA слабый, то после пересечения скользящих средних, открыть сделку можно лишь на закрытии седьмого бара, не считая тот бар, на котором случилось пересечение JMA; если был резкий рывок на графике и наклон JMA ярко выражен, то открывать сделку можно на закрытии 5-го бара (либо сразу, если цена бара располагается очень близко от медленной скользящей JMA (40) - 10-ти либо менее пипсов).
4) При пересечении скользящих средних JMA после 12:00 по МСК, открывать сделку необходимо сразу по закрытию бара, на котором случилось пересечение 2-х JMA, однако цена при этом не должна находиться дальше 25 пипсов от медленной JMA (40). Если цена находиться дальше от JMA (40) чем на 25 пипсов, то нужно ждать отката и покупать сразу при выполнении необходимых условий, ждать закрытия откатного бара совершенно необязательно, можно заключить сделку сразу.
5) Во всех случаях открытия торговой позиции, если быстрая JMA (с параметром 40) после пересечения направлена против тренда (против направления указанного пересечением двух скользящих средних) – то такой сигнал нужно проигнорировать.
Стратегия форекс 2 JMA System
Установка Stop loss и Take Profit по стратегии форекс 2 JMA System:
Стоп-лосс устанавливается жестко в 30 пипсов, Тейк-профит при этом минимум в 60 пунктов либо более.
Установка разворотного ордера.
После открытия торговой позиции по сигналу, сразу же нужно выставить разворотный отложенный ордер (ни в коем случае не нужно ставить разворотный ордер, если ордер по сигналу, еще не сработал). Он нам необходим, для того, чтобы оправдать потери, если они произойдут, от первой торговой позиции. Цена открытия отложенного ордера будет такой же, как цена стоп-лосса первой торговой позиции, а стоп-лосс отложенного ордера при этом ставим на открытие первой торговой позиции, он также будет равняться 30 пипсов.
Тэйк-профит разворотного ордера выставляем немного больше, чем стоп-лосс первой торговой позиции - 40 пипсов. Разворотный ордер снимать лишь тогда, как стоп-лосс первой торговой позиции находиться в прибыли и желательно переставлен в ноль.
Управление трейлинг-стопом.
Если плавающая прибыль по открытой сделке составляет 30-49 пипсов, переносим стоп-лосс в +3-5 пунктов прибыли. Если плавающая прибыль составляет более 50 пипсов, переносим стоп-лосс в +10 пипсов прибыли, если более 60 пипсов в +20 и т.д (т.е. шаг 10). соответственно. При переносе стоп-лосса в зону прибыли, разворотный ордер необходимо удалить.
Если сделка не закрыта, то по истечению 2-го торгового дня, либо по окончанию торговой недели (на выходные) - нужно закрыть торговую позицию приблизительно в до закрытия рынка на выходные, чтоб не попасть в гэп на открытии недели.
Торговые сигналы рекомендую лучше всего отслеживать с 8:30 до 17:00 по Московскому времени.
Последний раз редактировалось: Foxter (Пн Ноя 08, 2010 2:43 pm), всего редактировалось 1 раз(а) (Обоснование : ПРОБЛЕМА С ЗАПАЗДЫВАНИЕМ MOVING AVERAGE)