Урок 7 - советник на основе МА и ATR
Сегодня будем писать и разбирать советник на основе МА и ATR.
Вход при пересечении цены первой МА и ATR больше определённого уровня.
Выход при пересечении цены второй МА или ТП||СЛ.
Советник.
#property copyright "eevviill"
extern double Lot = 0.1;
extern int MA_Enter_period = 30;
extern int MA_Exit_period = 60;
extern double ATR_level=0.0002;
extern int Size_of_Enter_Candle=5;
extern int Stop_Loss = 24;
extern int Take_Profit = 21;
extern int Slippage = 4;
int Magic = 284;
double MA1;
double MA2;
double ATR;
int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
1)MA1=iMA(Symbol(),0,MA_Enter_period,0,MODE_LWMA,PRICE_CLOSE,1);
MA2=iMA(Symbol(),0,MA_Exit_period,0,MODE_LWMA,PRICE_CLOSE,1);
2)ATR=iATR(Symbol(),0,14,1);
double SLbuy=0, SLsell=0,TPbuy=0,TPsell=0;
if(Stop_Loss>0) {SLbuy=Ask-Stop_Loss*Point; SLsell=Bid+Stop_Loss*Point;}
if(Take_Profit>0) {TPbuy=Ask+Take_Profit*Point;TPsell=Bid-Take_Profit*Point;}
3)if(Volume[0]>1) return;
while(!IsTradeAllowed()) Sleep(2000);
4)if(OrdersTotal()<1)
5){if(Open[1]>MA1&&Close[1]<MA1&&ATR>=ATR_level&&High[1]-Low[1]>=Size_of_Enter_Candle*Point) OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SLsell,TPsell,"MA",Magic,0,Green);
if(Open[1]<MA1&&Close[1]>MA1&&ATR>=ATR_level&&High[1]-Low[1]>=Size_of_Enter_Candle*Point) OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SLbuy,TPbuy,"MA",Magic,0,Green);}
if(Volume[0]>1) return;
while(!IsTradeAllowed()) Sleep(2000);
6)OrderSelect(0,SELECT_BY_POS);
7)if(OrderMagicNumber()==284)
8){int ticket = OrderTicket();
9)if (Open[1]>MA2&&Close[1]<MA2 && OrderType()==OP_BUY)
10)OrderClose(ticket,Lot,Bid,Slippage,OrangeRed);
if (Open[1]<MA2&&Close[1]>MA2 && OrderType()==OP_SELL) OrderClose(ticket,Lot,Ask,Slippage,OrangeRed);}
return(0);
}
Пояснение.
1)MA1=
iMA(Symbol(),0,MA_Enter_period,0,MODE_LWMA,PRICE_CLOSE,1);
Здесь мы присвоили переменной МА1 значение(цену где находится) индикатор МovingАvarage. Если индикатор встроееный в терминал, то перед его названием надо дописать i
МА имеет 7 свойств.
1.1)Название валютной пары(если Symbol(), то текущая валютная пара).
1.2)Таймфрейм(если 0, то текущий ТФ).
1.3)Период МА.
1.4)Сдвиг индикатора относительно ценового графика.
1.5)Метод усреднения(Simple==SMA и т.д.).
1.6)Цена закрытия или открытия свечи(цена открытия свечи==PRICE_OPEN и т.д.).
1.7)С какой свечи брать инфомацию(0==с текущей,1==с прошлой закрытой свечи,2==с позапрошлой закрытой свечи и .т.д.).
2)ATR=
iATR(Symbol(),0,14,1);
Здесь мы присвоили переменной ATR значение(уровень) индикатора ATR. Имеет 4 свойства.
2.1)Название валютной пары(если Symbol(), то текущая валютная пара).
2.2)Таймфрейм(если 0, то текущий ТФ).
2.3)Период индикатора.
2.4)С какой свечи брать инфомацию(0==с текущей,1==с прошлой закрытой свечи,2==с позапрошлой закрытой свечи и .т.д.).
3)
if(Volume[0]>1) return; здесь мы написали чтобы персчёт начинался только с новой свечи.
Volume содержит данные всех тиков. [0] здесь записывается номер свечи. Выходит мы написали если на свече больше 1 тика, то остальные действия прерываются.
4)
if(OrdersTotal()<1) здесь мы написали что если открытых(и отложенных) ордеров меньше 1, то... Функция rdersTotal() возвращает значение всех открытых и отложеных ордеров.
5
){if(Open[1]>MA1&&Close[1]<MA1&&ATR>=ATR_level&&High[1]-Low[1]>=Size_of_Enter_Candle*Point) здесь мы написали условие для открытия ордера, а именно SELL. Итак.
5.1)Open[1]>MA1&&Close[1]<MA1
Open это цена открытия свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
Close это цена закрытия свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
5.2)ATR>=ATR_level здесь мы указали что минимальный уровень ATR должен ровнятся или быть больше ATR_level.
5.3)High[1]-Low[1]>=Size_of_Enter_Candle*Point здесь мы указали что входная свеча должа быть больше определённой величины.
High это максимальная цена свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
Low это минимальная цена свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
6)
OrderSelect(0,SELECT_BY_POS); если нам надо закрыть ордер, то надо сначало его выбрать с помощю функции OrderSelect(). Она имеет 3 свойства.
6.1)Если второе свойство SELECT_BY_POS, то здесь вводим порядковый номер в списке открытых ордеров. Если SELECT_BY_TICKET, то номер тикета.
6.2)SELECT_BY_POS==выбор ордера по порядковому номеру в списке.
SELECT_BY_TICKET==выбор ордера по тикету ордера.
6.3)MODE_TRADES==выбор с открытых ордеров.
MODE_HISTORY==выбор с закрытых ордеров.
7)
if(OrderMagicNumber()==284) здесь мы использовали функцию OrderMagicNumber(). Эта функция находит(среди выбраных) ордер с определённым меджиком.
8)
int ticket = OrderTicket() здесь мы присвоили переменной int ticket тикет выбраного нами ордера с помощю функции OrderTicket()
9)
if (Open[1]>MA2&&Close[1]<MA2 && OrderType()==OP_BUY) здесь мы указали условие на закрытие ордера.
9.1)OrderType()==OP_BUY значит что мы с помощю функции OrderType()(которая возвращает тип нашего ордера) будем закрывать только BUY.
10)
OrderClose(ticket,Lot,Bid,Slippage,OrangeRed); это функция закрытия ордера. Имеет 5 свойств.
10.1)Номер тикета.
10.2)Лот закрытия.
10.3)Цена(Bis,Ask).
10.4)Проскальзывание.
10.5)Цвет значка на графике при закрытиии ордера.