//+------------------------------------------------------------------+ //| Топор.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); }