Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом.doc
Скачиваний:
5
Добавлен:
06.03.2016
Размер:
2.77 Mб
Скачать

Глава 3

4 Глава

//Наконец, в четвертой главе приводится описание разработанной информационно-программной системы: ее структура, примененные инструментальные средства, входные и выходные данные, интерфейс с пользователем, результирующие документы и т.д. Здесь же можно привести снимки экранов, демонстрирующие работу программы, а также результаты контрольных просчетов. Не следует, однако, перегружать эту главу рисунками и таблицами. Объем текста в ней должен составлять не менее 50%. Если результирующие данные велики, следует вынести их в приложения.

Глава 4

Основной код программы

//--------------------------------------------------------------------------------

//| A_FIBO1.mq4 |

//| Polina 2014 |

//| http://www.mql5.com |

//--------------------------------------------------------------------------------

#property copyright "Polina 2014"

#property link "http://www.mql5.com"

#property version "1.00"

//---ВКЛЮЧАЕМЫЕ_ФАЙЛЫ-------------------------------------------------------------

#include <stdlib.mqh>

#include <StdLibErr.mqh>

#include <stderror.mqh>

#include <WinUser32.mqh> //стндартные включаемые библиотеки

#include <Trend.mqh> //определение тренда

#include <Parols.mqh> //проверка паролей

#include <FiboCreate.mqh> //создание уровней Фибоначчи

#include <VLineCreate.mqh> //создание линий таймсерий

#include <FiboVLineDelete.mqh> //удаление уровней Фибоначчи и линий таймсерий

#include <ZapisVcsv.mqh> //запись данных в ***.csv файл

#include <Lots.mqh> //рассчет лотов

#include <OpenOrders.mqh> //выставление отложенных ордеров

#include <Trall.mqh> //трейлинг-стоп ордеров

#include <Errors.mqh> //обработка ошибок

//---ГЛОБАЛЬНЫЕ_ПЕРЕМЕННЫЕ--------------------------------------------------------

//разрешения на работу функций

extern bool Work =true; //Wort - разрешение на заключение сделок

extern bool WorkPlus =true; //WorkPlus - разрешение на заключение сделок на покупку

extern bool WorkMinus=true; //WorkMinus - разрешение на заключение сделок на продажу

extern bool WorkBL =true; //WorkBL - разрешение на выставление лимитных ордеров BuyLimit

extern bool WorkSL =true; //WorkSL - разрешение на выставление лимитных ордеров SellLimit

extern bool WorkStop =true; //WorkStop - разрешение на выставление ордеров BuyStop и SellStop

extern bool WorkTrend=true; //WorkTrend - разрешЕние на включение автоматической трендовой сортировки условий входа

extern bool WorkPerc =false; //WorkPerc - разрешение на автоматический рассчет ордеров

//extern bool WorkLot =false; //WorkLot - разрешение на пропорциональный капиталу рассчет лотов (usd)

extern bool Zapis =true; //Zapis - разрешение на запись в ***.csv файл

extern double RasstWorkNo=1000 ; //RasstWorkNo - ширина флета в пунктах, после которой сделки не заключаются

extern double RasstWorkAll=150; //RasstWorkAll - ширина флета в пунктах, после которой сделки заключаются и на покупку, и на продажу

extern double TrallStop=800 ; //TrallStop - размер трейлинг-стопа стоплоссов

extern double Pointer=0.001 ; //Pointer - отступ от уровней Фибоначчи 0.0 и 100.0 для выставления отложенных ордеров (0.00001 - 1 пункт)

extern string timeend ="07:30"; //Timeend - время завершения флета

//лоты, заданные в лотах

extern double Lot =0.1; //Lot - лот для BuyStop и SellStop

extern double Lot21=0.05; //Lot21 - лот для BuyLimit1

extern double Lot22=0.03; //Lot22 - лот для BuyLimit2

extern double Lot23=0.02; //Lot23 - лот для BuyLimit3

extern double Lot31=0.05; //Lot31 - лот для SellLimit1

extern double Lot32=0.03; //Lot32 - лот для SellLimit2

extern double Lot33=0.02; //Lot33 - лот для SellLimit3

//параметры MA

extern int TimeframeMA=PERIOD_D1; //TimeframeMA - таймфрейм индикатора МА

extern int PeriodMA =6; //PeriodMA - период усреднения для вычисления индикатора МА

extern int SdvigSr =3; //SdvigSr - сдвиг индикатора МА относительно ценового графика

extern int MethodMA =MODE_EMA; //MethodMA - метод усреднения МА

extern int PriceMA =PRICE_CLOSE; //PriceMA - используемая индикатором МА цена

extern int Sdvg =1; //Sdvg - индекс получаемого значения из индикаторного буфера

//глобальные переменные для параматра "Ticket"

extern int Ticket221=0; //Ticket221 - тикет для BuyLimit1

extern int Ticket222=0; //Ticket222 - тикет для BuyLimit2

extern int Ticket223=0; //Ticket223 - тикет для BuyLimit3

extern int Ticket331=0; //Ticket331 - тикет для SellLimit1

extern int Ticket332=0; //Ticket332 - тикет для SellLimit2

extern int Ticket333=0; //Ticket333 - тикет для SellLimit3

extern int Ticket44 =0; //Ticket44 - тикет для BuyStop

