Учимся писать эксперты для MetaTrader. Урок №15
Обучение MQL II. Урок 15
Здравствуйте дорогие читатели. Сегодня мы проверим действенность одной классической торговой системы. Те кто читал классические книги по ТА, думаю, знают такое правило. В тренде нужно торговать по направлению трендовых индикаторов (например, скользящих средних), а во флете с помощь осцилляторов.
15.1 Алгоритм
На самом деле только определение тренда уже более чем серьезный вопрос. Тренд будем определять с помощь индикатора ADX, я думаю Вы не будете против, т.к. это именно трендследящий индикатор. Если ADX растет, и стал самым большим за последние N значений, то позиция будет открываться в направлении скользящей средней. Если тренда нет, т.е. ADX имеет низкие значения, то смотрим на значение осциллятора. Если осциллятор в экстремальной зоне, то открываем соответствующую позицию (на отскок от зоны). В качестве осциллятора будем использовать индикатор Stochastic, потом его можно будет заменить или добавить еще один.
Закрытие позиции будет осуществляться как по стоп ордерам, так и по условию. Условие это, исчезновение тренда, для позиций открытых в тренде и достижение противоположной экстремальной зоны Stochastic, для позиций открытых во флете. Во внешние переменные мы выложим периоды ADX, Stochastic и средней; зоны Stochastic для открытия позиции.
15.2 Эксперт
/*[[
Name := Trend-flet
Link := fxtest.ru
Lots := 1.00
Stop Loss := 0
Take Profit := 0
Trailing Stop := 0
]]*/
defines: PerMA(21), PerADX(14), StochK(5), StochD(3), Stochslow(3), UpZone(75), DownZone(25),
WindowADX(35), ADXmax(20), ADXmin(15), MApips(4);
var: Stoch1(0),Stoch2(0),ADX1(0),ADX2(0),Ma1(0),Ma3(0),cnt(0),f(0),tr(0);
/*
PerMA-период МА
PerADX-период ADX
StochK,StochD,Stochslow-периоды стохастика
UpZone(75),DownZone(25)-экстремальные зоны стохастика
WindowADX(35)-окно сравнения ADX
ADXmax-значение ADX от которого считается, что это тренд
ADXmin- знгачение ADX от которого считается что это флет
MApips- наклон МА
*/
if curtime-LastTradeTime<5*3600 then exit; // ограничение по времени
Ma1=ima(PerMa,mode_sma,1); //МА
Ma3=ima(PerMa,mode_sma,3);
Stoch1=iSTO(StochK,StochD,Stochslow,MODE_SMA,MODE_MAIN,1);// Стохастик
Stoch2=iSTO(StochK,StochD,Stochslow,MODE_SMA,MODE_MAIN,2);
ADX1=iADX(PerADX,MODE_MAIN,1); //ADX
ADX2=iADX(PerADX,MODE_MAIN,2);
if TotalTrades=0 then tr=0; //tr определяет тренд, если она равна 1 то сделка открыта как трендовая 2 флетовая, 0-сделки нет
if TotalTrades<1 then {
f=0; //флаг ADX
for cnt=1 to WindowADX { if ADX1<iADX(PerADX,MODE_MAIN,cnt) then f=1;};// определение пробоя ADX вверх
// WindowADX- определяет окно пробоя
if f=0 and ADX1>ADXmax then { //если ADX больше
if ma1-ma3>MApips*point then { tr=1; SetOrder(op_buy, lots, ask, 3, bid-stoploss*point, bid+takeprofit*point, green); exit;};
if ma1-ma3<-MApips*point then{tr=1; SetOrder(op_sell, lots, bid, 3, ask+stoploss*point, ask-takeprofit*point, red); exit;};
// трендовые сделки
};
if ADX1<ADXmin then {
if Stoch1<DownZone and Stoch1>Stoch2 then {tr=2; SetOrder(op_buy, lots, ask, 3, bidstoploss*point, bid+takeprofit*point, green); exit;};
if Stoch1>UpZone and Stoch1>Stoch2 then {tr=2; SetOrder(op_sell, lots, bid, 3, ask+stoploss*point, ask-takeprofit*point, red);
exit;};
//флетовые сделки
};
};
if TotalTrades>0 then
{
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)<=OP_SELL and OrderValue(cnt,VAL_SYMBOL)=Symbol then
{
If OrderValue(cnt,VAL_TYPE)=OP_BUY then
{
if (adx1<adx2 and tr=1) or (tr=2 and Stoch1>UpZone) then
//условия на закрытие трендовой и флетовой лонговой сделки
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit;
};
};
If OrderValue(cnt,VAL_TYPE)=OP_SELL then
{
if (adx1<adx2 and tr=1) or (tr=2 and Stoch1<DownZone) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);
//условия на закрытие трендовой и флетовой шортовой сделки
Exit;
};
};
};
};};
15.3 Заключение
Возможно, многие скажут, что алгоритм не очень универсален и то, что он однозначно убыточен, но этот эксперт и не претендует на роль рабочего эксперта. С методической стороны, эксперт не такой уж и простой и я уверен, что читатели, желающие в совершенстве изучить язык, обязательно в нем что-то подчеркнут.
Как обычно буду ждать Ваших писем, если вопросов будет много или будут особенно интересные, отвечу на них в следующем выпуске.
Компания <Fxtest>
Халхальян Артур
техническая поддержка трейдеров
artur@fxtest.ru