//+---------------------------------------------------------------------------+ //| Skype: Lin-Vadim MartinPending.mq4 | //| Mail: On_NightWolf@mail.ru | //| Эксперты и индикаторы под заказ: https://login.mql5.com/ru/users/f0ryou | //+---------------------------------------------------------------------------+ // Только модификация от 04.09.2015 #property copyright "Lin Vadim --> Дмитрий Летичевский" #property link "https://login.mql5.com/ru/users/f0ryou" #property version "1.0" #property description "Cоветник 'MartinPending' модифицирован через сервис Фриланс сайта MQL5.com" #property description "Спасибо Вам за вашу работу! Удачных торгов!" #property description "Лин Вадим." #property strict enum StLine {// Тип линии StLine0=0, // Сплошная StLine1=1, // Штриховая StLine2=2, // Пунктирная StLine3=3, // Штрих-пунктирная 1 StLine4=4, // Штрих-пунктирная 2 }; //ШШШШШШШШШШШШШ ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // | | Параметры Описание | //ШШШШШШШШШШШШШ ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ input double Lots = 0.01; // Лот input int MAGIC = 123456; // Магик input int Расстояние = 0; // Расстояние input int TrailStop = 0; // Трейлиг-Стоп input int TrailStep = 0; // Трейлинг Шаг input int Slippage = 5; // Проскальзывание input string _____________ = "=== Настройка вирт. ордера ==="; input double вСтартВО = 20.; // Старт виртуального ордера input double вОрдер = 0.0; // Отступ виртуального ордера input int вПрофит = 10; // Профит (для расчета в '0') input int ФиксПрибыль = 0; // Доп. фиксируемая прибыль (пп) input int ЛимитВО = 0; // Лимит Вирт. ордеров input int ТолщинаЛинии = 1; // Толщина линии input StLine СтильЛинии = StLine0; // Стиль линии input color ЦветЛинии = Gold; // Цвет линий input string ____________ = "=== Нормальный трейлинг-стоп ==="; input double СтартТралл = 2000.0; // Включение тралла при +__ пп input double ДистанцияТралл = 1500.0; // Расстояние тралла от цены input string Indicator = "=== Настройки индикатора ==="; input double Pinud_Zakrytie = 9.0; input string Box_setting = "=== Where do you want the box? ==="; input bool Show_Values_Only = TRUE; input int X_box = 0; input int Y_box = 0; input string MACD_settings = "=== Параметры MACD ==="; input int Fast_EMA = 5; input int Slow_EMA = 13; input int MACD_SMA = 1; input string Stoch_settings = "=== Параметры Stochastic ==="; input int K_period = 20; input int D_period = 2; input int Slowing = 2; input string Colors_settings = "=== Цветовые Параметры ==="; input color colorsymbol = CadetBlue; input color colortext = Silver; input color colorline = DimGray; input color colorvalues = Black; input string Alert_setting = "Pop up or/and email alert"; input bool SignalAlert = FALSE; input bool SendAlertEmail = FALSE; input int Alert_Trigger = 91; bool bOK, furushiAvval, haridiAvval; int LotDEC, iOK, VALUE=0, DIR=1, OType=0, OurSymOrdersNum=0, i=0, m_OrdTic=0, p_OrdTic=0, PendOrdersNum=0; double m_OrdSL=0.0, _pp=0.0, middleprice=0.0, m_OrderOPenPrice=0.0, p_OrderOPenPrice=0.0, m_ord_lots=0.0, i_dist=0, i_dist2=0; string gs_CommentSuffix=""; //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Усатановка советника 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ int OnInit() { _pp = (_Digits==3||_Digits==5)?10.0*_Point:_Point; i_dist=NormalizeDouble((double)Расстояние*_pp,Digits); i_dist2=NormalizeDouble((double)Расстояние/2*_pp,Digits); return(INIT_SUCCEEDED); } //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // START работы советника 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ void OnTick() { ТрейлингСтоп(); if(РазрешениеВО()) {СостояниеВО();} //---10 Count OurSymOrdersNum = 0; PendOrdersNum = 0; OType = -1; for(i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { OurSymOrdersNum++; // Подсчет всех ордеров int OrType = OrderType(); if(OrType>1) {PendOrdersNum++; p_OrdTic = OrderTicket();} // Открытые позиции if(OrType<2) { m_OrdTic = OrderTicket(); m_OrderOPenPrice = OrderOpenPrice(); m_OrdSL = OrderStopLoss(); m_ord_lots = OrderLots(); OType=OrType; } } } //---15 double inV=NormalizeDouble(Ind(VALUE),_Digits); // Значение индикатора double zer=NormalizeDouble(Pinud_Zakrytie,_Digits); // Если индикатор ___ и есть любые ордера то,.. if(inV>zer-2.0 && inV0) { ResetLastError(); RefreshRates(); // ... удаляем отложные ордера if(PendOrdersNum>0) { iOK=OrderDelete(p_OrdTic); if(!iOK) {Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",GetLastError());} else {OurSymOrdersNum--;PendOrdersNum--;} } // ... закрываем открытую позицию if(OType>=0) { iOK=OrderSelect(m_OrdTic,1); double pr = (OType==0)?Bid:Ask; iOK = OrderClose(m_OrdTic,OrderLots(),pr,Slippage); if(!iOK) Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",GetLastError()); else OurSymOrdersNum--; } } //---20 RefreshRates(); // Действия по количеству ордеров switch(OurSymOrdersNum) { // Нет ничего - открываем позицию case 0: if(Ind(DIR)<0.0&&Ind(VALUE)>90.0) OS(1); if(Ind(DIR)>0.0&&Ind(VALUE)>90.0) OS(0); break; // 1 ордер или позиция case 1: // ...если это продажа - __ (тралл ?) if(OType==1 && Расстояние!=0) { if(Bid-m_OrderOPenPrice>=i_dist) TralPend(Bid-i_dist2); if((m_OrdSL<_pp&&m_OrderOPenPrice-Ask>=TrailStop*_pp) || (m_OrdSL>0.0&&m_OrdSL-Ask>=(TrailStop+TrailStep)*_pp)) { m_OrdSL = NormalizeDouble(Ask+TrailStop*_pp,_Digits); ResetLastError(); iOK = OrderModify(OrderTicket(),OrderOpenPrice(),m_OrdSL,OrderTakeProfit(),0); if(!iOK)Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",GetLastError()); } } // ...если это покупка - __ (тралл ?) if(OType==0 && Расстояние!=0) { if(m_OrderOPenPrice-Ask>=i_dist) TralPend(Ask+i_dist2); if((m_OrdSL<_pp&&Bid-m_OrderOPenPrice>=TrailStop*_pp) || (m_OrdSL>0.0&&Bid-m_OrdSL>=(TrailStop+TrailStep)*_pp)) { m_OrdSL = NormalizeDouble(Bid-TrailStop*_pp,_Digits); ResetLastError(); iOK = OrderModify(OrderTicket(),OrderOpenPrice(),m_OrdSL,OrderTakeProfit(),0); if(!iOK)Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",GetLastError()); } } break; // 2 ордера или позиции case 2: if(PendOrdersNum>0) { iOK = OrderSelect(p_OrdTic,1); OType=OrderType(); p_OrderOPenPrice=OrderOpenPrice(); if(OType==OP_SELLSTOP) { if(Bid-p_OrderOPenPrice>i_dist2) TralPend (Bid-i_dist2); } if(OType==OP_BUYSTOP) { if(p_OrderOPenPrice-Ask>i_dist2) TralPend (Ask+i_dist2); } } break; } //--- } //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Запрос значения индикатора 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ double Ind (int mode) { double r = iCustom(_Symbol,1,"IndForPyr",Box_setting,Show_Values_Only, X_box,Y_box,MACD_settings,Fast_EMA,Slow_EMA,MACD_SMA, Stoch_settings,K_period,D_period,Slowing,Colors_settings, colorsymbol,colortext,colorline,colorvalues,Alert_setting, SignalAlert,SendAlertEmail,Alert_Trigger, mode,mode); return(r); } //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Функция ? 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ void TralPend(double price) { // Ордер удаляем сразу... if(OType>1) {iOK=OrderDelete(p_OrdTic);} else { if(OType==0)OType=OP_BUYSTOP; if(OType==1)OType=OP_SELLSTOP; } double newlot = 0.0, tp = 0.0; tp = (OType==OP_SELLSTOP) ? (price-10*_pp):(price+10*_pp); tp = NormalizeDouble(tp,_Digits); double suratiKasr = (MathAbs(m_OrderOPenPrice-tp)*m_ord_lots); newlot = suratiKasr / (10*_pp); double norm = NormalizeDouble(newlot,2); if(newlot <= norm) newlot = norm; else newlot = NormalizeDouble(norm+0.01,2); double dir = (OType==OP_SELLSTOP)?-1.0:1.0; double tpPoint = 10.0*_pp; while(newlot/m_ord_lots < MathAbs(m_OrderOPenPrice-tp)/tpPoint) { tp = tp + (_Point*dir); tpPoint = tpPoint + _Point; //Alert("OKOKOKOKOK"); } //Alert(newlot); ResetLastError(); iOK = OrderSend(_Symbol,OType,newlot,price,Slippage,NULL,tp,NULL,MAGIC); if(iOK<1){Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",GetLastError());} else { ResetLastError(); iOK = OrderModify(m_OrdTic,m_OrderOPenPrice,m_OrdSL,tp,0); if(iOK<1)Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",GetLastError()); } } //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Функция открытия ордера cmd 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ void OS(int cmd) { RefreshRates(); double price = (cmd==0)?Ask:Bid; color a_col = (cmd==0)?Blue:Red; double iLots=(Лот==0.0)?Lots:Лот; iLots=NormalizeDouble(iLots,2); if(iLotsMarketInfo(Symbol(),MODE_MAXLOT)) {iLots=MarketInfo(Symbol(),MODE_MAXLOT);} ResetLastError(); iOK=OrderSend(_Symbol,cmd,iLots,price,Slippage,0,0,gs_CommentSuffix,MAGIC,0,a_col); if(iOK<1) { int ERR=GetLastError(); if(ERR==134) {Alert("Недостаточно денег для совершения торговой операции лотом ",iLots);} else {Alert("Ошибка в строке ", __LINE__,"; Номер ошибки: ",ERR);} return; } // Установка Тейк-Профита int iTP=(Лот==0.0)?0:вПрофит+ФиксПрибыль; if(iTP!=0) { double NewTP=(cmd==0) ?NormalizeDouble(price+iTP*_pp,_Digits) : NormalizeDouble(price-iTP*_pp,_Digits); // ...На новый ордер for(int tic=0; ticLastOpenTime) { LastOpenTime =OrderOpenTime(); LastOpenPrice=OrderOpenPrice(); LastType =OrderType(); } } } if((CurrentOrd>ЛимитВО && ЛимитВО!=0) || CurrentOrd==0) return(false); double LastProfit=(LastType==0) ?(Close[0]-LastOpenPrice)/_pp : (LastOpenPrice-Close[0])/_pp; if(LastProfit<=-вСтартВО) { Виртуальный=(LastType==0)?(Close[0]+вОрдер*_pp):(Close[0]-вОрдер*_pp); СоздатьЛинию(); return(true); } return(false); } double Лот=0.0; //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Проверка состояния ВО Автор: Лин Вадим (F0ryou) 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ void СостояниеВО () { if(Виртуальный==0) return; RefreshRates(); // Условие модифицирования ВО if(MathAbs(Close[0]-Виртуальный)/_pp > вОрдер) { if(LastType==0 && Close[0]<Виртуальный) {Виртуальный=Close[0]+вОрдер*_pp; СоздатьЛинию();} if(LastType==1 && Close[0]>Виртуальный) {Виртуальный=Close[0]-вОрдер*_pp; СоздатьЛинию();} } // Условие срабатывания ВО if((LastType==0 && Close[0]>=Виртуальный) || (LastType==1 && Close[0]<=Виртуальный)) {Лот=РасчетЛота(); OS(LastType); ObjectDelete(0,name); Лот=0; Виртуальный=0;} return; } string name="Мой виртуальный ордер"; //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Создать линиию Автор: Лин Вадим (F0ryou) 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ void СоздатьЛинию() { // Удаляем предыдущую линию ObjectDelete(0,name); // Выставляем новую ObjectCreate(0,name,OBJ_HLINE,0,TimeCurrent(),Виртуальный); ObjectSetInteger(0,name,OBJPROP_COLOR,ЦветЛинии); ObjectSetInteger(0,name,OBJPROP_STYLE,СтильЛинии); ObjectSetInteger(0,name,OBJPROP_WIDTH,ТолщинаЛинии); ObjectSetInteger(0,name,OBJPROP_BACK,true); ObjectSetInteger(0,name,OBJPROP_HIDDEN,false); ObjectSetInteger(0,name,OBJPROP_ZORDER,0); return; } //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Расчет лота Автор: Лин Вадим (F0ryou) 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ double РасчетЛота() { double SizeLot=0, Price1Point=0, AllProfit=0; RefreshRates(); for(int tic=0; ticMarketInfo(Symbol(),MODE_MAXLOT)) {NewLots=MarketInfo(Symbol(),MODE_MAXLOT);} return(NewLots); } //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ // Работа трейлинг-стопа Автор: Лин Вадим (F0ryou) 2015 | //ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ+ void ТрейлингСтоп() { if(OrdersTotal()==0) {return;} int CurrentOrd=0, t=0; double Profit=0., StLoss=0.; // Подсчет сделок for(int tic=0; tic=СтартТралл && OrderSelect(t, SELECT_BY_POS)) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),0,0,Red)) Alert("Ошибка №",GetLastError()," при выставлении стоп-лосса на уровень открытия сделки (трейлинг-стоп)"); return; } // Сопровождение трейлинг-стопа if(CurrentOrd==1 && StLoss!=0 && MathAbs(Close[0]-StLoss)/_pp > ДистанцияТралл && OrderSelect(t, SELECT_BY_POS)) { StLoss=(OrderType()==0)?NormalizeDouble(Close[0]-(ДистанцияТралл*_pp),_Digits):NormalizeDouble(Close[0]+(ДистанцияТралл*_pp),_Digits); if(!OrderModify(OrderTicket(),OrderOpenPrice(),StLoss,0,0,Red)) Alert("Ошибка №",GetLastError()," при модификации стоп-лосса (трейлинг-стоп)"); return; } return; }