extern int Ticket55 =0; //Ticket55 - тикет для SellStop

int OnInit()

{

Errors(); //функция обработки ошибок

return(INIT_SUCCEEDED);

}

void OnDeinit(const int reason)

{

}

void OnTick()

{

//---ПЕРЕМЕННЫЕ--------------------------------------------------------------------

//---переменные_рабочих_таймсерий--------------------------------------------------

bool DoNothing=false; //период с 23:30 до 07:30

bool DoAll =false; //период с 07:31 до 22:00

bool DeletAll =false; //период с 22:01 до 23:29

datetime datatime =TimeCurrent();

datetime datatime1=datatime-86400;

string time_1="23:30"; //начало флета

string time_2="07:30"; //конец флета

string time_3="07:31"; //начало рабочей таймсерии

string time_4="22:00"; //конец рабочей таймсерии

string time_5="22:01"; //начало периода ожидания

string time_6="23:29"; //конец периода ожидания

datetime Time_1=StrToTime(TimeToStr(datatime1, TIME_DATE)+" "+time_1);

datetime Time_2=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+time_2);

datetime Time_3=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+time_3);

datetime Time_4=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+time_4);

datetime Time_5=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+time_5);

datetime Time_6=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+time_6);

//---переменные_графических_объектов-----------------------------------------------

long chart_ID =0; //окно графика

color clrfibo[] ={Red, DodgerBlue}; //цвет уровней Фибоначчи

color clrline =clrRed; //цвет линий таймсерий

int stylefibo[]={2, 0}; //стиль уровней Фибоначчи

int styleline =2; //стиль линий таймсерий

int widthfibo[]={1, 1}; //ширина уровней Фибоначчи

int widthline =1; //ширина линий таймсерий

double fibolevel[]={-10.094, -5.854, -4.98, -4.108, -3.236, -2.618, -2.11, -1.618, -1.11, -0.618, -0.382,

0.0, 0.11, 0.236, 0.382, 0.5, 0.618, 0.764, 0.89, 1.0,

1.382, 1.618, 2.11, 2.618, 3.11, 3.618, 4.236, 5.108, 5.98, 6.854, 11.094};

string namelevel[]={"1109.4", "685.4", "598.0", "510.8", "423.6", "361.8", "311.0", "261.8", "211.0", "161.8", "138.2",

"0.0/100.0", "11.0/89.0", "23.6/76.4", "38.2/61.8", "50.0", "61.8/38.2", "76.4/23.6", "89.0/11.0", "100.0/0.0",

"138.2", "161.8", "211.0", "261.8", "311.0", "361.8", "423.6", "510.8", "598.0", "685.4", "1109.4"};

string timebegin="23:30";

//string timeend="07:30";

string timeend2 ="22:00";

string exptime ="21:59"; //время истечения срока неоткрытых ордеров

datetime timefibo1=StrToTime(TimeToStr(datatime1, TIME_DATE)+" "+timebegin);

datetime timefibo2=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+timeend);

datetime timeline1=StrToTime(TimeToStr(datatime1, TIME_DATE)+" "+timebegin);

datetime timeline2=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+timeend);

datetime timeline3=StrToTime(TimeToStr(datatime , TIME_DATE)+" "+timeend2);

int bar1=iBarShift(NULL, 0, timefibo1);

int bar2=iBarShift(NULL, 0, timefibo2);

double pricefibo1=High[iHighest(NULL, 0, MODE_HIGH, bar1-bar2, bar2)];

double pricefibo2=Low [iLowest (NULL, 0, MODE_LOW , bar1-bar2, bar2)];

string namefibo ="Fibo";

string nameline1="VLine1";

string nameline2="VLine2";

string nameline3="VLine3";

//---ТАЙМСЕРИИ---------------------------------------------------------------------

if(datatime>=Time_1 && datatime<=Time_2) DoNothing=true;

//период с 23:30 до 07:30, ничего не происходит

if(datatime>=Time_3 && datatime<=Time_4) DoAll=true;

/*период с 07:31 до 22:00, рассчитываются и создаются уровни Фибоначчи,

линии таймсерий, выставляются отложеннве ордера (несработавшие удаляются по экспирации в 21:59)*/

if(datatime>=Time_5 && datatime<=Time_6) DeletAll=true;

//период с 22:01 до 23:29, удаляются уровни Фибоначчи и линии таймсерий, обнуляются логические переменные

//---DoNothing---------------------------------------------------------------------

if(DoNothing==true) Sleep(600);

//---DoAll-------------------------------------------------------------------------

if(DoAll==true)

{

Parols(); //функция осуществляет проверку паролей

FiboCreate(clrfibo, stylefibo, widthfibo, fibolevel, namelevel, namefibo, timefibo1, pricefibo1, timefibo2, pricefibo2);

//функция создает уровни Фибоначчи на графике

VLineCreate(nameline1, nameline2, nameline3, timeline1, timeline2, timeline3, clrline, styleline, widthline);

//функция создает линии таймсерий на графике

//---рассчет_цены_для_каждого_уровня_Фибоначчи-------------------------------------

double Price_11=ObjectGet(namefibo,OBJPROP_PRICE2); //0.0

double Price_19=ObjectGet(namefibo,OBJPROP_PRICE1); //100.0

double Price_0 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[30])),5); //-1109.4

