Обучение MQL II. Урок 9
Здравствуйте дорогие читатели. Сегодня мы напишем эксперт и пользовательский индикатор. Эксперт будет торговать с использованием индикатора.
9.1. Алгоритм и код индикатора
Индикатор использует два массива данных, он состоит из двух линий. Обе линии это скользящие средние. Первая средняя строится от максимальных цен, вторая от минимальных. Для этого мы используем стандартный расширенный индикатор скользящей средней. Он имеет такой вид:
iMAEx(period, ma_method, ma_shift, applied_price, shift)
В индикаторе у нас есть одна внешняя переменная, она определяет период средних.
/*[[
Name := urovni
Author := forextimes
Link := artur@fxtest.ru
Separate Window := NoFirst
Color := Blue
First Draw Type := Line
First Symbol := 217
Use Second Data := Yes
Second Color := Red
Second Draw Type := Line
Second Symbol := 218
]]*/
Inputs: per(21);
Variable : shift(0), HMa(0), lMa(0);
SetLoopCount(0);
// loop from first bar to current bar (with shift=0)
For shift=Bars-1 Downto 0 Begin
HMa=iMAEx(per, MODE_EMA, 0, PRICE_HIGH, shift);
LMa=iMAEx(per, MODE_EMA, 0, PRICE_LOW, shift);
SetIndexValue(shift, HMa);
SetIndexValue2(shift, LMa);
End;
Алгоритм очень прост, поэтому пояснения я не пишу.
9.2. Алгоритм и код эксперта
Эксперт проверяет наличие тренда и отслеживает положение цены относительно линий индикатора. Наличие тренда проверяется очень примитивно, проверятся последние три значения скользящей средней, если каждое следующее больше предыдущего тренд бычий, иначе медвежий. Если при бычьем тренде цена меньше нижней средней пользовательского индикатора, осуществляется покупка; если при медвежьем тренде цена больше верхней линии индикатора осуществляется продажа.
Выход осуществляется как по стоп ордерам так и по условию, условием выхода является достижение противоположной линии пользовательского индикатора.
Имеется две внешние переменные, первая -определяет период индикатора, - определяет период средних определяющих тренд.
Стоит ограничение по времени на открытие позиции. Это сделано для того чтобы не открывалось несколько позиций на одном баре. Условие имеет вид:
if curtime-LastTradeTime<4*3600 then exit;
цифра перед <*3600>, это значение таймфрема в часах
/*[[
Name := expertUrovni
Author := forextimes
Link := fxtest.ru
Lots := 1.00
Stop Loss := 30
Take Profit := 50
Trailing Stop :=0
]]*/
defines:per(5), perMa(21);
var:HMa0(0), LMa0(0), Ma1(0), Ma2(0), Ma3(0), cnt(0);
if curtime-LastTradeTime<4*3600 then exit;
/*
HMa0=iCustom("urovni", per, MODE_FIRST, 0);
LMa0=iCustom("urovni", per, MODE_SECOND, 0);
*/
HMa0=iMAEx(per, MODE_EMA, 0, PRICE_HIGH, 0);
LMa0=iMAEx(per, MODE_EMA, 0, PRICE_LOW, 0);
Ma1=iMAEx(perMa, MODE_EMA, 0, PRICE_close, 1);
Ma2=iMAEx(perMa, MODE_EMA, 0, PRICE_close, 2);
Ma3=iMAEx(perMa, MODE_EMA, 0, PRICE_close, 3);
if TotalTrades=0 then {
if Ma1-Ma2>0 and Ma2-Ma3>0 and ask0 and Ma2-Ma1>0 and bid>HMa0
then{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 bid>HMa0 then
{
CloseOrder(OrderValue (cnt, VAL_TICKET), OrderValue(cnt, VAL_LOTS), Bid, 3, Violet);
Exit;
};
};
If OrderValue(cnt, VAL_TYPE)=OP_SELL then
{
if askartur@fxtest.ru