//+------------------------------------------------------------------+ //| 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; //+------------------------------------------------------------------+ //| 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; int LossOrd = -1, Ticket; double Koef = 1, LotS, StoLv1, StoLv2; //+Предварительная обработка----------------------------------------------+ 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; // нет интересующих нас закрытых ордеров (по стопу) for (i=1; i= OrderStopLoss()) && (OrderType() == OP_SELL)) ) // закрыт по стоп лосу { if (OrderCloseTime()>=TimeCurrent() - 900) // закрытый по стопу ордер закрыт не более 15 минут назад { Alert("Найден ордер со стопом") HistInf = true; // Есть интересующий нас ордер if (OrderType() == OP_BUY) { LossOrd = 1; // Закрытый ордер был на покупку } if (OrderType() == OP_SELL) { LossOrd = 0; // Закрытый ордер был на продажу } } } } } } //+Расчет стоимости ордеров-----------------------------------------+ if (TradeInf==true) // Расчеты ведутся если разрешена торговля { if (HistInf==true) // пересчитываем коэфицент { Koef = Koef * 2; //умножаем если был лосс Alert("Удваиваем цену"); }else { Koef = 1; // сбрасываем если лоса небыло Alert("Обнуляем цену"); } LotS = NormalizeDouble(lot * Koef * martin,Digits); } //+Торговые критерии-----------------------------------------+ if (TradeInf==true) // условия для изменения торговых критериев { if (HistInf==false) // изменение уровней стохастука только для новой сессии double EMA_t1=iMA(NULL,0,EmaP,0,MODE_EMA,PRICE_TYPICAL,0); // Первая ЕМАшка double EMA_t2=iMA(NULL,0,EmaP,0,MODE_EMA,PRICE_TYPICAL,1); // Вторая ЕМАшка if (EMA_t1 > EMA_t2) // Восходящий тренд { StoLv1=StoSL1-StoSLD; StoLv2=StoSL2-StoSLD; } else // нисходящий тренд { StoLv1=StoSL1+StoSLD; StoLv2=StoSL2+StoSLD; } 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 = false; // Запрет покупки Opn_S = true; // Разрешение продажи } if (StoSign >= StoLv2 || StoSign <= StoLv1 || HistInf==true) // стохастик между линий, есть ордер по стопу { if (LossOrd==1) // закрытый по стопу ордер был на покупку, переворачиваем торговлю { Opn_B = false; // Запрет покупки Opn_S = true; // Разрешение продажи } if (LossOrd==0) // закрытый по стопу ордер был на продажу, переворачиваем торговлю { 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); // Выход из функции } }