double Price_1 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[29])),5); //-685.4

double Price_2 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[28])),5); //-598.0

double Price_3 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[27])),5); //-510.8

double Price_4 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[26])),5); //-423.6

double Price_5 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[25])),5); //-361.8

double Price_6 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[24])),5); //-311.0

double Price_7 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[23])),5); //-261.8

double Price_8 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[22])),5); //-211.0

double Price_9 =NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[21])),5); //-161.8

double Price_10=NormalizeDouble(((Price_19-(Price_19-Price_11)*fibolevel[20])),5); //-138.2

double Price_12=NormalizeDouble(((Price_19-Price_11)*fibolevel[12]+Price_11),5); //11.0/89.0

double Price_13=NormalizeDouble(((Price_19-Price_11)*fibolevel[13]+Price_11),5); //23.6/76.4

double Price_14=NormalizeDouble(((Price_19-Price_11)*fibolevel[14]+Price_11),5); //38.2/61.8

double Price_15=NormalizeDouble(((Price_19-Price_11)*fibolevel[15]+Price_11),5); //50.0

double Price_16=NormalizeDouble(((Price_19-Price_11)*fibolevel[16]+Price_11),5); //61.8/38.2

double Price_17=NormalizeDouble(((Price_19-Price_11)*fibolevel[17]+Price_11),5); //76.4/23.6

double Price_18=NormalizeDouble(((Price_19-Price_11)*fibolevel[18]+Price_11),5); //89.0/11.0

double Price_20=NormalizeDouble(((Price_19-Price_11)*fibolevel[20]+Price_11),5); //138.2

double Price_21=NormalizeDouble(((Price_19-Price_11)*fibolevel[21]+Price_11),5); //161.8

double Price_22=NormalizeDouble(((Price_19-Price_11)*fibolevel[22]+Price_11),5); //211.0

double Price_23=NormalizeDouble(((Price_19-Price_11)*fibolevel[23]+Price_11),5); //261.8

double Price_24=NormalizeDouble(((Price_19-Price_11)*fibolevel[24]+Price_11),5); //311.0

double Price_25=NormalizeDouble(((Price_19-Price_11)*fibolevel[25]+Price_11),5); //361.8

double Price_26=NormalizeDouble(((Price_19-Price_11)*fibolevel[26]+Price_11),5); //423.6

double Price_27=NormalizeDouble(((Price_19-Price_11)*fibolevel[27]+Price_11),5); //510.8

double Price_28=NormalizeDouble(((Price_19-Price_11)*fibolevel[28]+Price_11),5); //598.0

double Price_29=NormalizeDouble(((Price_19-Price_11)*fibolevel[29]+Price_11),5); //685.4

double Price_30=NormalizeDouble(((Price_19-Price_11)*fibolevel[30]+Price_11),5); //1109.4

//---рассчет_параметров_ордеров----------------------------------------------------

//0 - Buy

//1 - Sell

//2 - BuyLimit (Ticket221, Ticket222, Ticket223)

//3 - SellLimit (Ticket331, Ticket332, Ticket333)

//4 - BuyStop (Ticket44)

//5 - SellStop (Ticket55)

double Price21=NormalizeDouble(Price_9 , Digits); //цена открытия BuyLimit1

double Price22=NormalizeDouble(Price_8 , Digits); //цена открытия BuyLimit2

double Price23=NormalizeDouble(Price_7 , Digits); //цена открытия BuyLimit3

double Price31=NormalizeDouble(Price_21, Digits); //цена открытия SellLimit1

double Price32=NormalizeDouble(Price_22, Digits); //цена открытия SellLimit2

double Price33=NormalizeDouble(Price_23, Digits); //цена открытия SellLimit3

double Price4 =NormalizeDouble((Price_19+Pointer), Digits); //цена открытия BuyStop

double Price5 =NormalizeDouble((Price_11-Pointer), Digits); //цена открытия SellStop

double StopLoss21=NormalizeDouble(Price_1 , Digits); //стоп-лосс BuyLimit1

double StopLoss22=NormalizeDouble(Price_1 , Digits); //стоп-лосс BuyLimit2

double StopLoss23=NormalizeDouble(Price_1 , Digits); //стоп-лосс BuyLimit3

double StopLoss31=NormalizeDouble(Price_29, Digits); //стоп-лосс SellLimit1

double StopLoss32=NormalizeDouble(Price_29, Digits); //стоп-лосс SellLimit2

double StopLoss33=NormalizeDouble(Price_29, Digits); //стоп-лосс SellLimit3

double StopLoss4 =NormalizeDouble(Price_10, Digits); //стоп-лосс BuyStop

double StopLoss5 =NormalizeDouble(Price_20, Digits); //стоп-лосс SellStop

double TakeProfit21=NormalizeDouble(Price_30, Digits); //тейк-профит BuyLimit1

double TakeProfit22=NormalizeDouble(Price_30, Digits); //тейк-профит BuyLimit2

double TakeProfit23=NormalizeDouble(Price_30, Digits); //тейк-профит BuyLimit3

double TakeProfit31=NormalizeDouble(Price_0 , Digits); //тейк-профит SellLimit1

double TakeProfit32=NormalizeDouble(Price_0 , Digits); //тейк-профит SellLimit2

