Выполнил:
Проверили:
Группа:
Оценка______________
Дата:________________
Отчёт по лабораторной работе №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);
}



