• forextimes
  • trader@forextimes.ru
  • +48 506-586-281
  • +375 29 91-045-91
|

Учимся писать эксперты для MetaTrader. Урок №6

Обучение MQL II. Урок 6


   Здравствуйте, дорогие читатели! Сегодня мы научимся контролировать открытые позиции. В конце урока мы напишем эксперт. Серьезным отличием этого эксперта от прошлых будет то, что выход из позиции будет осуществляться не только по стопордеру, но и по условию закрытия.


6.1. Количество открытых позиций
За количество открытых позиций отвечает переменная TotalTrades. Если Вы хотите осуществлять и всегда иметь только одну открытую позицию, то использовать конструкцию


 If TotalTrades=0 then {———–};
 или
 If TotalTrades=1 then exit ;


6.2 Функция Order Value
Функция OrderValue – параметры значения открытой позиции.
Синтаксис: OrderValue (position,mode)
Position – порядковый номер открытой позиции;
Mode – этот параметр может принимать множество значений в зависимости от того какой параметр открытой позиции нужно получить.
Mode может иметь следующий вид:VAL_CLOSEPRICE – текущая цена закрытия;
VAL_CLOSETIME – время закрытия;
VAL_COMMENT – комментарий;
VAL_LOTS – количество лотов;
VAL_OPENPRICE – цена открытия позиции;
VAL_OPENTIME – время открытия позиции;
VAL_PROFIT – текущий профит;
VAL_STOPLOSS – цена срабатывания стоплосса;
VAL_SWAP – текущий своп за перенос позиции;
VAL_SYMBOL – валютная пара;
VAL_TAKEPROFIT – цена срабатывания тейкпрофита;
VAL_TICKET – номер позиции;
VAL_TYPE – тип позиции (buy, sell и т.д.).


Имея несколько открытых позиций, или даже одну, для идентификации параметров открытой позиции удобно пользоваться циклом for.


for cnt=1 to TotalTrades
   {
       if OrderValue(cnt,VAL_TYPE)<=OP_SELL and // это открытая позиция? OP_BUY или OP_SELL
     OrderValue(cnt,VAL_SYMBOL)=Symbol then // инструмент совпадает?
   {
       If OrderValue(cnt,VAL_TYPE)=OP_BUY then // открыта длинная позиция
    ………………..


6.3. Функция ModifyOrder
Эта функция нужна что бы изменить установленные стоп ордеры. Например, эта функция используется для поджатия стоплосса (трейлинг стоп). С помощью этой функции также можно изменить тейкпрофит.


Синтаксис: ModifyOrder(order,price,stoploss,takeprofit,color)
Order- по этому параметру осуществляется идентификация конкретного ордера;
Stoploss- новый стоплосс;
Takeprofit- новый тейкпрофит;
Color- цвет в который окрасится значок на графике цен;


Пример изменения стоплосса.


If TrailingStop>0 then // пользователь выставил в настройкахтрейлингстоп
{                // значит мы идем его проверять
If (Bid-OrderValue (cnt, VAL_OPENPRICE)) > (Point*TrailingStop) then
{
If OrderValue(cnt, VAL_STOPLOSS) < (Bid-Point*TrailingStop) then
{
ModifyOrder(OrderValue(cnt, VAL_TICKET), OrderValue(cnt,VAL_OPENPRICE),
Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;


6.4 Функция CloseOrder
С помощью этой функции осуществляется закрытие открытой позиции. Чаще всего это происходит при срабатывании установленного условия. Т.е. совместно с оператором if then.


Синтаксис: CloseOrder(order,lots,price,slippage,color);
Order – по этому параметру осуществляется идентификация конкретного ордера;
Lots – количество лотов у открытой позиции;
Slippage – проскльзывание;
Color- цвет в который окрасится значок на графике цен;


Пример.
CloseOrder ( OrderValue ( cnt,VAL_TICKET ), OrderValue(cnt,VAL_LOTS),Bid,3,Violet);



6.5 Эксперт
За основу возьмем эксперт из прошлого выпуска, т.к.его цель закрепление материала.
Надеюсь, Вы сами разберетесь что делает этот эксперт, все что для этого нужно есть в этом и прошлых уроках. Следующий выпуск я планирую сделать практическим, т.к.теперь Вы обладаете достаточными знаниями, что бы писать довольно серьезные эксперты. Я был бы очень рад, если бы Вы, дорогие читатели, написали мне какой эксперт Вы хотите увидеть на страницах следующего номера. Самый интересный алгоритм будет реализован в следующем выпуске


 ./*[[


Name := Expert6
Author := Fxtest.ru
Link := forextimes.ru
Lots := 1.00
Stop Loss := 80
Take Profit := 80
Trailing Stop := 0
]]*/


defines: per(7),Upzone(70),Downzone(30),BigTrend(100);
//per-период RSI; Upzone, Downzone-оверзоны, BigTrend-период средней показывающей
глобальный тренд


var: r1(0),r2(0),m1(0),m2(0),cnt(0);


// r1-прошлое значение RSI r2-позапрошлое значение RSI


r1=iRSI(per,1);
r2=iRSI(per,2);
m1=iMA(BigTrend,MODE_SMA,1);


//MA простого типа (SMA)


m2=iMA(BigTrend,MODE_SMA,2);
if TotalTrades<1 then
{
 //играть если открытых позиций нет


if r2>r1 and r2>Upzone and m1<m2 then
//если образовался экстремум и он выше верхней оверзоны, и глобальный тренд вниз х, продавай
{
SetOrder(op_sell,lots,bid,3,ask+stoploss*point,ask-takeprofit*point,red); exit;};
if r2<r1 and r2<Downzone and m1>m2 then
//если образовался экстремум и он ниже нижней оверзоны, и глобальный тренд вверх, покупай
{
SetOrder(op_buy,lots,ask,3,bid-stoploss*point,bid+takeprofit*point,green);
exit;
};
};


if TotalTrades>0 then
{
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)<=OP_SELL and


//позиция buy или sell и по валютной паре скоторой работает эксперт


OrderValue(cnt,VAL_SYMBOL)=Symbol then
{
If OrderValue(cnt,VAL_TYPE)=OP_BUY then


//если buy


{
if r2>50 and r1<r2 then
// условие на закрытие
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
//закрытие позиции
Exit;
};
};
If OrderValue(cnt,VAL_TYPE)=OP_SELL then


//если sell
{if r2<50 and r1>r2 then


// условие на закрытие
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);


//закрытие позиции
Exit;
};
};
};
};
};


Халхальян Артур  artur@fxtest.ru