double TakeProfit33=NormalizeDouble(Price_0 , Digits); //тейк-профит SellLimit3

double TakeProfit4 =NormalizeDouble(Price_30, Digits); //тейк-профит BuyStop

double TakeProfit5 =NormalizeDouble(Price_0 , Digits); //тейк-профит SellStop

datetime Expiration=StrToTime(TimeToStr(datatime, TIME_DATE)+" "+exptime); //удаление несработавших ордеров в 21:59

Trend(Price_19, Price_11); //функция определяет тренд

Lots(); //функция автоматического рассчета лотов в процентах

OpenOrders(Price_11, Price_19,

Price21, Price22, Price23, Price31, Price32, Price33, Price4, Price5,

StopLoss21, StopLoss22, StopLoss23, StopLoss31, StopLoss32, StopLoss33, StopLoss4, StopLoss5,

TakeProfit21, TakeProfit22, TakeProfit23, TakeProfit31, TakeProfit32, TakeProfit33, TakeProfit4, TakeProfit5,

Expiration);

//функция выставления ордеров

Trall(); //функция трейлинг-стопа стоп-лоссов

ZapisVcsv(datatime, Price_19, Price_11); //функция записи данных в файл ***.csv

Errors(); //функция обработки ошибок

}

//---DeletAll----------------------------------------------------------------------

if(DeletAll==true)

{

FiboVLineDelete(chart_ID, namefibo, nameline1, nameline2, nameline3); //функция удаления уровней Фибоначчи и линий таймсерий

Errors(); //функция обработки ошибок

Ticket221=0;

Ticket222=0;

Ticket223=0;

Ticket331=0;

Ticket332=0;

Ticket333=0;

Ticket44 =0;

Ticket55 =0;

Work =true;

Zapis=true;

}

}

Функция определения тренда

void Trend(double Price_19, double Price_11)

{

//---High-Low дня----------------------------------------------------+

double Highprice1=iHigh(NULL, PERIOD_D1, 1);

double Lowprice1 =iLow (NULL, PERIOD_D1, 1);

double Highprice2=iHigh(NULL, PERIOD_D1, 2);

double Lowprice2 =iLow (NULL, PERIOD_D1, 2);

//определение критериев----------------------------------------------+

if(WorkTrend==true)

{

if(Lowprice1>Lowprice2 && Highprice1>Highprice2)

{

WorkPlus =true;

WorkMinus=false;

}

if(Lowprice1<Lowprice2 && Highprice1<Highprice2)

{

WorkPlus =false;

WorkMinus=true;

}

if((Highprice1>=Highprice2 && Lowprice1<=Lowprice2) ||

(Highprice1<=Highprice2 && Lowprice1>=Lowprice2))

{

WorkPlus =false;

WorkMinus=false;

}

}

}

Функция проверки паролей

void Parols()

{

//проверить демо счет

if(IsDemo()==false)

{

printf("Это реальный счет! Торговля запрещена!");

PlaySound("Error.wav");

Work=false;

}

//проверить компанию

if (AccountCompany()!="Alpari Limited")

{

printf("Счет не принадлежит компании Альпари! Торговля запрещена!");

PlaySound("Error.wav");

Work=false;

}

//проверить номер счета

if(AccountNumber()!=7199383)

{

printf("Неправильный счет: "+(string)AccountNumber()+"! Торговля запрещена!");

PlaySound("Error.wav");

Work=false;

}

//проверить, на кого зарегистрирован счет

if(AccountName()!="Andreeva Polina")

{

printf("Счет зарегистрирован на постороннего пользователя: "+(string)AccountName()+"! торговля запрещена!");

PlaySound("Error.wav");

Work=false;

}

//проверить время истечения пробной версии

if(TimeCurrent()>StrToTime("2020.01.01 00:00:00"))

{

printf("Время пользования демо-версией программы истекло! Торговля запрещена!");

PlaySound("Error.wav");

Work=false;

}

}

Функция создания уровней Фибоначчи

void FiboCreate(color& clrfibo[], int& stylefibo[], int& widthfibo[],

double& fibolevel[], string& namelevel[], string namefibo,

datetime timefibo1, double pricefibo1, datetime timefibo2, double pricefibo2,

bool ry=False, long chart_ID=0, int sub_window=0, bool back=false,

bool selection=false, bool ray_left=false, bool ray_right=false,

bool hidden=false, long z_order=0)

