//+------------------------------------------------------------------+
//| Топор.mq4 |
//| |
//| |
//| |
//| |
//+------------------------------------------------------------------+
//--------------------------------------------------------------- --
extern string x1 ="Настройки управления капиталом";
extern double StopLoss =230; // SL для открываемого ордера
extern double TakeProfit =280; // ТР для открываемого ордера
extern double Lots =0.1; // Жестко заданное колич. лотов
extern double умжить_на=2; //Не может быть равным нулю
extern int MagicNumber =123;
extern double PipsAway_1 =250;// Открываемся на растаянии от индикатора в пунктах
//extern double PipsAway_2 =170;// Открываемся на растаянии от индикатора в пунктах
extern string block = " основные параметры для ima";
extern int Period_MA_1=17; // Период МА
extern int MODE =3; // SMA-0 EMA-1 SMMA-2 LWMA-3
extern int PRICE =0; // CLOSE-0 OPEN-1 HIGH-2 LOW-3 MEDIAN-4 TYPICAL-5 WEIGHTED-6
extern string LatOrderStoppedOut = " --Время задержки--";
extern bool UseDelay = true; // Ели "true" то работаем с задержкой
extern int MinutesToDelay = 30;//Время задержки(Минут) после закрытия с убытком
extern string AddComment = "";
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента
bool StoppedOut=false;
datetime StopTime;
double dl;
double a;
int X=0;
double S = 0.0000;
//--------------------------------------------------------------- --
int init()
{
a=Lots;
return(0);
}
int start()
{
int
Total; // Количество ордеров в окне
double
MA_1_t, // Значен. МА_1 текущее
Lot_1;
bool
Ans =false, // Ответ сервера после закрытия
Opn_B=false, // Критерий для открытия Buy
Opn_S=false; // Критерий для открытия Sell
//--------------------------------------------------------------- --
// Предварит.обработка
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
S=Open[0];
Sleep(1000);
if(OrdersTotal() == 0 && X==1)
{
if (Close[0]>dl){Lots=a;}
X=0;
}
if(OrdersTotal() == 0 && X==2)
{
if (Close[0]
1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
Total++; // Счётчик рыночн. орд
if (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
int Ticket=OrderTicket(); // Номер выбранн. орд.
int Tip =OrderType(); // Тип выбранного орд.(B=0,S=1)
double Price =OrderOpenPrice(); // Цена выбранн. орд.
double SL =OrderStopLoss(); // SL выбранного орд.
double TP =OrderTakeProfit(); // TP выбранного орд.
//double Lot =OrderLots(); // Колич. лотов в выбран.ордере
// int OrNumber=OrdersHistoryTotal(); //количество закрытых позиций и удаленных ордеров
}
}
if (UseDelay == true)// Ели "true" то работаем с задержкой
{
StoppedOut = LastTradeStoppedOut();
if (CurTime() < StopTime)
{
Comment("Никакой торговли До:"
+ TimeToStr(StopTime,TIME_DATE|TIME_MINUTES));
return(0);
}
}
//--------------------------------------------------------------- --
// Торговые критерии
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE,PRICE,1); // МА_1
//--------------------------------------------------------------- --
// Вычисление торговых критериев
if (OrdersTotal()==0)
{
if (Ask < MA_1_t-(PipsAway_1*Point))
Opn_B=true; // Открытие Buy
if (Bid > MA_1_t+(PipsAway_1*Point))
Opn_S=true; // Открытие Sell
}
//--------------------------------------------------------------- --
// Открытие ордеров
while(true) // Цикл открытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Buy ");
dl=Close[0];
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,2,SL,TP,"",MagicNumber,0,Blue);//Открытие Buy
Lots=Lots*умжить_на;
X=1;
if (Ticket > 0) // Получилось :)
{
//Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Total==0 && Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данных
SL=Ask + New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Ask - New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Sell ");
dl=Close[0];
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,2,SL,TP,"",MagicNumber,0,Red);//Открытие Sel
Lots=Lots*умжить_на;
X=2;
if (Ticket > 0) // Получилось :)
{
// Alert ("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- --
return; // Выход из start()
}
//----------------------------------------------------------------
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); // Выход из функции
}
}
//-------------------------------------------------------------- --
int New_Stop(int Parametr) // Проверка стоп-прик.
{
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
if (Parametr= 0; cnt--)
{
OrderSelect (cnt, SELECT_BY_POS, MODE_HISTORY);
if(OrderSymbol()==Symb && OrderMagicNumber() == MagicNumber)
{
Stopped = false;
if (OrderType() == OP_BUY)
{
if (OrderClosePrice() - OrderOpenPrice() < 0)
{
Stopped = true;
}
cnt = 0;
}
if (OrderType() == OP_SELL)
{
if (OrderOpenPrice() - OrderClosePrice() < 0)
{
Stopped = true;
}
cnt = 0;
}
}
}
if (Stopped)
{
StopTime = OrderCloseTime() + MinutesToDelay*60;
}
return (Stopped);
}