Учимся писать эксперты для 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