Выполнил:

Проверили:

Группа:

Оценка______________

Дата:________________

Отчёт по лабораторной работе №4.

«Имитационное моделирование процессов финансового рынка.

Работа с ордерами в информационно-торговой системе. Открытие позиции и установка отложенных ордеров»

Вариант №3

Вариант

P1

P2

X1

Y1

Z1

Z2

X2

3.

12

16

25

50

Buy Stop

Sell Limit

20

Варианты заданий для МТС – время автоматического открытия ордеров в течение каждого часа.

Вариант

Ордер Buy открыть в _____ минут

Ордер Sell открыть в _____ минут

3.

30

45

Задание №1

Настроить четыре окна торгового терминала, отображающие изменение цены основных валютных пар, следующим образом:

- период – 5 мин.,

- сетку убрать,

- показать объемы,

- фон белый,

- линии черные,

- тип графиков – японские свечи: бычья– белая, медвежья – синяя,

- фиксировать масштаб.

Задание №2

Отобразить в окнах следующие индикаторы:

- экспоненциальная скользящая средняя MA - период Р1, применить к Close, цвет красный,

- экспоненциальная скользящая средняя MA - период Р2, применить к Close, цвет темно-синий.

Результат выполнения задания:

Задание №3

Открыть рыночные ордера по четырем основным валютным парам объемом 1 лот с ограничением потерь на Х1 пунктов и ограничением прибыли на Y1 пунктов.

Результат выполнения задания:

Задание №4

Открыть отложенный ордер по четырем основным валютным парам объемом 1 лот, из них два ордера - типа Z1 и два ордера – типа Z2, по цене на Х2 пунктов отличающейся от рыночной цены с ограничением потерь на Х1 пунктов и ограничением прибыли на Y1 пунктов.

Результат выполнения задания:

Задание №5

Подключить программу, моделирующую работу механической торговой системы (МТС) – lab4.mq4

Результат выполнения задания:

Задание №6

Изменить время автоматического открытия ордеров при работе МТС lab4.mq4, в соответствии с заданием варианта.

Результат выполнения задания (листинг программы):

//++

//Открытие ордеров в определенные моменты времени (изменение времени по варианту)

//++

// #property

// #property

extern double Lots0=1;

extern int Slippage0=3;

int PrevBarTime=0,OpenNewOrder=0,StopLoss0=40,Profit0=80;

int start()

{

double Price1,StopLoss1,TakeProfit1;

int Ticket1;

Alert(Symbol(),"Проверка1", " Time=",Time[0], " PrevBarTime=",PrevBarTime);

if (PrevBarTime!= Time[0]) // обнаружена новая завершенная свечка

{

PrevBarTime = Time[0];

Alert(Symbol(),"ПРОВЕРКА2", " Time=",Time[0], " PrevBarTime=",PrevBarTime);

//здесь, когда на графике появилась новая законченная свечка

OpenNewOrder=0;

if (Minute() >= 0 && Minute() <30 )//условие открытия ордера Buy

{

OpenNewOrder=1;

}

if (Minute() >= 0 && Minute() < 45)//условие открытия ордера Sell

{

OpenNewOrder=2;

}

}

//if PrevBarTime <> Time

Alert(Symbol(),"Проверка3", " OpenNewOrder=",OpenNewOrder);

// ---

//Откроем рыночный ордер Buy

if (OpenNewOrder==1)

{

Alert(Symbol(),"Проверка5", " OpenNewOrder=",OpenNewOrder," ",Lots0);

//до новой свечки не открываемся

OpenNewOrder=0;

Price1=Ask;

StopLoss1=Price1-StopLoss0*Point;

TakeProfit1=Price1+Profit0*Point;

Ticket1=OrderSend(Symbol(),OP_BUY, Lots0,Price1,Slippage0,

StopLoss1,TakeProfit1,NULL,0,0,Blue); // исполняем

if(Ticket1>0)

{

if(OrderSelect(Ticket1,SELECT_BY_TICKET, MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

} // if OpenNewOrder=1

// ---

// откроем рыночный ордер Sell

if (OpenNewOrder==2)

{

Alert(Symbol(),"Проверка5", " OpenNewOrder=",OpenNewOrder," ",Lots0);

//до новой свечки не открываемся

OpenNewOrder=0;

Price1=Bid;

StopLoss1=Price1+StopLoss0*Point;

TakeProfit1=Price1-Profit0*Point;

Ticket1=OrderSend(Symbol(),OP_SELL, Lots0,Price1,Slippage0,

StopLoss1,TakeProfit1,NULL,0,0,Red); // исполняем

if(Ticket1>0)

{

if(OrderSelect(Ticket1,SELECT_BY_TICKET, MODE_TRADES))

Print("Sell order opened : ",OrderOpenPrice());

}

else Print("Error opening Sell order : ",GetLastError());

return(0);

} // if OpenNewOrder=2

return(0);

}

//++

Задание №7

Разработать модель механической торговой системы (советника) на основе использования индикаторов скользящей средней (iMA) с периодами 7 и 34.

Результат выполнения задания (листинг программы):

//++

//| Советник на основе скользящей средней |

//++

extern double TakeProfit=50;

extern double Lots = 0.1;

extern double TrailingStop = 30;

extern double MACDOpenLevel=3;

extern double MACDCloseLevel=2;

extern double MATrendPeriod=26;

// первичные проверки данных

// важно удостовериться что эксперт работает на нормальном графике и

// пользователь правильно выставил внешние переменные (Lots, StopLoss,

// TakeProfit, TrailingStop)

// в нашем случае проверяем только TakeProfit

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

int start()

{

double MacdCurrent, MacdPrevious, SignalCurrent;

double SignalPrevious, MaCurrent, MaPrevious;

int cnt, ticket, total;

MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE, MODE_MAIN,0);

MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE, MODE_MAIN,1);

SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE, MODE_SIGNAL,0);

SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE, MODE_SIGNAL,1);

MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA, PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA, PRICE_CLOSE,1);

// теперь надо определиться - в каком состоянии торговый терминал?

// проверим, есть ли ранее открытые позиции или ордеры?

total=OrdersTotal();

if(total<1)

{

Print("not open orders");

return(0);

}

// нет ни одного открытого ордера

// на всякий случай проверим, если у нас свободные деньги на счету?

// значение 1000 взято для примера, обычно можно открыть 1 лот

if(AccountFreeMargin()<(1000*Lots))

{

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

// проверяем на возможность встать в длинную позицию (BUY)

if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&

MacdPrevious<SignalPrevious &&

MathAbs(MacdCurrent)>(MACDOpenLevel*Point) &&

MaCurrent>MaPrevious)

{

ticket=OrderSend(Symbol(),OP_BUY, Lots, Ask,3,0,

Ask+TakeProfit*Point,"macd sample",

16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

// проверяем на возможность встать в короткую позицию (SELL)

if(MacdCurrent>0 && MacdCurrent<SignalCurrent &&

MacdPrevious>SignalPrevious &&

MacdCurrent>(MACDOpenLevel*Point) &&

MaCurrent<MaPrevious)

{

ticket=OrderSend(Symbol(),OP_SELL, Lots, Bid,3,0,

Bid-TakeProfit*Point,"macd sample",

16384,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

}

// здесь мы завершили проверку на возможность открытия новых позиций.

// новые позиции открыты не были и просто выходим

return(0);

}