Алгоритмы индикаторов + тестирование алгоритмов в торговле
#1
Отправлено 08 June 2010 - 06:57
Каждый программист знает, что Функции использованные в торговли в 90 % случаев - повторяются. Но для того чтобы написать эксперта - для начала нужно изучить индикаторы, использующиеся в нем.
В Этой ветке я буду представлять алгоритмы использования индикаторов. Более того, чтобы не быть голословным, все эти алгоритмы я буду встраивать в UTS( Universal Traiding System) и далее тестировать возможности индикатора в EaMultitester.
На входе: Индикатор - алгоритм его использования.
На выходе: Система на основе индикатора - Тест по 6 основным валютным парам(EURUSD EURGBP GBPUSD USDJPY USDCHF EURCHF) и одновременно на 5 ТФ(M1-M5-M15-M30-H1)
 
#2
Отправлено 08 June 2010 - 07:02
1) Функция индикатора Heiken_Ashi_Smoothed
Сигналы функции, являются фильтром если применять по цвету то фильтр работает по направлению цвета, если Lime то тенденция бай, если Red то тенденция селл, сигнал нулевой показывает на окончание тенденции так же является фильтром, нельзя применять его совместно с сигналами Lime или Red.
extern int MaMetod =2; extern int MaPeriod=6; extern int MaMetod2 =3; extern int MaPeriod2=2; extern int limit_bars=6; //кол-во одинаковых сигналов
в старт
if(Heiken()==1) // цвет Lime { открытие бай } if(Heiken()==2) // цвет Red { открытие селл } if(Heiken()==0) // нет сигнала, <- хороший фильтр для других индикаторов применяется как для бай так и для селл указывает на окончание тенденции направления. { открытие }за пределы старта
int Heiken() { double buy=0,sell=0; for(int i=1; i<=limit_bars; i++) { if(iCustom(Symbol(),60,"Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaMetod2,MaPeriod2,0,i)< iCustom(Symbol(),6 0,"Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaMetod2,MaPeriod2,1,i))buy++; } for(i=1; i<=limit_bars; i++) { if(iCustom(Symbol(),60,"Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaMetod2,MaPeriod2,0,i)> iCustom(Symbol(),6 0,"Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaMetod2,MaPeriod2,1,i))sell++; } if(buy == limit_bars){return(1);} if(sell == limit_bars){return(2);} return(0); }
Прикрепленные файлы
#3
Отправлено 08 June 2010 - 08:37
2)Функция индикатора VininI_HMA, по цвету, фильтрующая функция по направлению цвета.
в настройки
extern int perHMA = 14; //период extern int shifthma = 1; //барв старт
if(hma_filtr()==1) { открытие бай HMA зеленая } if(hma_filtr()==2) { открытие селл HMA красная }за пределы старта
int hma_filtr() { double HMARed,HMAGreen; HMAGreen = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 1, shifthma); HMARed = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 2, shifthma); if (HMAGreen != EMPTY_VALUE) return(1); if (HMARed != EMPTY_VALUE) return(2); return(0); }
Прикрепленные файлы
#4
Отправлено 08 June 2010 - 11:38
индикатором регрессии, правда можно по разному определять по нему направление,
Code
extern int Regr.degree1 = 6; // порядок регрессии extern double Regr.kstd1 = 1.6; // ширина канала, если =0 то рисуется только средняя линия extern int kanal=2; // вариант работы с границами канал, при =2 не открывааем позиции за границами канала, =1 только за пределами одной границы, = 0 не учитываем границы только измененгие основной линии регресс int Regr.shift1 = 0; // смещение относительно текущего бара extern int SPer = 800; // период баров extern int TFS=7; // таймфрейм на котором работает индикатор int mper[10]={0,1,5,15,30,60,240,1440,10080,43200}; if (alerts(1)>0 ) ... // LongTrade if (alerts(-1)<0) .... // ShortTrade int alert(int d6) { int x=0; string ind_name = "i-Regr"; double ma = iCustom(NULL, mper[TFS], ind_name, Regr.degree1, Regr.kstd1, SPer, Regr.shift1,0, 0); double ma1 = iCustom(NULL, mper[TFS], ind_name, Regr.degree1, Regr.kstd1, SPer, Regr.shift1,0, 1); if (kanal==1) { double m_up = iCustom(NULL, mper[TFS], ind_name, Regr.degree1, Regr.kstd1, SPer, Regr.shift1,1, 0); double m_d = iCustom(NULL, mper[TFS], ind_name, Regr.degree1, Regr.kstd1, SPer, Regr.shift1,2, 0); if (ma>ma1 && Bid>m_d) x=1; if (ma<ma1 && Ask<m_up) x=-1; } if (kanal==0) { if (ma>ma1) x=1; if (ma<ma1) x=-1; } if (kanal==2) { m_up = iCustom(NULL, mper[TFS], ind_name, Regr.degree1, Regr.kstd1, SPer, Regr.shift1,1, 0); m_d = iCustom(NULL, mper[TFS], ind_name, Regr.degree1, Regr.kstd1, SPer, Regr.shift1,2, 0); if (ma>ma1 && Bid>m_d && Ask<m_up ) x=1; if (ma<ma1 && Ask<m_up && Bid>m_d ) x=-1; } return(x); }
Тестирование показало следующие результаты:
Прикрепления: i-Regr_TEST_UTS.rar(163Kb) · 5221050.gif(6Kb) · 6675820.gif(6Kb) · 4595514.gif(6Kb)
С Уважением Expforex!
#5
Отправлено 09 June 2010 - 16:10
Code if (NumberStrategy==9) { if(hma_filtr()==1 && hma_buy()) { return(1); } if(hma_filtr()==2 && hma_sell()) { return(2); } } Codebool hma_buy() { double HMAGreen0,HMAGreen1,HMAGreen2; HMAGreen0 = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 1, 0); HMAGreen1 = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 1, 1); HMAGreen2 = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 1, 2); if(HMAGreen2==EMPTY_VALUE && HMAGreen1!=EMPTY_VALUE && HMAGreen0!=EMPTY_VALUE) return(true); else return(false); } bool hma_sell() { double HMARed0,HMARed1,HMARed2; HMARed0 = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 2, 0); HMARed1 = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 2, 1); HMARed2 = iCustom(Symbol(),0,"VininI_HMA",perHMA, 3, 0, 0, 2, 2); if(HMARed2==EMPTY_VALUE && HMARed1!=EMPTY_VALUE && HMARed0!=EMPTY_VALUE) return(true); else return(false); }
Прикрепления: HMAHMA2.rar(192Kb) · 6383517.gif(6Kb) · 2979674.gif(6Kb) · 0870753.gif(5Kb) · 3232945.gif(6Kb) · 3078725.gif(5Kb) · 2585238.gif(6Kb)
#6
Отправлено 11 June 2010 - 10:17
На стандартной машке, очень хорош для работы в долгосрочном тренде.
if (NumberStrategy==10) { if(TMADecision() == 1){ return(1); } if(TMADecision() == -1){ return(2); } } int TMA_TF = 0; int TMA_Method = 3;//0 SMA, 1 EMA, 2 SMMA, 3 LWMA int TMA_Price = PRICE_CLOSE; //0 close, 1 open, 2 high, 3 low, 4 median, 5 typical, 6 weighted int Short_MA_Period = 3; int Med_MA_Period = 20; int Long_MA_Period = 50; int TMADecision() //tradeDirection=1: long, tradeDirection=-1: short { double MA3_0 = iMA(NULL, TMA_TF, Short_MA_Period, 0, TMA_Method, TMA_Price, 0); double MA3_1 = iMA(NULL, TMA_TF, Short_MA_Period, 0, TMA_Method, TMA_Price, 1); double MA20_0 = iMA(NULL, TMA_TF, Med_MA_Period, 0, TMA_Method, TMA_Price, 0); double MA20_1 = iMA(NULL, TMA_TF, Med_MA_Period, 0, TMA_Method, TMA_Price, 1); double MA50_0 = iMA(NULL, TMA_TF, Long_MA_Period, 0, TMA_Method, TMA_Price, 0); double MA50_1 = iMA(NULL, TMA_TF, Long_MA_Period, 0, TMA_Method, TMA_Price, 1); if (MA50_0<MA50_1 && MA20_0<MA20_1 && MA3_0<MA3_1 && MA3_0<MA20_0) return (-1); if (MA50_0>MA50_1 && MA20_0>MA20_1 && MA3_0>MA3_1 && MA3_0>MA20_0) return (1); return(0); }По данным индикаторам получились такие результаты:
EURCHF H1
EURCHF M1
EURCHF M5
EURCHF M15
EURUSD D1
Прикрепленные файлы
#7
Отправлено 29 June 2010 - 18:21
Codeif (NumberStrategy==1)
{
double AO1=iAO(Symbol(),PERIOD_W1,0);
double AO2=iAO(Symbol(),PERIOD_W1,1);
double AO3=iAO(Symbol(),PERIOD_W1,2);
double AO4=iAO(Symbol(),PERIOD_W1,3);
double CCI=iCCI(Symbol(),PERIOD_H4,30,PRICE_WEIGHTED,0);
double StochM=iStochastic(Symbol(),PERIOD_H1,7,5,3,MODE_SMA,1,0,0);
double StochM1=iStochastic(Symbol(),PERIOD_H1,7,5,3,MODE_SMA,1,0,1);
double StochS=iStochastic(Symbol(),PERIOD_H1,7,5,3,MODE_SMA,1,1,0);
double StochS1=iStochastic(Symbol(),PERIOD_H1,7,5,3,MODE_SMA,1,1,1);
if (AO4>AO3 &&AO3>AO2 && AO2>AO1 && (CCI>120 || CCI<-120) ) // dwn
if (StochS1>StochM1 && StochS<StochM) return(2);
if (AO4<AO3 &&AO3<AO2 && AO2<AO1 && (CCI>120 || CCI<-120) ) // up
if (StochS1<StochM1 && StochS>StochM) return(1);
}
Прикрепления: AO__.rar(706Kb) · 7991145.gif(7Kb) · 6700061.gif(7Kb) · 4156817.gif(7Kb) · 6655323.gif(7Kb) · 2442423.gif(7Kb)
#8
Отправлено 02 August 2010 - 08:13
В данной системе используются стандартные индикаторы входящие в комплект МТ4.
RSI 14, ЕМА 14 close, EMA 6 close, EMA 4 close .
Правила входа в рынок:
Buy
1. RSI пересекает на закрывшейся свече, уровень 50 снизу вверх. Это первый момент, далее проверяем машки.
2. ЕМА 4 должна быть выше ЕМА 6, а ЕМА 6 выше ЕМА 14.
Код:
if (NumberStrategy==1) { int RSIperiod=14; int EMA1period=14; int EMA1ma_shift=0; int EMA2period=6; int EMA2ma_shift=0; int EMA3period=4; int EMA3ma_shift=0; int applied_price=0; double RSI1=iRSI(Symbol(),0,RSIperiod,applied_price,1); double RSI2=iRSI(Symbol(),0,RSIperiod,applied_price,2); double RSI3=iRSI(Symbol(),0,RSIperiod,applied_price,3); double EMA1_1= iMA(Symbol(),0,EMA1period,EMA1ma_shift,MODE_EMA,applied_price,1); double EMA2_1= iMA(Symbol(),0,EMA2period,EMA2ma_shift,MODE_EMA,applied_price,1); double EMA3_1= iMA(Symbol(),0,EMA3period,EMA3ma_shift,MODE_EMA,applied_price,1); double EMA1_2= iMA(Symbol(),0,EMA1period,EMA1ma_shift,MODE_EMA,applied_price,2); double EMA2_2= iMA(Symbol(),0,EMA2period,EMA2ma_shift,MODE_EMA,applied_price,2); double EMA3_2= iMA(Symbol(),0,EMA3period,EMA3ma_shift,MODE_EMA,applied_price,2); if( ((RSI2<50&&RSI1>50) ||(RSI3<50&&RSI2>50)) &&EMA3_1>EMA2_1 && EMA2_1>EMA1_1 ){Signal=1; } if( ((RSI2>50&&RSI1<50) ||(RSI3>50&&RSI2<50)) &&EMA3_1<EMA2_1 && EMA2_1<EMA1_1 ){Signal=2; } return(Signal); }
Результаты Выдались не те которые я ожидал, но все же есть смысл присмотреться к данной стратегии как к шаблону.
Из прибыльных графиков я выделил:
Все графики имеют имена с валютной парой - ТФ тестирования и стратегией тестирования.
Полный архив стейтов проверки этой стратегии в прикреплении.
Прикрепления: Exp-UTS_v_1.2-R.rar(963Kb)