советник разрабатывался в ветке
ruforum.mt5.com/threads/22217-idealnaya-sistema-parnogo-treydinga.-chast-1
цель задания добавить третью пару с целью уменьшения спреда (при работе по парам GBPUSD/EURGBP на реверсе открывать внесенную в параметры сова третью пару EURUSD) направление для EURUSD — SELL если GBPUSD верху, а EURGBP внизу и BUY наоборот)
#property copyright "Copyright © 2013, Хлыстов В.Ю."
#property link "h.maiden@mail.ru"
//+------------------------------------------------------------------+
extern bool Start = true;// вкл. или выкл. старта советника
extern bool Close_All = false;// вкл. или выкл. функции, закрытия всех позиций советника
//+------------------------------------------------------------------+
extern int Magic = 1; // магический номер советника
extern double Lots = 0.1; // размер лота одной позиции
extern int Delta_Open = 5; // размер дельты, приемлимый для открытия 2-х хедж ордеров, если 0, то не учитывается
extern int Delta_Close = -10; // размер дельты, для закрытия 2-х хедж ордеров
extern double Summ_TP = 0; // закрытие 2-х хедж ордеров, по суммарному ТП (если > 0)
extern int Time_Frame = 15; // Таймфрейм, если 0, то текущий, если нет, то фиксированный
//+------------------------------------------------------------------+
extern int ControlBars = 5; // колличество контроллируемых свечей, в анализе индикатора
extern int Ind_Shift = 0; // смещение в барах, для параметров индикатора
//+------------------------------------------------------------------+
extern string l_1 = "1) ------------------------------------------------------------";
extern string simbol_1 = "GBPUSD";
extern bool rev_1 = false;
extern string simbol_2 = "EURGBP";
extern bool rev_2 = true;
extern int Level_12 = 0; // уровень для открытия 2-х хедж ордеров, в обратном направлении
extern string l_2 = "2) ------------------------------------------------------------";
extern string simbol_3 = "EURUSD";
extern bool rev_3 = false;
extern string simbol_4 = "EURUSD";
extern bool rev_4 = false;
extern int Level_34 = 0; // уровень для открытия 2-х хедж ордеров, в обратном направлении
extern string l_3 = "3) ------------------------------------------------------------";
extern string simbol_5 = "";
extern bool rev_5 = false;
extern string simbol_6 = "";
extern bool rev_6 = false;
extern int Level_56 = 0; // уровень для открытия 2-х хедж ордеров, в обратном направлении
extern string l_4 = "4) ------------------------------------------------------------";
extern string simbol_7 = "";
extern bool rev_7 = true;
extern string simbol_8 = "";
extern bool rev_8 = false;
extern int Level_78 = 0; // уровень для открытия 2-х хедж ордеров, в обратном направлении
extern string l_5 = "5) ------------------------------------------------------------";
extern string simbol_9 = "";
extern bool rev_9 = false;
extern string simbol_10 = "";
extern bool rev_10 = false;
extern int Level_910 = 0; // уровень для открытия 2-х хедж ордеров, в обратном направлении
extern string l_6 = "6) ------------------------------------------------------------";
extern string simbol_11 = "";
extern bool rev_11 = false;
extern string simbol_12 = "";
extern bool rev_12 = false;
extern int Level_1112 = 0; // уровень для открытия 2-х хедж ордеров, в обратном направлении
extern string l_7 = "---------------------------------------------------------------------";
//+------------------------------------------------------------------+
string Info[100]; //информационный массив
string Symbols[13]; //все пары валют
bool rev[13]; //все реверсы
bool Signal[13,13]; //все сигналы
double Ind[13]; //все значения индикатора
color Color_sim[8]; //цвета
int Level[13]; //уровни
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//-------------------------------------------------------------------+
color Color = Yellow;
string Text = StringConcatenate(" Магик = ",DoubleToStr(Magic,0)," ТФ = ",DoubleToStr(Time_Frame, 0)," Лот = ",DoubleToStr(Lots, 2)," Кол. баров = ",DoubleToStr(ControlBars, 0));//
string Text_1 =StringConcatenate(" Magic_Hedge ","v.0" );//
ObjectCreate("Info", OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet("Info", OBJPROP_CORNER, 0); // Привязка угол
ObjectSet("Info", OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet("Info", OBJPROP_YDISTANCE, 35);// Координата Y
ObjectSetText("Info",Text,12,"Arial",Color);// Изменение свойств объекта
Color = Magenta;
ObjectCreate("Info_1", OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet("Info_1", OBJPROP_CORNER, 0); // Привязка угол
ObjectSet("Info_1", OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet("Info_1", OBJPROP_YDISTANCE, 10);// Координата Y
ObjectSetText("Info_1",Text_1,14,"Arial",Color);// Изменение свойств объекта
//-------------------------------------------------------------------+
Color = Red;
Text = StringConcatenate(" Дельта откр. = ",DoubleToStr(Delta_Open,0)," Дельта закр. = ",DoubleToStr(Delta_Close, 0));//
Text_1 = StringConcatenate("Смещение = ",DoubleToStr(Ind_Shift, 0));//
ObjectCreate("Info_2", OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet("Info_2", OBJPROP_CORNER, 0); // Привязка угол
ObjectSet("Info_2", OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet("Info_2", OBJPROP_YDISTANCE, 55);// Координата Y
ObjectSetText("Info_2",Text,12,"Arial",Color);// Изменение свойств объекта
ObjectCreate("Info_3", OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet("Info_3", OBJPROP_CORNER, 0); // Привязка угол
ObjectSet("Info_3", OBJPROP_XDISTANCE, 300);// Координата Х
ObjectSet("Info_3", OBJPROP_YDISTANCE, 55);// Координата Y
ObjectSetText("Info_3",Text_1,12,"Arial",Color);// Изменение свойств объекта
//-------------------------------------------------------------------+
Color = Gray;
Text = "-спред-----сверху-///-снизу-----профит-----дельта-";
ObjectCreate("Info_5", OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet("Info_5", OBJPROP_CORNER, 1); // Привязка угол
ObjectSet("Info_5", OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet("Info_5", OBJPROP_YDISTANCE, 100-15);// Координата Y
ObjectSetText("Info_5",Text,12,"Arial",Color);// Изменение свойств объекта
//-------------------------------------------------------------------+
Symbols[1]=simbol_1; rev[1]=rev_1; Level[1]=Level_12;
Symbols[2]=simbol_2; rev[2]=rev_2; Level[2]=Level_12;
Symbols[3]=simbol_3; rev[3]=rev_3; Level[3]=Level_34;
Symbols[4]=simbol_4; rev[4]=rev_4; Level[4]=Level_34;
Symbols[5]=simbol_5; rev[5]=rev_5; Level[5]=Level_56;
Symbols[6]=simbol_6; rev[6]=rev_6; Level[6]=Level_56;
Symbols[7]=simbol_7; rev[7]=rev_7; Level[7]=Level_78;
Symbols[8]=simbol_8; rev[8]=rev_8; Level[8]=Level_78;
Symbols[9]=simbol_9; rev[9]=rev_9; Level[9]=Level_910;
Symbols[10]=simbol_10; rev[10]=rev_10;Level[10]=Level_910;
Symbols[11]=simbol_11; rev[11]=rev_11;Level[11]=Level_1112;
Symbols[12]=simbol_12; rev[12]=rev_12;Level[12]=Level_1112;
for(int i=1;i<14;i++)
{
Ind[i]=0;
}
//+------------------------------------------------------------------+
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
if(IsTradeAllowed()==false || Start==false) return; // если поток занят или Start отключен, советник не торгует
if(Close_All){Close_All_Order();return;} // если Close_All включен, закрываем все ордера советника
//----Нахождение всех значений индикатора
//+------------------------------------------------------------------+
if(Symbols[1]!="")
Ind[1]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[3],rev[3],Symbols[4],rev[4],ControlBars,"",0,Ind_Shift);
if(Symbols[2]!="")
Ind[2]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[3],rev[3],Symbols[4],rev[4],ControlBars,"",1,Ind_Shift);
if(Symbols[3]!="")
Ind[3]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[3],rev[3],Symbols[4],rev[4],ControlBars,"",0,Ind_Shift);
if(Symbols[4]!="")
Ind[4]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[3],rev[3],Symbols[4],rev[4],ControlBars,"",1,Ind_Shift);
if(Symbols[5]!="")
Ind[5]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[5],rev[5],Symbols[6],rev[6],ControlBars,"",0,Ind_Shift);
if(Symbols[6]!="")
Ind[6]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[5],rev[5],Symbols[6],rev[6],ControlBars,"",1,Ind_Shift);
if(Symbols[7]!="")
Ind[7]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[7],rev[7],Symbols[8],rev[8],ControlBars,"",0,Ind_Shift);
if(Symbols[8]!="")
Ind[8]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[7],rev[7],Symbols[8],rev[8],ControlBars,"",1,Ind_Shift);
if(Symbols[9]!="")
Ind[9]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[9],rev[9],Symbols[10],rev[10],ControlBars,"",0,Ind_Shift);
if(Symbols[10]!="")
Ind[10]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[9],rev[9],Symbols[10],rev[10],ControlBars,"",1,Ind_Shift);
if(Symbols[11]!="")
Ind[11]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[11],rev[11],Symbols[12],rev[12],ControlBars,"",0,Ind_Shift);
if(Symbols[12]!="")
Ind[12]=iCustom(NULL,Time_Frame,"Delta_excluzive_2",Symbols[11],rev[11],Symbols[12],rev[12],ControlBars,"",1,Ind_Shift);
//+------------------------------------------------------------------+
//----Обнуление массива сигналов
//+------------------------------------------------------------------+
for(int i=1;i<13;i++)
{
for(int j=1;j<13;j++)
{
Signal[i,j]=false;
}
}
//+------------------------------------------------------------------+
//----Определение текущих сигналов
//+------------------------------------------------------------------+
for(int m=0;m<6;m++)
{
int a=m*2+1;int b=a+1;
if(Symbols[a]!="" || Symbols[b]!="")
{
if(Ind[a]>Level[a] && Ind[b]<-Level[b]) // если 1-ое знач. индикатора больше уровня, а 2-ое меньше
{
Signal[a,b]=true; // то сигнал двух пар есть
if(Open_true(a,b)==false && (Ind[a]-Ind[b])>Delta_Open && OrdersTotal()<98)// проверяем, есть ли открытые позиции, по этому сигналу
{
Open_Orders(a,b); // открываем 2 хедж ордера, с заданным Коментарием
}
}
if(Ind[b]>Level[b] && Ind[a]<-Level[a]) // если 1-ое знач. индикатора больше уровня, а 2-ое меньше
{
Signal[b,a]=true; // то сигнал двух пар есть
if(Open_true(b,a)==false && (Ind[b]-Ind[a])>Delta_Open && OrdersTotal()<98)// проверяем, есть ли открытые позиции, по этому сигналу
{
Open_Orders(b,a); // открываем 2 хедж ордера, с заданным Коментарием
}
}
}
}
//+------------------------------------------------------------------+
//----Определение текущих открытых ордеров
//+------------------------------------------------------------------+
Object_Open_Delete(); // вызов функции, удаления данных таблици
int inf = 0;
for(int c=1;c<13;c++)
{
for(int d=1;d<13;d++) // то находим 2-ое знач. индикатора меньше (-)уровня
{
if(c!=d) // если 1-ое знач. неравно 2-му
{
if(Open_true(c,d)==true) // если открыты 2-х хедж ордера, с общим Комментарием
{
inf = inf+1;
string Spread_Ord = StringConcatenate((MarketInfo(Symbols[c],MODE_SPREAD)+MarketInfo(Symbols[d],MODE_SPREAD))," ");
string Profit_Ord = StringConcatenate(Symbols[c],"_",Symbols[d]," ",Profit_Orders(c,d)," $ ");
Info[inf]=StringConcatenate(Spread_Ord,Profit_Ord," ",DoubleToStr(Ind[c]-Ind[d],0)," ");
if(Summ_TP>0) // если суммарный ТП больше 0
{
if(Profit_Orders(c,d)>Summ_TP || (Ind[c]-Ind[d])<Delta_Close)// или линии индикатора пересеклись
Close_Orders(c,d); // если суммарный ТП 2-х хедж ордеров, больше заданного, то закрываем эти ордера
}
if((Ind[c]-Ind[d])<Delta_Close) // если линии индикатора пересеклись
Close_Orders(c,d); // то закрываем эти ордера
}
}
}
}
Object_Open_Orders(); // вызов таблицы данных, открытых позиций
//+------------------------------------------------------------------+
return(0);
}
//+------------------------------------------------------------------+
//| Функция подсчета профита всех ордеров |
//+------------------------------------------------------------------+
/*
double Profit_All()
{
double Summ_1=0;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
//+------------------------------------------------------------------+
if(OrderMagicNumber()==Magic)
{
Summ_1=Summ_1+OrderProfit();
}
Print("Функция закрытия всех ордеров");
}
return(Summ_1);
//+------------------------------------------------------------------+
}
*/
//+------------------------------------------------------------------+
//| Функция проверки окрытых позиций |
//+------------------------------------------------------------------+
bool Open_true(int a, int b)
{
int ord = 0;
bool open = false;
string Comments = StringConcatenate(Magic,DoubleToStr(a,0),DoubleToStr(b,0));
//----
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Comments && OrderMagicNumber()==Magic)
{
ord = ord+1; // подсчет открытых ордеров с выбранным Комментарием
}
if(ord > 1){open = true; break;}// если их больше 1-ого, то функция Верна
}
return(open);
}
//+------------------------------------------------------------------+
//| Функция открывает 2 хедж позиции |
//+------------------------------------------------------------------+
void Open_Orders(int a, int b)
{
int ord = 0;
int res;
string Comments = StringConcatenate(Magic,DoubleToStr(a,0),DoubleToStr(b,0));
for(int o=0;o<20;o++)
{
//+------------------------------------------------------------------+
if(ord==0)
{
if(rev[a]) // если стоит реверс, то 1-ую покупаем
{
res=OrderSend(Symbols[a],OP_BUY,Lots,MarketInfo(Symbols[a],MODE_ASK),10,0,0,Comments,Magic,0,CLR_NONE);
if(res>0){ord = ord+1;}
}
else // если нет, то 1-ую прадаем
{
res=OrderSend(Symbols[a],OP_SELL,Lots,MarketInfo(Symbols[a],MODE_BID),10,0,0,Comments,Magic,0,CLR_NONE);
if(res>0){ord = ord+1;}
}
}
//+------------------------------------------------------------------+
if(ord==1)
{
if(rev[b]) // если стоит реверс, то 2-ую прадаем
{
res=OrderSend(Symbols[b],OP_SELL,Lots,MarketInfo(Symbols[b],MODE_BID),10,0,0,Comments,Magic,0,CLR_NONE);
if(res>0){ord = ord+1;}
}
else // если нет, то 2-ую покупаем
{
res=OrderSend(Symbols[b],OP_BUY,Lots,MarketInfo(Symbols[b],MODE_ASK),10,0,0,Comments,Magic,0,CLR_NONE);
if(res>0){ord = ord+1;}
}
}
//+------------------------------------------------------------------+
// Print("Функция открывает 2 хедж позиции");
if(ord==2) break;
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Функция подсчета суммапного профита 2-х хедж ордеров |
//+------------------------------------------------------------------+
double Profit_Orders(int a ,int b)
{
double Profit=0;
string Comments = StringConcatenate(Magic,DoubleToStr(a,0),DoubleToStr(b,0));
//+------------------------------------------------------------------+
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Comments && OrderMagicNumber()==Magic)
{
Profit=Profit+OrderProfit();
}
}
//----
// Print("Функция подсчета суммапного профита 2-х хедж ордеров");
return(Profit);
}
//+------------------------------------------------------------------+
//| Функция закрывает 2 хедж позиции |
//+------------------------------------------------------------------+
void Close_Orders(int a, int b)
{
string Comments = StringConcatenate(Magic,DoubleToStr(a,0),DoubleToStr(b,0));
bool Cl,Op = true;
//+------------------------------------------------------------------+
for(int o=0;o<20;o++)
{
//----
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Comments && OrderMagicNumber()==Magic)// если Магик и Коммент. совпадает
{
if(OrderType()==OP_BUY)
{
Cl = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),10,CLR_NONE); // то, закрываем ордер BUY
if(!Cl){Print("error BUY(",GetLastError(),")"); break;}
}
if(OrderType()==OP_SELL)
{
Cl = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),10,CLR_NONE); // то, закрываем ордер SELL
if(!Cl){Print("error SELL(",GetLastError(),")"); break;}
}
}
}
//----
for(int j=0;j<OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Comments && OrderMagicNumber()==Magic) // если Магик и Коммент. совпадает
{Op = true; break;}
else Op = false;
}
// Print("Функция закрывает 2 хедж позиции ",o);
if(Op==false) break;
}
//+------------------------------------------------------------------+
return(0);
}
//+------------------------------------------------------------------+
//| Функция подсчета ордеров с общим Магиком |
//+------------------------------------------------------------------+
int Total_Magic_Order()
{
int total=0;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
//+------------------------------------------------------------------+
if(OrderMagicNumber()==Magic)
{
total=total+1;
}
}
return(total);
//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
//| Функция закрытия всех ордеров, с общим Магиком |
//+------------------------------------------------------------------+
void Close_All_Order()
{
bool Cl;
for(int o=0;o<20;o++)
{
//----
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
//+------------------------------------------------------------------+
if(OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
Cl = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),10,CLR_NONE); // то, закрываем ордер BUY
if(!Cl){Print("error BUY(",GetLastError(),")"); break;}
}
if(OrderType()==OP_SELL)
{
Cl = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),10,CLR_NONE); // то, закрываем ордер SELL
if(!Cl){Print("error SELL(",GetLastError(),")"); break;}
}
}
}
// Print("Функция закрытия всех ордеров, с общим Магиком");
if(Total_Magic_Order()==0) break;
}
return(0);
//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
//| Функция таблици данных открытых позиций |
//+------------------------------------------------------------------+
int Object_Open_Orders()
{
//--------------------------------------------------------------- 2 --
for(int i=1;i<=100;i++)
{
if(Info[i]=="")break;
color Color = Lime;
string Text = Info[i];
string Inform = StringConcatenate("Inform_",DoubleToStr(i,0));
ObjectCreate(Inform, OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet(Inform, OBJPROP_CORNER, 1); // Привязка угол
ObjectSet(Inform, OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet(Inform, OBJPROP_YDISTANCE, 100+15*i);// Координата Y
ObjectSetText(Inform,Text,10,"Arial",Color);// Изменение свойств объекта
}
//--------------------------------------------------------------- 3 --
return(0);
}
//+------------------------------------------------------------------+
//| Функция удаления таблици данных |
//+------------------------------------------------------------------+
int Object_Open_Delete()
{
//--------------------------------------------------------------- 2 --
for(int i=1;i<=100;i++)
{
if(Info[i]=="")break;
string Inform = StringConcatenate("Inform_",DoubleToStr(i,0));
ObjectDelete(Inform); // Удаление объекта
Info[i]="";
}
//--------------------------------------------------------------- 3 --
return(0);
}
//+------------------------------------------------------------------+
//| Функция deinit |
//+------------------------------------------------------------------+
int deinit() // Спец. функция deinit
{
Object_Open_Delete();
ObjectDelete("Info"); // Удаление объекта
ObjectDelete("Info_1"); // Удаление объекта
ObjectDelete("Info_2"); // Удаление объекта
ObjectDelete("Info_3"); // Удаление объекта
ObjectDelete("Info_5"); // Удаление объекта
return; // Выход из deinit()
}
//--------------------------------------------------------------- 8 --
Комментарии (0)
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий