//+--------------------------------------------------------------------------------------------------------------+ //| START. //+--------------------------------------------------------------------------------------------------------------+ int start() { if( pa==0) ObjectDelete("P"); CloseOrders(); //--- Сопровождение ордеров ModifyOrders(); //--- Вывод в безубыток if(OrderDOP > 0)Dmarket(pa); if(LimitOrder > 0)Dlimit(pa); if(StopOrder > 0)Dstop(pa); if(ModifDOP == TRUE)Grafik(); if((Ask-Bid)>MaxSpread*Point*K) if (TICK>0&&iVolume(Symbol(),1,0)>TICK)return(0); //--- return (0); } //+--------------------------------------------------------------------------------------------------------------+ //| Основная функция. Сначало производится проверка спреда, далее проверка сигналов на вход. //+--------------------------------------------------------------------------------------------------------------+ void Scalper() { //+--------------------------------------------------------------------------------------------------------------+ //--- Сообщение о превышенном спреде if (MaxSpreadFilter()) { if (!CheckSpreadRule && WriteDebugLog) { //--- Print("Торговый сигнал пропущен из-за большого спреда."); Print("Текущий спред = ", DoubleToStr((Ask - Bid) / pp, 1), ", MaxSpread = ", DoubleToStr(MaxSpread, 1)); Print("Эксперт будет пробовать позже, когда спред станет допустимым."); } //--- CheckSpreadRule = TRUE; //--- } else { //--- CheckSpreadRule = FALSE; if (OpenLongSignal() && OpenTradeCount() && Long) OpenPosition(OP_BUY); if (OpenShortSignal() && OpenTradeCount() && Short) OpenPosition(OP_SELL); } //--- Закрытие if (MaxSpreadFilter) return (0); } //+--------------------------------------------------------------------------------------------------------------+ //| OpenPosition. Функция открытия позиции. //+--------------------------------------------------------------------------------------------------------------+ int OpenPosition(int OpType) { //+--------------------------------------------------------------------------------------------------------------+ int bl=0,sl=0,bs=0,ss=0,rb=0,rs=0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol()) { if (OrderType()==OP_BUYLIMIT&&OrderMagicNumber()==MagicNumber)bl=1; if (OrderType()==OP_SELLLIMIT&&OrderMagicNumber()==MagicNumber)sl=1; if (OrderType()==OP_SELLSTOP&&OrderMagicNumber()==MagicNumber)ss=1; if (OrderType()==OP_BUYSTOP&&OrderMagicNumber()==MagicNumber)bs=1; //if (OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber&&100 0) { MathSrand(TimeLocal()); RandomOpenTime = MathRand() % RandomOpenTimePercent; if (WriteLog) { Print("DelayRandomiser: задержка ", RandomOpenTime, " секунд."); } Sleep(1000 * RandomOpenTime); } //--- Закрытие if (RandomOpenTimePerc double OpenLotSize = LotSize; //--- Расчет объёма позиции if (StartLot>0)OpenLotSize=StartLot; //--- Если не хватет средств, возвращаем ошибку if (AccountFreeMarginCheck(EASymbol, OpType, OpenLotSize) <= 0.0 || GetLastError() == 134/* NOT_ENOUGH_MONEY */) { //--- if (WriteDebugLog) { //--- Print("Для открытия ордера недостаточно свободной маржи."); Comment("Для открытия ордера недостаточно свободной маржи."); //--- } return (-1); } //--- Закрытие if (AccountFreeMarginCheck RefreshRates(); //--- Если длинная позиция, то if (OpType == OP_BUY) { B=1; OpenPrice = NormalizeDouble(Ask, Digits); OpenColor = OpenBuyColor; //--- if (!StopVertual) { //--- Если включены стоп-уровни (стоп-лосс и тейк-профит) TP = NormalizeDouble(OpenPrice + OrderTP, Digits); //--- То расчитывает тейк-профит SL = NormalizeDouble(OpenPrice - OrderSL, Digits); //--- и стоп-лосс //--- } else {TP = 0; SL = 0;} //--- Если короткая позиция, то } else { S=1; OpenPrice = NormalizeDouble(Bid, Digits); OpenColor = OpenSellColor; //--- if (!StopVertual) { TP = NormalizeDouble(OpenPrice - OrderTP, Digits); SL = NormalizeDouble(OpenPrice + OrderSL, Digits); } //--- else {TP = 0; SL = 0;} } int MaximumTradesCount = MaximumTrades; //--- Счетчик открытых позиций while (MaximumTradesCount > 0 && OpenTradeCount()) { //--- Если MaximumTrades равно хотябы 1-му, то происходит открытие //---OpenOrder = if (MarketOrder==TRUE&&B==1)OrderSend(EASymbol, OP_BUY, OpenLotSize, NormalizeDouble(Ask, Digits), SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor); if (MarketOrder==TRUE&&S==1)OrderSend(EASymbol, OP_SELL, OpenLotSize, NormalizeDouble(Bid, Digits), SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor); if (LimitOrder>0&&B==1&&bl==0)OrderSend(EASymbol, OP_BUYLIMIT, OpenLotSize, NormalizeDouble(Bid-LimitOrder*Point*K, Digits), SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor); if (LimitOrder>0&&S==1&&sl==0)OrderSend(EASymbol, OP_SELLLIMIT, OpenLotSize, NormalizeDouble(Ask+LimitOrder*Point*K, Digits), SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor); if (ReversOrder>0&&B==1&&ss==0)OrderSend(EASymbol, OP_SELLSTOP, KRevers*OpenLotSize, NormalizeDouble(Bid-ReversOrder*Point*K, Digits), SP, 0, 0,"R" , MagicNumber, TimeCurrent()+60*TimeRewers, OpenColor); if (ReversOrder>0&&S==1&&bs==0)OrderSend(EASymbol, OP_BUYSTOP, KRevers*OpenLotSize, NormalizeDouble(Ask+ReversOrder*Point*K, Digits), SP, 0, 0, "R", MagicNumber, TimeCurrent()+60*TimeRewers, OpenColor); //---&&rs==0 &&rb==0 Sleep(MathRand() / 1000); //--- Задержка в несколько секунд после открытия //--- if (OpenOrder < 0) { //--- Если ордер не открылся, то OpenOrderError = GetLastError(); //--- Возвращаем ошибку //--- if (WriteDebugLog) { if (OpType == OP_BUY) OpTypeString = "OP_BUY"; else OpTypeString = "OP_SELL"; Print("Открытие: OrderSend(", OpTypeString, ") ошибка = ", ErrorDescription(OpenOrderError)); //--- Код ошибки на Русском } //--- Закрытие if (WriteDebugLog) //--- if (OpenOrderError != 136/* OFF_QUOTES */) break; //--- Если нет цен, то прекращаем цикл if (!(OpenAddOrderRule)) break; //--- Если нет разрешения на открытие позиции, то прекращаем цикл //--- Sleep(6000); //--- Делаем паузу RefreshRates(); //--- и обновляем котировки //--- if (OpType == OP_BUY) DistLevel = NormalizeDouble(Ask, Digits); //--- Получаем новые цены покупки и продажи else DistLevel = NormalizeDouble(Bid, Digits); //--- if (NormalizeDouble(MathAbs((DistLevel - OpenPrice) / pp), 0) > Dist) break; //--- Вначале возвращает абсолютное значение разницы между текущим курсом и ценой открытия, далее сравнивает полученное с значение со значением переменной Dist //--- OpenPrice = DistLevel; //--- Получаем новое значение OpenPrice MaximumTradesCount--; //--- И вычитаем -1 из счетчика MaximumTrades //--- Если счетчик больше нуля, то выдаем сообщение о том, что можно открыть ордер. if (MaximumTradesCount > 0) { if (WriteLog) { Print("... Возможно открыть ордер."); } } //--- Закрытие if (MaximumTradesCount //--- } //--- Закрытие if (OpenOrder < 0) //--- А, если же OpenOrder > 0, то else { if (OrderSelect(OpenOrder, SELECT_BY_TICKET)) OpenPrice = OrderOpenPrice(); //--- if (!(SoundAlert)) break; //--- Проигрываение звука, если он включен PlaySound(SoundFileAtOpen); break; } //--- Закрытие else { при OpenOrder > 0 } //--- Закрытие цикла while (MaximumTradesCount > 0) //--- return (OpenOrder); } //+--------------------------------------------------------------------------------------------------------------+ //| ModifyOrders. Модификация ордеров в безубыток. //+--------------------------------------------------------------------------------------------------------------+ void ModifyOrders() { //+--------------------------------------------------------------------------------------------------------------+ bool TicketModify; //--- Закрытие ордера int total = OrdersTotal() - 1; int ModifyError ; int ModifyTicketID ; string ModifyOrderType ; //--- for (int i = total; i >= 0; i--) { //--- Счетчик открытых ордеров if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // ModifyTicketID = OrderTicket(); // ModifyOrderType = OrderType(); if (OrderType() == OP_BUY) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol&&OrderStopLoss()==0&&OrderTakeProfit()==0) { TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()- StopLoss*Point*K,Digits), NormalizeDouble(OrderOpenPrice()+TakeProfit*Point*K,Digits), 0, Blue); } } if (OrderType() == OP_SELL) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol&&OrderStopLoss()==0&&OrderTakeProfit()==0) { TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+ StopLoss*Point*K,Digits), NormalizeDouble(OrderOpenPrice()-TakeProfit*Point*K,Digits), 0, Blue); } } //---------------------------------------------------------------------------------------------------------------------------------------------------- if (OrderType() == OP_BUY) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol&&OrderStopLoss()==0&&OrderTakeProfit()!=0) { TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()- StopLoss*Point*K,Digits), OrderTakeProfit(), 0, Blue); } } if (OrderType() == OP_SELL) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol&&OrderStopLoss()==0&&OrderTakeProfit()!=0) { TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+ StopLoss*Point*K,Digits), OrderTakeProfit(), 0, Blue); } } if (OrderType() == OP_BUY) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol&&OrderStopLoss()!=0&&OrderTakeProfit()==0) { TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), NormalizeDouble(OrderOpenPrice()+TakeProfit*Point*K,Digits), 0, Blue); } } if (OrderType() == OP_SELL) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol&&OrderStopLoss()!=0&&OrderTakeProfit()==0) { TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(), NormalizeDouble(OrderOpenPrice()-TakeProfit*Point*K,Digits), 0, Blue); } } //---------------------------------------------------------------------------------------------------------------------------------------------------- //--- Модификация ордера на покупку if (OrderType() == OP_BUY) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol) { if (Bid - OrderOpenPrice() > SecureProfitTriger * pp && MathAbs(OrderOpenPrice() + SecureProfit * pp - OrderStopLoss()) >= Point &&NormalizeDouble(OrderOpenPrice() + SecureProfit * pp, Digits)-Point>=OrderStopLoss()) { //--- Модифицируем ордер TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() + SecureProfit * pp, Digits), OrderTakeProfit(), 0, Blue); if (!TicketModify){ ModifyError = GetLastError(); if (WriteDebugLog) Print("Произошла ошибка во время модификации ордера (", ModifyOrderType, ",", ModifyTicketID, "). Причина: ", ErrorDescription(ModifyError)); } } } } //--- Закрытие if (OrderType() == OP_BUY) //--- Модификация ордера на продажу if (OrderType() == OP_SELL) { if (OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1 && OrderSymbol() == EASymbol) { if (OrderOpenPrice() - Ask > SecureProfitTriger * pp && MathAbs(OrderOpenPrice() - SecureProfit * pp - OrderStopLoss()) >= Point &&NormalizeDouble(OrderOpenPrice() - SecureProfit * pp, Digits)+Point<=OrderStopLoss()) { //--- Модифицируем ордер TicketModify = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - SecureProfit * pp, Digits), OrderTakeProfit(), 0, Red); if (!TicketModify){ ModifyError = GetLastError(); if (WriteDebugLog) Print("Произошла ошибка во время модификации ордера (", ModifyOrderType, ",", ModifyTicketID, "). Причина: ", ErrorDescription(ModifyError)); } } } } //--- Закрытие if (OrderType() == OP_SELL) //................................................................................................ if(TrailingStop>1&&(OrderMagicNumber()== MagicNumber||OrderMagicNumber()== MagicNumber1)) { if(OrderType() == OP_SELL&&OrderOpenPrice() - Ask > Utral*Point*K) { if(TrailingStop> 0&&TrailingStop > 1) { if(OrderOpenPrice() - Ask > TrailingStop * Point*K) { if(OrderStopLoss()-Point* TrailingStep*K > (Ask + Point* TrailingStop*K)&&Ask + Point * TrailingStop*K<=OrderStopLoss()-Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop*K, OrderTakeProfit(),0, CLR_NONE); // return(0); } } } } else if(OrderType() == OP_BUY&&Bid - OrderOpenPrice() > Utral*Point*K)//||OrderMagicNumber()== MAGIC1) { if(TrailingStop > 0&&TrailingStop > 1) { if(Bid - OrderOpenPrice() > TrailingStop * Point*K) { if(OrderStopLoss()+Point* TrailingStep*K < (Bid - Point * TrailingStop*K)&&Bid - Point * TrailingStop*K>=OrderStopLoss()+Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop*K, OrderTakeProfit() ,0, CLR_NONE); // return(0); } } } } } //----------------------------------------------------------------------------- if(TrailingStop<1&&(OrderMagicNumber()== MagicNumber||OrderMagicNumber()== MagicNumber1)) { if(OrderType() == OP_SELL&&TrailingStop < 1) { if(TrailingStop> 0) { if(OrderOpenPrice() - Ask > Utral*Point*K) { if(OrderStopLoss()-Point* TrailingStep*K > Ask + (OrderOpenPrice()-Ask)*TrailingStop&& Ask + (OrderOpenPrice()-Ask)*TrailingStop<=OrderStopLoss()-Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + (OrderOpenPrice()-Ask)*TrailingStop, OrderTakeProfit(),0, CLR_NONE); // return(0); } } } } else if(OrderType() == OP_BUY) { if(TrailingStop > 0&&TrailingStop < 1) { if(Bid - OrderOpenPrice() > Utral*Point*K) { if(OrderStopLoss()+Point* TrailingStep*K < Bid - (Bid - OrderOpenPrice())*TrailingStop&&Bid - (Bid - OrderOpenPrice())*TrailingStop>=OrderStopLoss()+Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - (Bid - OrderOpenPrice())*TrailingStop , OrderTakeProfit() ,0, CLR_NONE); } } } } } //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' } } //--- Закрытие for (int i = total - 1; i >= 0; i--) return ; } //+--------------------------------------------------------------------------------------------------------------+ //| OpenLongSignal. Сигнал на открытие длинной позиции. //+--------------------------------------------------------------------------------------------------------------+ bool OpenLongSignal() { //+--------------------------------------------------------------------------------------------------------------+ int zp = 0; bool result = false; bool result1 = false; bool result2 = false; bool result3 = false; //--- Расчет основных сигналов на вход double iClose_Signal = iClose(NULL,PERIOD_M15, 1); double iMA_Signal = iMA(NULL, PERIOD_M15, iMA_PeriodLONG, 0, MODE_LWMA, PRICE_TYPICAL, 1); double iWPR_Signal = iStochastic(NULL, PERIOD_M15, iRSI_PeriodLONG_2, 1, 3, MODE_SMA, 0, MODE_MAIN,1);//iRSI(NULL, PERIOD_M15, iRSI_PeriodLONG_2, PRICE_MEDIAN, 1); double iATR_Signal = iStochastic(NULL, PERIOD_M15, iRSI_PeriodLONG_3, 1, 3, MODE_SMA, 0, MODE_MAIN, 1);//iRSI(NULL, PERIOD_M15, iRSI_PeriodLONG_3, PRICE_MEDIAN, 1); double iCCI_Signal = iStochastic(NULL, PERIOD_M15, iCCI_PeriodLONG, 1, 3, MODE_SMA, 0, MODE_MAIN, 1);//iCCI(NULL,PERIOD_M15 , iCCI_PeriodLONG, PRICE_CLOSE, 1); //iRSI(NULL, PERIOD_M15, iRSI_PeriodLONG_4, 5, 1); //--- double iMA_Filter_a = NormalizeDouble(iMA_LONG_Open_a*pp,pd); double iMA_Filter_b = NormalizeDouble(iMA_LONG_Open_b*pp,pd); double BidPrice = Bid; //--- (iClose_Signal >= BidPrice) Сравнение идёт именно с Bid (а не с Ask, как должно быть), так как цена закрытия свечи iClose_Signal формируется на основании значения Bid //--- //--- Сверяем сигнал по АТР с его фильтром if (iATR_Signal <= FilterATR * pp) return (0); //--- if ((iMA_Signal - iClose_Signal > iMA_Filter_a && iClose_Signal - BidPrice >= cf && iWPR_Signal > iWPR_Filter_OpenShort_a) || (iMA_Signal - iClose_Signal < iMA_Filter_a && iClose_Signal - BidPrice <= cf && iWPR_Signal < iWPR_Filter_OpenLong_a)) result1 = true; else result1 = false; //--- if ((iMA_Signal - iClose_Signal > iMA_Filter_b && iClose_Signal - BidPrice >= cf && iCCI_Signal > iCCI_OpenFilter) || (iMA_Signal - iClose_Signal < iMA_Filter_b && iClose_Signal - BidPrice <= cf && iCCI_Signal < iCCI_OpenFilter)) result2 = true; else result2 = false; //--- if ((iMA_Signal - iClose_Signal > iMA_Filter_b && iClose_Signal - BidPrice >= cf && iWPR_Signal > iWPR_Filter_OpenShort_b) || (iMA_Signal - iClose_Signal < iMA_Filter_b && iClose_Signal - BidPrice <= cf && iWPR_Signal < iWPR_Filter_OpenLong_b)) result3 = true; else result3 = false; //--- if (result1 == true || result2 == true || result3 == true) result = true; else result = false; //--- return (result); } //+--------------------------------------------------------------------------------------------------------------+ //| OpenShortSignal. Сигнал на открытие короткой позиции. //+--------------------------------------------------------------------------------------------------------------+ bool OpenShortSignal() { //+--------------------------------------------------------------------------------------------------------------+ int zp = 0; bool result = false; bool result1 = false; bool result2 = false; bool result3 = false; //--- Расчет основных сигналов на вход double iClose_Signal = iClose(NULL,PERIOD_M15 , 1); double iMA_Signal = iMA(NULL, PERIOD_M15, iMA_PeriodShort, 0, MODE_LWMA, PRICE_TYPICAL, 1); double iWPR_Signal = iStochastic(NULL, PERIOD_M15, iRSI_PeriodShort_2, 1, 3, MODE_SMA, 0, MODE_MAIN,1);//iRSI(NULL, PERIOD_M15, iRSI_PeriodShort_2, PRICE_MEDIAN, 1); double iATR_Signal = iStochastic(NULL, PERIOD_M15, iRSI_PeriodShort_3, 1, 3, MODE_SMA, 0, MODE_MAIN,1);//iRSI(NULL, PERIOD_M15, iRSI_PeriodShort_3, PRICE_MEDIAN, 1); double iCCI_Signal = iStochastic(NULL, PERIOD_M15, iCCI_PeriodShort, 1, 3, MODE_SMA, 0, MODE_MAIN,1);//iCCI(NULL, PERIOD_M15, iCCI_PeriodShort, PRICE_CLOSE, 1); //iRSI(NULL, PERIOD_M15, iRSI_PeriodShort_4, 5, 1); //--- double iMA_Filter_a = NormalizeDouble(iMA_Short_Open_a*pp,pd); double iMA_Filter_b = NormalizeDouble(iMA_Short_Open_b*pp,pd); double BidPrice = Bid; //--- //--- Сверяем сигнал по АТР с его фильтром if (iATR_Signal <= FilterATR * pp) return (0); //--- if ((iClose_Signal - iMA_Signal < iMA_Filter_a && iClose_Signal - BidPrice >= - cf && iWPR_Filter_OpenShort_a > iWPR_Signal) || (iClose_Signal - iMA_Signal < iMA_Filter_a && iClose_Signal - BidPrice <= - cf && iWPR_Filter_OpenLong_a > iWPR_Signal)) result1 = true; else result1 = false; //--- if ((iClose_Signal - iMA_Signal < iMA_Filter_b && iClose_Signal - BidPrice >= - cf && - iCCI_OpenFilter > iCCI_Signal) || (iClose_Signal - iMA_Signal < iMA_Filter_b && iClose_Signal - BidPrice <= - cf && - iCCI_OpenFilter > iCCI_Signal)) result2 = true; else result2 = false; //--- if ((iClose_Signal - iMA_Signal < iMA_Filter_b && iClose_Signal - BidPrice >= - cf && iWPR_Filter_OpenShort_b > iWPR_Signal) || (iClose_Signal - iMA_Signal < iMA_Filter_b && iClose_Signal - BidPrice <= - cf && iWPR_Filter_OpenLong_b > iWPR_Signal)) result3 = true; else result3 = false; //--- if (result1 == true || result2 == true || result3 == true) result = true; else result = false; //--- return (result); } //+--------------------------------------------------------------------------------------------------------------+ //| CloseLongSignal. Сигнал на закрытие длинной позиции. //+--------------------------------------------------------------------------------------------------------------+ bool CloseLongSignal(double OrderPrice, int CheckOrders) { //+--------------------------------------------------------------------------------------------------------------+ bool result = false; bool result1 = false; bool result2 = false; //--- double iWPR_Signal = iStochastic(NULL, PERIOD_M15, iRSI_PeriodLONG_2, 1, 3, MODE_SMA, 0, MODE_MAIN,1); double iClose_Signal = iClose(NULL, PERIOD_M15, 1); double iOpen_CloseSignal = iOpen(NULL, PERIOD_M1, 1); double iClose_CloseSignal = iClose(NULL, PERIOD_M1, 1); //--- double MaxLoss = NormalizeDouble(-MaxLossPoints * pp,pd); //--- double Price_Filter = NormalizeDouble(Price_Filter_Close*pp,pd); double BidPrice = Bid; //--- //--- if (OrderPrice - BidPrice <= MaxLoss && iClose_Signal - BidPrice <= cf && iWPR_Signal > iWPR_Filter_CloseShort && CheckOrders == 1) result1 = true; else result1 = false; //--- if (iOpen_CloseSignal > iClose_CloseSignal && BidPrice - OrderPrice >= Price_Filter && CheckOrders == 1) result2 = true; else result2 = false; //--- if (result1 == true || result2 == true) result = true; else result = false; //--- return (result); } //+--------------------------------------------------------------------------------------------------------------+ //| CloseShortSignal. Сигнал на закрытие короткой позиции. //+--------------------------------------------------------------------------------------------------------------+ bool CloseShortSignal(double OrderPrice, int CheckOrders) { //+--------------------------------------------------------------------------------------------------------------+ bool result = false; bool result1 = false; bool result2 = false; //--- double iWPR_Signal = iStochastic(NULL, PERIOD_M15, iRSI_PeriodShort_2, 1, 3, MODE_SMA, 0, MODE_MAIN,1); double iClose_Signal = iClose(NULL, PERIOD_M15, 1); double iOpen_CloseSignal = iOpen(NULL, PERIOD_M1, 1); double iClose_CloseSignal = iClose(NULL, PERIOD_M1, 1); //--- double MaxLoss = NormalizeDouble(-MaxLossPoints*pp,pd); //--- double Price_Filter = NormalizeDouble(Price_Filter_Close*pp,pd); double BidPrice = Bid; double AskPrice = Ask; //--- //--- if (AskPrice - OrderPrice <= MaxLoss && iClose_Signal - BidPrice >= - cf && iWPR_Signal < iWPR_Filter_CloseShort && CheckOrders == 1) result1 = true; else result1 = false; //--- if (iOpen_CloseSignal < iClose_CloseSignal && OrderPrice - AskPrice >= Price_Filter && CheckOrders == 1) result2 = true; else result2 = false; //--- if (result1 == true || result2 == true) result = true; else result = false; //--- return (result); } //+--------------------------------------------------------------------------------------------------------------+ //| CalcLots. Функция расчета обьема лота //| производится исходя из числа открытых в прошлом ордеров. То есть увеличение лота теперь //| зависит не только от свободных средств, но и от числа открытых в прошлом советником ордеров. //+--------------------------------------------------------------------------------------------------------------+ double CalcLots() { //+--------------------------------------------------------------------------------------------------------------+ //--- Обнуляем значения SumProfit = 0; OldOrdersCount = 0; loss = 0; LossOrdersCount = 0; pr = 0; ProfitOrdersCount = 0; //--- //--- Выбираем закрытие ранее ордера for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { OldOrdersCount++; //--- Считаем ордера SumProfit += OrderProfit(); //--- и суммарный профит //--- Если суммарный профит больше pr (для начала больше 0) if (SumProfit > pr) { //--- Инициализируем профит и счетчик прибыльных ордеров pr = SumProfit; ProfitOrdersCount = OldOrdersCount; } //--- Если суммарный профит меньше loss (для начала больше 0) if (SumProfit < loss) { //--- Инициализируем просадку и счетчик убыточных ордеров loss = SumProfit; LossOrdersCount = OldOrdersCount; } //--- Если текущее кол-во подсчитанных ордеров больше или равно MaxAnalizCount (50), то в будущем считаем только свеженькие ордера а старые вычитаем. if (OldOrdersCount >= MaxAnalizCount) break; } } } //--- Закрытие for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) { //--- Если число прибыльных ордеров меньше или равно числу лосей, то расчитываем значение умножения лота MultiLot if (ProfitOrdersCount <= LossOrdersCount) MultiLot = MathPow(MultiLotPercent, LossOrdersCount); //--- Если нет, то else { //--- Инициализируем параметры по профиту SumProfit = pr; OldOrdersCount = ProfitOrdersCount; LastPr = pr; LastCount = ProfitOrdersCount; //--- Выбираем закрытие ранее ордера (минус число прибыльных ордеров) for (i = OrdersHistoryTotal() - ProfitOrdersCount - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { //--- Если выбрано более 50 ордеров прекразщаем выбирать if (OldOrdersCount >= MaxAnalizCount) break; //--- OldOrdersCount++; //--- Считаем кол-во ордеров SumProfit += OrderProfit(); //--- и профит //--- Если новый профит меньше предыдущего (LastPr), то if (SumProfit < LastPr) { //--- Переинициализируем значения профита и кол-во ордеров LastPr = SumProfit; LastCount = OldOrdersCount; } } } } //--- Закрытие for (i = OrdersHistoryTotal() - ProfitOrdersCount - 1; i >= 0; i--) { //--- Если значение счетчика LastCount равно счетчику прибыльных ордеров или прошлый профит равен текщему, то if (LastCount == ProfitOrdersCount || LastPr == pr) MultiLot = MathPow(MultiLotPercent, LossOrdersCount); //--- расчитываем значение умножения лота MultiLot //--- Если нет, то else { //--- Делим положительный (loss - pr) на положительный (LastPr - pr) и сравниваем с риском, после расчитываем умножение лота MultiLot if (MathAbs(loss - pr) / MathAbs(LastPr - pr) >= (Risk + 100.0) / 100.0) MultiLot = MathPow(MultiLotPercent, LossOrdersCount); else MultiLot = MathPow(MultiLotPercent, LastCount); } } } //--- Закрытие if (MultiLotPercent > 0.0 && AutoMM > 0.0) { //--- Получаем финальный объём лота, исходя из выполненных выше действий for (double OpLot = MathMax(MinLot, MathMin(MaxLot, MathCeil(MathMin(AutoMM_Max, MultiLot * AutoMM) / 100.0 * AccountFreeMargin() / LotStep / (LotValue / 100)) * LotStep)); OpLot >= 2.0 * MinLot && 1.05 * (OpLot * FreeMargin) >= AccountFreeMargin(); OpLot -= MinLot) { } return (OpLot); } //+--------------------------------------------------------------------------------------------------------------+ //| ExistPosition. Функция проверки открытых ордеров. //| Если открыт ордер возвращает True, если нет, дает разрешение (False, 0) на открытие. //+--------------------------------------------------------------------------------------------------------------+ int ExistPosition() { //+--------------------------------------------------------------------------------------------------------------+ int trade = OrdersTotal() - 1; for (int i = trade; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderType() == OP_BUY||OrderType() == OP_SELL)&&(OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1)) { if (OrderSymbol() == EASymbol) if (OrderType() <= OP_SELL) return (1); } } } //--- return (0); } //+--------------------------------------------------------------------------------------------------------------+ //| OpenTradeCount. Счетчик открытых ордеров. Если число открытых ордеров больше или равно MaximumTrades, то //| идет запрет на торговлю. //+--------------------------------------------------------------------------------------------------------------+ bool OpenTradeCount() { //+--------------------------------------------------------------------------------------------------------------+ int count = 0; int trade = OrdersTotal() - 1; for (int i = trade; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderComment()!= "R"&&((OrderType() == OP_BUY||OrderType() == OP_SELL)&&(OrderMagicNumber() == MagicNumber||OrderMagicNumber() == MagicNumber1)&& OrderSymbol() == EASymbol)) count++; } //--- if (count >= MaximumTrades) return (False); else return (True); } ///////////////////////////////////////////////////////// //+--------------------------------------------------------------------------------------------------------------+ //| Dmarket функция открытия дополнительных рыночных ордеров //+--------------------------------------------------------------------------------------------------------------+ void Dmarket(int PA) { int bm=0,sm=0,bmd=0,smd=0,bms=0,sms=0,LBD=0,LSD=0,NB=0,NS=0,Z=0,MB=0,MS=0,zb=0,zs=0,ZP=0; double PRB,PRS,drb,drs,L,LOT,LOTD,LS,LL,LD,LOTS; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) || OrderSymbol() != Symbol()) continue; if (OrderType()==OP_BUY||OrderType()==OP_SELL&&OrderOpenTime()>=iTime(Symbol(),AccountBar,0))Z=1; if (OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber1||OrderMagicNumber()==MagicNumber&&Ask>OrderOpenPrice()-OrderDOP*Point*K)zb=1; if (OrderType()==OP_SELL&&OrderMagicNumber()==MagicNumber1||OrderMagicNumber()==MagicNumber&&BidOrderOpenPrice())LBD=1; if (OrderType()==OP_SELL&&OrderMagicNumber()==MagicNumber&&OrderStopLoss()OrderOpenPrice()+OrderDOP*Point*K){smd=1;LOTD=OrderLots();} if (OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber&&AskOrderOpenPrice()+DOPS*Point*K){sms=1;LOTS=OrderLots();} if (AccountOrder == FALSE){ if (OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber1)NB=1; if (OrderType()==OP_SELL&&OrderMagicNumber()==MagicNumber1)NS=1; if (OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber1&&OrderStopLoss()>OrderOpenPrice())LBD=1; if (OrderType()==OP_SELL&&OrderMagicNumber()==MagicNumber1&&OrderStopLoss()OrderOpenPrice()+OrderDOP*Point*K){smd=1;LOTD=OrderLots();} if (OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber1&&AskOrderOpenPrice()+DOPS*Point*K){sms=1;LOTS=OrderLots();} } if (ModifDOP == TRUE&&MB==1&&OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber&&OrderTakeProfit()>OrderOpenPrice()+1*Point+Commis*Point*K&&PRBOrderOpenPrice()&&OrderProfit()<0) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice()-Commis*Point*K,0,CLR_NONE); } if (StartLot>0){LOT=LotSize;LOTD=LotSize;LOTS=LotSize;} for (int y = OrdersTotal() - 1; y >= 0; y--) { if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol()&&(OrderMagicNumber()==MagicNumber1||OrderMagicNumber()==MagicNumber)) { if (RiskMargin>0&&RiskMargin*AccountFreeMargin()MaxLot)ML= MaxLot; if(Z==0&&ZP==0) { if(PA==0&&bmd==1&&OpenLongSignal()==true&&zb==0 ) { LD=NormalizeDouble(Lotmultiplier*LOTD,NormalizeLot); if(LD>MaxLot)LD=MaxLot; if(LD>ML)LD=ML; OrderSend(Symbol(),0,LD,Ask,2,0,0,NULL,MagicNumber1,0,Blue); } if(PA==0&&smd==1&&OpenShortSignal()==true&&zs==0 ) { LD=NormalizeDouble(Lotmultiplier*LOTD,NormalizeLot); if(LD>MaxLot)LD=MaxLot; if(LD>ML)LD=ML; OrderSend(Symbol(),1,LD,Bid,2,0,0,NULL,MagicNumber1,0,Magenta); } } return; } //+--------------------------------------------------------------------------------------------------------------+ //| Grafik. //+--------------------------------------------------------------------------------------------------------------+ void Grafik() { int b=0,s=0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)&& OrderSymbol() == Symbol()) { if (OrderMagicNumber()==MagicNumber) { if (OrderType()==OP_BUY)b=1;//else b=0; if (OrderType()==OP_SELL)s=1;//else s=0; if (OrderType()==OP_BUY) { if(ObjectFind("NP")==-1) { ObjectCreate("NP",OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSet("NP",OBJPROP_COLOR,LC); } } if (OrderType()==OP_SELL&&OrderMagicNumber()==MagicNumber) { if(ObjectFind("NP1")==-1) { ObjectCreate("NP1",OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSet("NP1",OBJPROP_COLOR,LC1); } } } double P= ObjectGet( "NP", OBJPROP_PRICE1); double p = NormalizeDouble(P,Digits); double P1= ObjectGet( "NP1", OBJPROP_PRICE1); double p1 = NormalizeDouble(P1,Digits); if (ModifTake == FALSE&&ModifDOP == TRUE&&ObjectFind("NP")!=-1&&b==1&&OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber1&&OrderTakeProfit()p1+Point) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),p1,0,CLR_NONE); //..................................................................................................................... if (ModifTake == TRUE&&ObjectFind("NP")!=-1&&b==1&&OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumber1&&OrderOpenPrice()p1+(Ask-Bid)) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),p1,0,CLR_NONE); //..................................................................................................................... } } if (b==0)ObjectDelete("NP"); if (s==0)ObjectDelete("NP1"); }