{

int i, k=ArraySize(fibolevel);

if(ObjectFind(namefibo)<0) ObjectCreate(0, namefibo, OBJ_FIBO, 0, 0.0, 0.0);

ObjectSet(namefibo, OBJPROP_TIME1 ,timefibo1); //первая координата времени

ObjectSet(namefibo, OBJPROP_PRICE1 ,pricefibo1); //первая координата цены

ObjectSet(namefibo, OBJPROP_TIME2 ,timefibo2); //вторая координата времени

ObjectSet(namefibo, OBJPROP_PRICE2 ,pricefibo2); //вторая координата цены

ObjectSet(namefibo, OBJPROP_COLOR ,clrfibo[0]); //цвет объекта

ObjectSet(namefibo, OBJPROP_RAY ,ry); //флаг свойства луч

ObjectSet(namefibo, OBJPROP_STYLE ,stylefibo[0]); //стиль линии объекта

ObjectSet(namefibo, OBJPROP_WIDTH ,widthfibo[0]); //ширина линии объекта

ObjectSet(namefibo, OBJPROP_LEVELCOLOR ,clrfibo[1]); //цвет линии уровня объекта

ObjectSet(namefibo, OBJPROP_LEVELSTYLE ,stylefibo[1]); //стиль линии уровня объекта

ObjectSet(namefibo, OBJPROP_LEVELWIDTH ,widthfibo[1]); //ширина линии уровня объекта

ObjectSet(namefibo, OBJPROP_BACK ,back); //объект на заднем плане

ObjectSet(namefibo, OBJPROP_SELECTED ,selection); //выделенность объекта

ObjectSet(namefibo, OBJPROP_RAY_LEFT ,ray_left); //луч продолжается влево

ObjectSet(namefibo, OBJPROP_RAY_RIGHT ,ray_right); //луч продолжается вправо

ObjectSet(namefibo, OBJPROP_HIDDEN ,hidden); //запрет на показ имени графического объекта в списке объектов из меню терминала

ObjectSet(namefibo, OBJPROP_ZORDER ,z_order); //приоритет графического объекта на получение события нажатия мышки на графике

if(k>0)

{

ObjectSetInteger(chart_ID, namefibo, OBJPROP_FIBOLEVELS, k);

for (i=0; i<k; i++)

{

ObjectSetDouble(chart_ID, namefibo, OBJPROP_FIRSTLEVEL+i, fibolevel[i]);

ObjectSetFiboDescription(namefibo, i, StringSubstr(namelevel[i], 0)+" (%$)");

}

}

}

Функция создания линий таймсерий

void VLineCreate(string nameline1, string nameline2, string nameline3,

datetime timeline1, datetime timeline2, datetime timeline3,

color clrline, int styleline, int widthline,

long chart_ID=0, int sub_window=0, bool back=false, bool selection=false,

bool ray=false, bool hidden=false, long z_order=0)

{

if(ObjectFind(nameline1)<0)ObjectCreate(0, nameline1, OBJ_VLINE, 0, 0, 0);

ObjectSetInteger(chart_ID, nameline1, OBJPROP_TIME ,timeline1); //координата времени

ObjectSetInteger(chart_ID, nameline1, OBJPROP_COLOR ,clrline); //цвет объекта

ObjectSetInteger(chart_ID, nameline1, OBJPROP_STYLE ,styleline); //стиь объекта

ObjectSetInteger(chart_ID, nameline1, OBJPROP_WIDTH ,widthline); //ширина линии объекта

ObjectSetInteger(chart_ID, nameline1, OBJPROP_BACK ,back); //объект на заднем плане

ObjectSetInteger(chart_ID, nameline1, OBJPROP_SELECTABLE ,selection); //доступность объекта

ObjectSetInteger(chart_ID, nameline1, OBJPROP_RAY ,ray); //флаг свойства луч

ObjectSetInteger(chart_ID, nameline1, OBJPROP_HIDDEN ,hidden); //запрет на показ имени графического объекта в списке объектов из меню терминала

ObjectSetInteger(chart_ID, nameline1, OBJPROP_ZORDER ,z_order); //приоритет графического объекта на получение события нажатия мышки на графике

if(ObjectFind(nameline2)<0)ObjectCreate(0, nameline2, OBJ_VLINE, 0, 0, 0);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_TIME ,timeline2);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_COLOR ,clrline);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_STYLE ,styleline);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_WIDTH ,widthline);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_BACK ,back);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_SELECTABLE ,selection);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_RAY ,ray);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_HIDDEN ,hidden);

ObjectSetInteger(chart_ID, nameline2, OBJPROP_ZORDER ,z_order);

if(ObjectFind(nameline3)<0)ObjectCreate(0, nameline3, OBJ_VLINE, 0, 0, 0);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_TIME ,timeline3);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_COLOR ,clrline);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_STYLE ,styleline);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_WIDTH ,widthline);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_BACK ,back);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_SELECTABLE ,selection);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_RAY ,ray);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_HIDDEN ,hidden);

ObjectSetInteger(chart_ID, nameline3, OBJPROP_ZORDER ,z_order);

}

Функция удаления уровней Фибоначчи и линий таймсерий

void FiboVLineDelete(long chart_ID, string namefibo, string nameline1, string nameline2, string nameline3)

{

if(ObjectFind(namefibo) >0) ObjectDelete(0,namefibo) ;

if(ObjectFind(nameline1)>0) ObjectDelete(0,nameline1);

if(ObjectFind(nameline2)>0) ObjectDelete(0,nameline2);

if(ObjectFind(nameline3)>0) ObjectDelete(0,nameline3);

}

Функция записи данных в ***.csv файл

void ZapisVcsv(datetime datatime, double Price_19, double Price_11)

