//+------------------------------------------------------------------+ //| SMF2.mq4 | //| N.A.Khrushchev@gmail.com | //| | //+------------------------------------------------------------------+ #property copyright "N.A.Khrushchev@gmail.com" #property link "" //---- input parameters extern int magic = 9753; extern string x = " Управление капиталом"; extern double lot = 0.1; extern double martin = 1.0; extern double PaS = 15; extern string xx = " Параметры индикаторов"; extern int StoKP = 5; extern int StoKS = 3; extern int StoSh = 1; extern double StoSL1 = 80; extern double StoSL2 = 20; extern double StoSLD = 5; extern int EmaP = 320; bool Work=true; double Koef= 1; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ void init() { Alert("Советник запущен"); return; } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void deinit() { Alert("Советник отключен"); return; } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { Alert ("Начало исполнения функции start"); bool HistInf, TradeInf, Opn_B = false, Opn_S = false, LossOrd; int Ticket; double LotS, StoLv1 = StoSL1, StoLv2 = StoSL2; //+Предварительная обработка----------------------------------------------+ if(Bars < EmaP) // Недостаточно баров { Alert("Недостаточно баров в окне. Эксперт не работает."); return; // Выход из start() } if(Work==false) // Критическая ошибка { Alert("Критическая ошибка. Эксперт не работает."); return; // Выход из start() } //+Проверка открытых ордеров-----------------------------------------+ TradeInf = true; // нет торгуемых ордеров for (int i=1; i<=OrdersTotal(); i++) // Переборка открытых ордеров { if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true) // есть следующий { if (OrderMagicNumber()==magic) // сравнение меджика { TradeInf = false; // запрет торговли, есть открытый ордер } } } //+Проверка закрытых ордеров-----------------------------------------+ HistInf = false; // нет интересующих нас закрытых ордеров (по стопу) if (TradeInf == true); for (int k=1; i= OrderStopLoss()) && (OrderType() == OP_SELL)) ) // закрыт по стоп лосу { if (OrderCloseTime()>=TimeCurrent() - 900) // закрытый по стопу ордер закрыт не более 15 минут назад { Alert("Найден ордер со стопом"); HistInf = true; // Есть интересующий нас ордер if (OrderType() == OP_BUY) { LossOrd = true; // Закрытый ордер был на покупку break; } if (OrderType() == OP_SELL) { LossOrd = false; // Закрытый ордер был на продажу break; } } } } if (OrderClosePrice() == OrderTakeProfit()) { if (OrderCloseTime()>=TimeCurrent() - 1800) // закрытый по стопу ордер закрыт не более 15 минут назад { return; Alert("ждем"); } } } } } //+Расчет стоимости ордеров-----------------------------------------+ if (TradeInf==true) // Расчеты ведутся если разрешена торговля { if (HistInf==true) // пересчитываем коэфицент { Koef = Koef * 2; //умножаем если был лосс Alert("Удваиваем цену"); }else { Koef = 1; // сбрасываем если лоса небыло Alert("Обнуляем цену"); } LotS = NormalizeDouble(lot * Koef * martin,Digits); Comment("Размер торгуемого лота" ,LotS); } //+Торговые критерии-----------------------------------------+ if (TradeInf==true) // условия для изменения торговых критериев { if (HistInf==false) // изменение уровней стохастука только для новой сессии { double EMA_t1 = iMA(NULL,0,EmaP,0,MODE_EMA,PRICE_TYPICAL,1); // Первая ЕМАшка double EMA_t2 = iMA(NULL,0,EmaP,0,MODE_EMA,PRICE_TYPICAL,2); // Вторая ЕМАшка if (EMA_t1 > EMA_t2) // Восходящий тренд { Alert("Восходящий тренд"); StoLv1 = StoSL1 - StoSLD; StoLv2 = StoSL2 - StoSLD; } if (EMA_t1 < EMA_t2) // нисходящий тренд { Alert("Нисходящий тренд"); StoLv1 = StoSL1 + StoSLD; StoLv2 = StoSL2 + StoSLD; } if (EMA_t1 == EMA_t2) { Alert("Тренд отсутствует"); StoLv1 = StoSL1; StoLv2 = StoSL2; } } double StoSign=iStochastic(NULL,0,StoKP,1,StoKS,MODE_SMA,0,MODE_MAIN,StoSh); if (StoSign > StoLv1) // Основная линия стохастика выше сигнального уровня { Opn_B = false; // Запрет покупки Opn_S = true; // Разрешение продажи } if (StoSign < StoLv2) // Основная линия стохастика выше сигнального уровня { Opn_B = true; // Запрет покупки Opn_S = false; // Разрешение продажи } if (StoSign >= StoLv2 && StoSign <= StoLv1 && HistInf==true) // стохастик между линий, есть ордер по стопу { if (LossOrd==true) // закрытый по стопу ордер был на покупку, переворачиваем торговлю { Opn_B = false; // Запрет покупки Opn_S = true; // Разрешение продажи } if (LossOrd==false) // закрытый по стопу ордер был на продажу, переворачиваем торговлю { Opn_B = true; // Разрешение покупки Opn_S = false; // Запрет продажи } } } //+Открытие ордеров-----------------------------------------+ while(true) // Цикл открытия орд. { if (TradeInf==true && Opn_B==true) // Разрешение на торговлю + { // критерий откр. Buy Alert("Попытка открыть Buy. Ожидание ответа.."); Ticket=OrderSend(Symbol(),OP_BUY,LotS,Ask,3,Ask-PaS*Point,Ask+PaS*Point,NULL,magic,0,Blue); //Открытие Buy if (Ticket > 0) // Получилось :) { Alert ("Открыт ордер Buy ",Ticket); return; // Выход из start() } if (Fun_Error(GetLastError())==1) // Обработка ошибок { continue; // Повторная попытка } return; // Выход из start() } if (TradeInf==true && Opn_S==true) // Разрешение на торговлю + { // критерий откр. Sell Alert("Попытка открыть Sell. Ожидание ответа.."); Ticket=OrderSend(Symbol(),OP_SELL,LotS,Bid,3,Bid+PaS*Point,Bid-PaS*Point,NULL,magic,0,Red);//Открытие Sel 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); // Выход из функции } }