//----------------------------------------------------------------1--
extern double StopLoss =240; //Стоп и профит
extern double TakeProfit=40;
double Lots1 =0.01;
double Lots2 =0.02;
double Lots3 =0.07;
double Lots4 =0.14;
bool Work=true;
string Symb;
bool Opn_B=false;
bool Opn_S=false;
bool Vhod=false;
bool LTS=false;
bool PlanB=false;
bool L2Stop=true;
bool L3Stop=true;
bool L4Stop=true;
bool L5Stop=true;
bool L6Stop=true;
double Chas;
double Pribl;
double Lots=100;
double maxBalance=0.1;
double minBalanse=0.1;
//--------------------------------------------------------------- 2 --
int start()
{
int
Total, // Количество ордеров в окне
Ticket; // Номер ордера
double
SL, // SL выбранного ордера
TP; // TP выбранного ордера
if (minBalanse==0.1){minBalanse=AccountBalance();}
if (AccountBalance()>(minBalanse*2) && L2Stop==true){Lots1=0.2;Lots2=0.4;Lots3=1.4;Lots4=2.8;L2Stop=false;}
if (AccountBalance()>(minBalanse*3) && L3Stop==true){Lots1=0.3;Lots2=0.6;Lots3=2.1;Lots4=4.2;L3Stop=false;}
if (AccountBalance()>(minBalanse*4) && L4Stop==true){Lots1=0.4;Lots2=0.8;Lots3=2.8;Lots4=5.6;L4Stop=false;}
if (AccountBalance()>(minBalanse*5) && L5Stop==true){Lots1=0.5;Lots2=1 ;Lots3=3.5;Lots4=7 ;L5Stop=false;}
if (AccountBalance()>(minBalanse*6) && L6Stop==true){Lots1=0.6;Lots2=1.2;Lots3=4.2;Lots4=8.4;L6Stop=false;}
double Lot1=Lots1;
double Lot2=Lots3;
//--------------------------------------------------------------- 3 --
if(Bars < 24) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//--------------------------------------------------------------- 4 --
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеров
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм
if (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
Total++; // Счётчик рыночн. орд
if (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
}
}
//--------------------------------------------------------------- 5 --
if(Symbol()!="EURUSD"){Comment("Рекомендуется использовать эксперта не на валют.паре ",Symbol(),",а на EURUSD.Для ",Symbol()," нужно подбирать стоп и профит.");}
for(int ii=1; ii<=OrdersHistoryTotal(); ii++) // Цикл перебора ордер
{
if (OrderSelect(ii-1,SELECT_BY_POS,MODE_HISTORY)==true)// Если есть следующий
{
if (OrderSymbol()!=Symb)continue; // Анализ ордеров
Pribl=OrderProfit();}}
double Balance=AccountBalance();
if (Lots==100){Lots=Lot1;}
if (Total!=0){LTS=true;}
if (Total==0 && Balance>maxBalance){PlanB=false;Lot1=Lots1;Lot2=Lots3;maxBalance=Balance;}
if (Total==0 && PlanB==true){Lot1=Lots2;Lot2=Lots4;}
if (LTS==true && Total==0 && Pribl<0 && Lots==Lot2){PlanB=true;LTS=false;}
if (LTS==true && Total==0 && Pribl<0 && Lots==Lot1){Lots=Lot2;LTS=false;}
if (LTS==true && Total==0 && Pribl>0){Lots=Lot1;LTS=false;}
if (LTS==true && Total==0 && Pribl<0){Lots=Lot2;LTS=false;}
if (iClose("EURUSD",PERIOD_H4,1)>iOpen("EURUSD",PERIOD_H4,1)){Opn_S=false;Opn_B=true;}
if (iClose("EURUSD",PERIOD_H4,1)<iOpen("EURUSD",PERIOD_H4,1)){Opn_S=true;Opn_B=false;}
if (Total!=0){Vhod=false;}
if (Chas!=iTime("EURUSD",PERIOD_H4,0)){Chas=iTime("EURUSD",PERIOD_H4,0);Vhod=true;}
//---------------------------------------------------------------- 6 --
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true && Minute()<=15
&& Vhod==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL= Bid- StopLoss *Point; // Вычисление SL откр.
TP= Bid+ TakeProfit *Point; // Вычисление TP откр.
Comment("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,3,SL,TP,"Buy",173777,0,Blue);
if (Ticket>0) // Получилось
{
Comment("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Total==0 && Opn_S==true && Minute()<=15
&& Vhod==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данных
SL= Ask+ StopLoss *Point; // Вычисление SL откр.
TP= Ask- TakeProfit *Point; // Вычисление TP откр.
Comment("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,3,SL,TP,"Sell",174777,0,Red);
if (Ticket>0) // Получилось
{
Comment("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 7 --
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки
case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 2: Alert("Общая ошибка.");
return(0); // Выход из функции
case 5: Alert("Старая версия терминала.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 64: Alert("Счет заблокирован.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 133:Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
default: Alert("Возникла ошибка ",Error); // Другие варианты
return(0); // Выход из функции
}
}
//------------------------------------------------------------------