{

if(Zapis==true) //запись данных в таблицу ("Statistica.csv"), происходит один раз в день

{

double Highprice1=iHigh(NULL, PERIOD_D1, 1);

double Lowprice1 =iLow (NULL, PERIOD_D1, 1);

double Rasst =NormalizeDouble(((Price_19-Price_11) *100000),2);

double Rasst2=NormalizeDouble(((Highprice1-Lowprice1)*100000),2);

double IMA=iMA(NULL, TimeframeMA, PeriodMA, SdvigSr, MethodMA, PriceMA, Sdvg);

double Closeprice1=iClose(NULL, PERIOD_D1, 1);

string Litera;

if(IMA<Closeprice1) Litera="A";

if(IMA>Closeprice1) Litera="B";

if(IMA==Closeprice1) Litera="C";

int handle=FileOpen("Statistica.csv", FILE_READ|FILE_WRITE, ";");

FileSeek(handle, 0, SEEK_END);

FileWrite(handle, datatime, Price_19, Price_11, Rasst, Highprice1, Lowprice1, Rasst2, Litera); //список передаваемых параметров

FileClose(handle);

Zapis=false;

}

}

Функция проверки лотов

void Lots()

{

double One_Lot=MarketInfo(NULL, MODE_MARGINREQUIRED); //стоимость 1 лота

double Step =MarketInfo(NULL, MODE_LOTSTEP); //шаг изменения размера

double Free =AccountFreeMargin(); //свободные средства

if(Lot>0 || Lot21>0 || Lot22>0 || Lot23>0 || Lot31>0 || Lot32>0 || Lot33>0)

{

double Money=Lot*One_Lot;

double MoneyBL=(Lot21+Lot22+Lot23)*One_Lot;

if((Money+MoneyBL)>Free)

{

double NoFree=(Money+MoneyBL)-Free;

printf("Недостаточно средств для торговли! Необходимо добавить: "+(string)NoFree+".");

}

}

}

Функция выставления отложенных ордеров

void OpenOrders(double Price_11, double Price_19,

double Price21, double Price22, double Price23, double Price31, double Price32, double Price33, double Price4, double Price5,

double StopLoss21, double StopLoss22, double StopLoss23, double StopLoss31, double StopLoss32, double StopLoss33, double StopLoss4, double StopLoss5,

double TakeProfit21, double TakeProfit22, double TakeProfit23, double TakeProfit31, double TakeProfit32, double TakeProfit33, double TakeProfit4, double TakeProfit5,

datetime Expiration)

{

int spread=3;//MarketInfo(Symbol(),MODE_SPREAD);

double Rasst=NormalizeDouble((Price_19-Price_11)*100000,Digits); //ширина Уровней Фибоначчи в новых пунктах

if(Rasst>RasstWorkNo)

{

printf("Расстояние между уровнями Фибоначчи составляет "+(string)Rasst+" пунктов. Эксперт сегодня торговать не будет.");

Work=false;

}

if(Rasst<RasstWorkAll)

{

WorkPlus =true;

WorkMinus=true;

}

if(Ticket221!=0 && Ticket222!=0 && Ticket223!=0 && Ticket331!=0 && Ticket332!=0 && Ticket333!=0 && Ticket44!=0 && Ticket55!=0)

{

Work=false; //если сегодня ордера уже выставлены, новые не выставляются (учитываются только сегодняшние ордера)

}

for(int i=0; i<=OrdersTotal(); i++)

{

if(OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES)==true)

{

int Tip=OrderType();

if(Tip>1) Work=false;

}

}

if(Work==true) //если ордера не выставлены

{

if(Ticket221==0 && WorkPlus==true && WorkBL==true) //условия выставления отложенного ордера на покупку BuyLimit1

{

int Ticket21=OrderSend(Symbol(), OP_BUYLIMIT, Lot21, Price21, spread, StopLoss21, TakeProfit21, NULL, 115201615, Expiration, clrOrange);

if(Ticket21>0)

{

Ticket221=Ticket21;

printf("Выставлен ордер отложенный ордер на покупку BuyLimit №"+(string)Ticket21);

PlaySound("Ok.wav");

}

}

if(Ticket222==0 && WorkPlus==true && WorkBL==true) //условия выставления отложенного ордера на покупку BuyLimit2

{

int Ticket22=OrderSend(Symbol(), OP_BUYLIMIT, Lot22, Price22, spread, StopLoss22, TakeProfit22, NULL, 115201615, Expiration, clrOrange);

if(Ticket22>0)

{

Ticket222=Ticket22;

printf("Выставлен ордер отложенный ордер на покупку BuyLimit №"+(string)Ticket22);

PlaySound("Ok.wav");

}

}

if(Ticket223==0 && WorkPlus==true && WorkBL==true) //условия выставления отложенного ордера на покупку BuyLimit3

{

int Ticket23=OrderSend(Symbol(), OP_BUYLIMIT, Lot23, Price23, spread, StopLoss23, TakeProfit23, NULL, 115201615, Expiration, clrOrange);

if(Ticket23>0)

{

Ticket223=Ticket23;

printf("Выставлен ордер отложенный ордер на покупку BuyLimit №"+(string)Ticket23);

PlaySound("Ok.wav");

}

}

if(Ticket331==0 && WorkMinus==true && WorkSL==true) //условия выставления отложенного ордера на продажу SellLimit1

{

int Ticket31=OrderSend(Symbol(), OP_SELLLIMIT, Lot31, Price31, spread, StopLoss31, TakeProfit31, NULL, 115201615, Expiration, clrDeepSkyBlue);

if(Ticket31>0)

{

Ticket331=Ticket31;

printf("Выставлен отложенный ордер на продажу SellLimit №"+(string)Ticket31);

PlaySound("Ok.wav");

}

}

if(Ticket332==0 && WorkMinus==true && WorkSL==true) //условия выставления отложенного ордера на продажу SellLimit2

{

int Ticket32=OrderSend(Symbol(), OP_SELLLIMIT, Lot32, Price32, spread, StopLoss32, TakeProfit32, NULL, 115201615, Expiration, clrDeepSkyBlue);

if(Ticket32>0)

{

Ticket332=Ticket32;

printf("Выставлен отложенный ордер на продажу SellLimit №"+(string)Ticket32);

PlaySound("Ok.wav");

}

}

if(Ticket333==0 && WorkMinus==true && WorkSL==true) //условия выставления отложенного ордера на продажу SellLimit3

{

int Ticket33=OrderSend(Symbol(), OP_SELLLIMIT, Lot33, Price33, spread, StopLoss33, TakeProfit33, NULL, 115201615, Expiration, clrDeepSkyBlue);

if(Ticket33>0)

{

Ticket333=Ticket33;

printf("Выставлен отложенный ордер на продажу SellLimit №"+(string)Ticket33);

PlaySound("Ok.wav");

}

}

if(Ticket44==0 && WorkPlus==true && WorkStop==true) //условия выставления отложенного ордера на покупку BuyStop

{

int Ticket4=OrderSend(Symbol(), OP_BUYSTOP, Lot, Price4, spread, StopLoss4, TakeProfit4, NULL, 115201615, Expiration, clrHotPink);

if(Ticket4>0)

{

Ticket44=Ticket4;

printf("Выставлен отложенный ордер на покупку BuyStop №"+(string)Ticket4);

PlaySound("Ok.wav");

}

}

if(Ticket55==0 && WorkMinus==true && WorkStop==true) //условия выставления отложенного ордера на продажу SellStop

{

int Ticket5=OrderSend(Symbol(), OP_SELLSTOP, Lot, Price5, spread, StopLoss5, TakeProfit5, NULL, 115201615, Expiration, clrRoyalBlue);

if(Ticket5>0)

{

Ticket55=Ticket5;

printf("Выставлен отложенный ордер на продажу SellStop №"+(string)Ticket5);

PlaySound("Ok.wav");

}

}

}

}

Функция трейлинг-стопа ордеров

void Trall()

{

for(int i=1; i<=OrdersTotal(); i++)

{

if (OrderSelect(i-1,SELECT_BY_POS)==true)

{

int Tip =OrderType(); //тип выбранного ордера

int Ticket =OrderTicket(); //тикет выбранного ордера

double Price =OrderOpenPrice(); //цена открытия выбранного ордера

double StopLoss =OrderStopLoss(); //стоп-лосс выбранного ордера

double TakeProfit=OrderTakeProfit(); //тейк-профит выбранного ордера

while(true)

{

bool Modify=false;

switch(Tip)

{

case 0 :

if (NormalizeDouble(Bid,Digits)>NormalizeDouble(Price+TrallStop*Point,Digits))

{

TakeProfit=NULL;

StopLoss=NormalizeDouble(Price+100*Point,Digits);

Modify=true;

}

break;

case 1 :

if (NormalizeDouble(Ask,Digits)<NormalizeDouble(Price-TrallStop*Point,Digits))

{

TakeProfit=NULL;

StopLoss=NormalizeDouble(Price-100*Point,Digits);

Modify=true;

}

}

if (Modify==false)

break;

bool Ans=OrderModify(Ticket,Price,StopLoss,TakeProfit,clrGreen);

printf("Ордер №"+(string)Ticket+" модифицирован!");

PlaySound("Ok.wav");

break;

}

}

}

}

Функция обработки ошибок

bool Errors()

{

int Error=GetLastError();

switch(Error)

{

case 0 :

return(true);

case 2 :

printf("Общая ошибка "+(string)Error+"!");

return(false);

case 3 :

printf("Ошибка "+(string)Error+"! Неправильные параметры!");

return(false);

case 4 :

printf("Ошибка "+(string)Error+"! Торговый сервер занят!");

Sleep(600);

RefreshRates();

return(true);

case 5 :

printf("Ошибка "+(string)Error+"! Старая версия клиентского терминала!");

return(false);

case 6 :

printf("Ошибка "+(string)Error+"! Нет связи с торговым сервером!");

return(false);

case 7 :

printf("Ошибка "+(string)Error+"! Недостаточно прав!");

return(false);

case 8 :

printf("Ошибка "+(string)Error+"! Слишком частые запросы!");

return(false);

case 9 :

printf("Ошибка "+(string)Error+"! Недопустимая операция нарушающая функционирование сервера!");

return(false);

case 64:

printf("Ошибка "+(string)Error+"! Счет заблокирован!");

return(false);

case 65 :

printf("Ошибка "+(string)Error+"! Неправильный номер счета!");

return(false);

case 128 :

printf("Ошибка "+(string)Error+"! Истек срок ожидания совершения сделки!");

return(false);

case 129:

printf("Ошибка "+(string)Error+"! Неправильная цена!");

return(false);

case 130 :

printf("Ошибка "+(string)Error+"! Неправильные стопы!");

return(false);

case 131 :

printf("Ошибка "+(string)Error+"! Неправильный объем!");

return(false);

case 132 :

printf("Ошибка "+(string)Error+"! Рынок закрыт!");

return(false);

case 133:

printf("Ошибка "+(string)Error+"! Торговля запрещена!");

return(false);

case 134 :

printf("Ошибка "+(string)Error+"! Недостаточно денег для совершения операции!");

return(false);

case 135:

printf("Ошибка "+(string)Error+"! Цена изменилась!");

RefreshRates();

return(true);

case 136:

printf("Ошибка "+(string)Error+"! Нет цен, ждем новый тик!");

while(RefreshRates()==false)

Sleep(10);

return(true);

case 137 :

printf("Ошибка "+(string)Error+"! Брокер занят!");

return(true);

case 138 :

printf("Ошибка "+(string)Error+"! Новые цены!");

while(RefreshRates()==false)

Sleep(10);

return(true);

case 139 :

printf("Ошибка "+(string)Error+"! Ордер заблокирован и уже обрабатывается!");

return(true);

case 140 :

printf("Ошибка "+(string)Error+"! Разрешена только покупка!");

return(true);

case 141 :

printf("Ошибка "+(string)Error+"! Слишком много запросов!");

return(true);

case 145 :

printf("Ошибка "+(string)Error+"! Модификация запрещена, так как ордер слишком близко к рынку!");

return(true);

case 146:

printf("Ошибка "+(string)Error+"! Подсистема торговли занята!");

Sleep(500);

RefreshRates();

return(true);

case 147 :

printf("Ошибка "+(string)Error+"! Использование даты истечения ордера запрещено брокером!");

return(false);

case 148 :

printf("Ошибка "+(string)Error+"! Количество ордеров достигло предела, разрешенного брокером!");

return(false);

case 4017 :

printf("Ошибка "+(string)Error+"! Вызовы DLL не разрешены!");

return(false);

case 4018 :

printf("Ошибка "+(string)Error+"! Невозможно загрузить библиотеку!");

return(false);

case 4019 :

printf("Ошибка "+(string)Error+"! Невозможно вызвать функцию!");

return(false);

case 4020 :

printf("Ошибка "+(string)Error+"! Вызовы внешних библиотечных функций не разрешены!");

return(false);

case 4022 :

printf("Ошибка "+(string)Error+"! Система занята!");

Sleep(500);

RefreshRates();

return(true);

case 4055 :

printf("Ошибка "+(string)Error+" пользовательского индикатора!");

return(false);

case 4059 :

printf("Ошибка "+(string)Error+"! Функция не разрешена в тестовом режиме!");

return(false);

case 4066 :

printf("Ошибка "+(string)Error+"! Запрошенные исторические данные в состоянии обновления!");

return(true);

case 4067 :

printf("Ошибка "+(string)Error+" при выполнении торговой операции!");

return(false);

case 4107 :

printf("Ошибка "+(string)Error+"! Неправильный параметр цены для торговой функции!");

return(false);

case 4109 :

printf("Ошибка "+(string)Error+"! Торговля не разрешена!");

return(false);

case 4110 :

printf("Ошибка "+(string)Error+"! Длинные позиции не разрешены!");

return(false);

case 4111 :

printf("Ошибка "+(string)Error+"! Короткие позиции не разрешены!");

return(false);

default:

printf("Неизвестная ошибка "+(string)Error+"!");

return(false);

}

ResetLastError();

return(Error);

}

Заключение

//Заключение должно иметь объем до 5 страниц и содержать:

-выводы (включая краткую формулировку результата выполненной работы и ее научное, социальное и экономическое значение);

-рекомендации по конкретному применению, оценку трудоемкости и эффективности внедрения;

Заключение

Приложение

Литература

  • «Forex – трейдинг, практические аспекты торговли на мировых финансовых рынках» - Д.В. Раннев, Б.Н. Шилов;

  • «MetaTrader пособие для кофейников» - Б.Н. Шилов, Д.В. Раннев;

  • «Forex от первого лица» - Г.А. Петров, А.В. Ведихин, Б.Н. Шилов;

  • «Малая энциклопедия трейдера» - Э. Найман;

  • «Долгосрочные секреты краткосрочной торговли» - Л. Вильямс;

  • «Как играть и выигрывать на бирже» - А. Элдер;

  • «Биржевые секреты: технический анализ» - Д. Швагер;

Интернет-источники

  • http://book.mql4.com/ru/overview — учебник по MQL4;

  • http://docs.mql4.com/ru — справочник MQL4;

  • https://www.mql5.com/ru/docs — справочник MQL5;

  • https://www.mql5.com/ru/code — библиотека исходных кодов на MQL4 и MQL5;

  • https://www.mql5.com/ru/articles — статьи по программированию на языках MQL4 и MQL5;

  • http://www.alpari.ru — сайт компании ООО «Альпари»;

  • http://www.alpari.ru/ru/platforms/#tab=pc&slide=metatrader4 — ссылка на скачивание терминала MetaTrader4;

1Lehman Brothers – американский инвестиционный банк, ранее один из ведущих в мире финансовых конгломератов, обанкротился в 2008 году.

2Goldman Sachs – один из крупнейших в мире коммерческих банков, (до 2008 года — инвестиционный банк).

3FOREX (Форекс) — это рынок межбанковского обмена валюты по свободным ценам.

4MetaTrader4 – это торговая платформа, предназначенная для торговли на рынке Форекс, анализа финансовых рынков и использования советников.