# Доработка ботов (советников, индикаторов) vol. 2

Раздел: Язык программирования MQL4
Автор темы: chocolate
Создана: 2014-10-02 12:48
Ответов: 33815 | Просмотров: 6671923
Страница 809 из 1691
Источник: https://forexsystemru.com/threads/77111/page-809

---

## marattmb — 2018-11-24 16:51

> Цитата (marattmb):
> Уважаемые форумчане, ищу индикатор Linear Regression mg4 c параметрами настроек, как на скриншоте.

Может есть у кого, просьба поделиться.

## gravity — 2018-11-24 20:58

> Цитата (marattmb):
> Может есть у кого, просьба поделиться.

[https://forexsystemsru.com/yazyk-programmirovaniya-mql4/77111-dorabotka-botov-sovetnikov-indikatorov-vol-2-a-509.html](https://forexsystemsru.com/yazyk-programmirovaniya-mql4/77111-dorabotka-botov-sovetnikov-indikatorov-vol-2-a-509.html)

Снизу второй пост и дальше.

## YurMih — 2018-11-24 23:34

Добрый день, уважаемые программисты.

Прошу посмотреть индикатор - не ставится, "зараза", на терминал.
Заранее благодарю...

## Геша5 — 2018-11-24 23:42

> Цитата (Omukchaan):
> Привет!
> Проверь, должно работать)

Привет,спасибо за труды,но не работает!

Мне не нужен трал,про трал ничего не писал.
Мне надо просто настройку по бу
1) BU  true/false
2) BULevel 35 (автоопределение по знакам)это обычные пункты а не пипсы 350
3) BUSize  2   (автоопределение по знакам)так же пункты а не пипсы
 ну и если не затруднит добавить что бы ручная поза,открытая по инструменту где стоит сов,так же сопровождалась до ТП и БУ так же по этой ручной позе было.
Спасибо)

## ZIKILO — 2018-11-24 23:46

> Цитата (YurMih):
> Добрый день, уважаемые программисты.
>
> Прошу посмотреть индикатор - не ставится, "зараза", на терминал.
> Заранее благодарю...

:)

## Дитрий — 2018-11-26 01:01

**помогите подправить советника пожалуста**

в нем оставить как есть только чтоб выставлял отложки на максимуме и минимуме за интервале с 9:00 до 12:00 а остальное оставить как есть без изменений ! при много благодарен буду )

[C

## MrGreen86 — 2018-11-26 02:42

> Цитата (grunt-88):
> Добрый день! Кто сможет в этом эксперте сделать паузу между открытием ордеров?:)

можно, объясните подробней в какой ситуации вам нужна пауза в этом советнике и какая она должна быть.

## MrGreen86 — 2018-11-26 02:52

> Цитата (Геша5):
> Привет,спасибо за труды,но не работает!
>
> Мне не нужен трал,про трал ничего не писал.
> Мне надо просто настройку по бу
> 1) BU  true/false
> 2) BULevel 35 (автоопределение по знакам)это обычные пункты а не пипсы 350
> 3) BUSize  2   (автоопределение по знакам)так же пункты а не пипсы
>  ну и если не затруднит добавить что бы ручная поза,открытая по инструменту где стоит сов,так же сопровождалась до ТП и БУ так же по этой ручной позе было.
> Спасибо)

в начале настроек есть опция watch_hand_orders. если true - будет ставить такой же ТП на ордера открытые в ручную и без убыток на них тоже будет действовать. 
настройки без убытка сделал такие как вы просили.

## Sergey BAwenko — 2018-11-26 09:01

Здравствуйте УВАЖАЕМЫЕ ПРОГРАММИСТЫ прошу вашей помощи подправить данный советник.

1.Открытие ордеров автоматически. 
2.При достижении + открывает ордер в туже сторону с начальным лотом.
3.При достижении - переворачивает ордер (открывает ордер в сторону в которую был получен - ).

         :please:

## grunt-88 — 2018-11-26 09:44

> Цитата (MrGreen86):
> можно, объясните подробней в какой ситуации вам нужна пауза в этом советнике и какая она должна быть.

На одной свече может открываться множество ордеров, как на картинке

## Манат — 2018-11-26 13:59

Здравствуйте, уважаемые участники форума!
Если не сложно, помогите пожалуйста начинающему трейдеру разобраться с советником. Советник сеточник, должен выставлять отложенные ордера выше и ниже цены в настоящее время, далее по мере срабатывания отложенных ордеров, после достижения определенного уровня профита, выставляется стоп-лосс.
Проблема состоит в том, что советник выставляет бесконечное количество отложенных ордеров даже на одном и том же уровне цены, хотя по условию, отложенный ордер должен выставляться в случае отсутствия ордера (отложенного или рыночного) на данном ценовом уровне. В качестве флага наличия ордера применил функцию ExistPosByPrice(), найденную в сети. Но это тоже не помогло.
Заранее спасибо.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lots = 0.01;
extern int Magic = 12345;
extern int Slippage = 30;
extern int Lots_Step = 50;
extern int Profit_Dist = 50;
extern int Profit_Dist_Step = 20;
extern int TryCount = 10;

double price_1, price_2;

double buy_up_1, buy_up_2, buy_up_3, buy_down_1, buy_down_2, buy_down_3, sell_up_1, sell_up_2, sell_up_3, sell_down_1, sell_down_2, sell_down_3;
double buy_lots, sell_lots, sl;

int err, aticket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   price_1 = NormalizeDouble(Bid, 3);
   if(Bid - price_1 < 0)                  // Это добавлено на случай округления в большую сторону
   {                                      // например: 1,20285 округляется как 1,203, а нужно, чтобы
      price_1 = price_1 - 0.001;          // 1,202
   }
   
   buy_up_1 = NormalizeDouble(price_1 + Lots_Step * Point, Digits);
   buy_up_2 = NormalizeDouble(buy_up_1 + Lots_Step * Point, Digits);
   buy_up_3 = NormalizeDouble(buy_up_2 + Lots_Step * Point, Digits);
   buy_down_1 = NormalizeDouble(buy_up_1 - Lots_Step * Point, Digits);
   buy_down_2 = NormalizeDouble(buy_down_1 - Lots_Step * Point, Digits);
   buy_down_3 = NormalizeDouble(buy_down_2 - Lots_Step * Point, Digits);
   
   sell_up_1 = NormalizeDouble(buy_up_1 + (Lots_Step / 2) * Point, Digits);
   sell_up_2 = NormalizeDouble(sell_up_1 + Lots_Step * Point, Digits);
   sell_up_3 = NormalizeDouble(sell_up_2 + Lots_Step * Point, Digits);
   sell_down_1 = NormalizeDouble(sell_up_1 - Lots_Step * Point, Digits);
   sell_down_2 = NormalizeDouble(sell_down_1 - Lots_Step * Point, Digits);
   sell_down_1 = NormalizeDouble(sell_down_2 - Lots_Step * Point, Digits);
   
   
   if(ExistPosByPrice(Symbol(), OP_BUYSTOP, Magic, buy_up_1) == False)
      OrderSendX(Symbol(), OP_BUYSTOP, Lots, buy_up_1, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_BUYSTOP, Magic, buy_up_2) == False)
      OrderSendX(Symbol(), OP_BUYSTOP, Lots, buy_up_2, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_BUYSTOP, Magic, buy_up_3) == False)
      OrderSendX(Symbol(), OP_BUYSTOP, Lots, buy_up_3, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_BUYLIMIT, Magic, buy_down_1) == False)
      OrderSendX(Symbol(), OP_BUYLIMIT, Lots, buy_down_1, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_BUYLIMIT, Magic, buy_down_2) == False)
      OrderSendX(Symbol(), OP_BUYLIMIT, Lots, buy_down_2, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_BUYLIMIT, Magic, buy_down_3) == False)
      OrderSendX(Symbol(), OP_BUYLIMIT, Lots, buy_down_3, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_SELLLIMIT, Magic, sell_up_1) == False)
      OrderSendX(Symbol(), OP_SELLLIMIT, Lots, sell_up_1, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_SELLLIMIT, Magic, sell_up_2) == False)
      OrderSendX(Symbol(), OP_SELLLIMIT, Lots, sell_up_2, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_SELLLIMIT, Magic, sell_up_3) == False)
      OrderSendX(Symbol(), OP_SELLLIMIT, Lots, sell_up_3, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_SELLSTOP, Magic, sell_down_1) == False)
      OrderSendX(Symbol(), OP_SELLSTOP, Lots, sell_down_1, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_SELLSTOP, Magic, sell_down_2) == False)
      OrderSendX(Symbol(), OP_SELLSTOP, Lots, sell_down_2, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   if(ExistPosByPrice(Symbol(), OP_SELLSTOP, Magic, sell_down_3) == False)
      OrderSendX(Symbol(), OP_SELLSTOP, Lots, sell_down_3, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   for(int b = 0; b <= OrdersTotal() - 1; b ++)
   {
      if(OrderSelect(b, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderType() == OP_BUY)
         {
            if(Bid - OrderOpenPrice() > (Profit_Dist + Profit_Dist_Step) * Point)
            {
               sl = NormalizeDouble(OrderOpenPrice() + Profit_Dist * Point, Digits);
               if(!OrderModifyX(OrderTicket(), OrderOpenPrice(), sl, 0, 0, clrNONE))
                  Print("Не удалось модифицировать ордер на покупку!");
            }
         }
         if(OrderType() == OP_SELL)
         {
            if(OrderOpenPrice() - Ask > (Profit_Dist + Profit_Dist_Step) * Point)
            {
               sl = NormalizeDouble(OrderOpenPrice() - Profit_Dist * Point, Digits);
               if(!OrderModifyX(OrderTicket(), OrderOpenPrice(), sl, 0, 0, clrNONE))
                  Print("Не удалось модифицировать ордер на продажу!");
            }
         }
         
      }
   }
   
   for(int c = 0; c <= OrdersTotal() - 1; c ++)
   {
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
      {
         if(OrderType() == OP_BUY)
            buy_lots = buy_lots + OrderLots();
         if(OrderType() == OP_SELL)
            sell_lots = sell_lots + OrderLots();
      }
   }
   
   Comment("buy_lots = ", buy_lots, " sell_lots = ", sell_lots);
   
   return;
}
//+------------------------------------------------------------------+
int  OrderSendX(string   symbol,              // символ 
                int      cmd,                 // торговая операция 
                double   volume,              // количество лотов 
                double   price,               // цена 
                int      slippage,            // проскальзывание 
                double   stoploss,            // stop loss 
                double   takeprofit,          // take profit 
                string   comment=NULL,        // комментарий 
                int      magic=0,             // идентификатор 
                datetime expiration=0,        // срок истечения ордера 
                color    arrow_color=clrNONE  // цвет 
                )
{
   err = GetLastError();
   err = 0;
   
   bool exit_loop = false;
   int cnt        = 0;
   
   while(!exit_loop)
   {
      if(IsTradeAllowed())
      {
         aticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);
         err = GetLastError();
      }
      
      switch(err)
      {
         case ERR_NO_ERROR: exit_loop = true; break;
         
         case ERR_SERVER_BUSY: 
         case ERR_NO_CONNECTION:
         case ERR_INVALID_PRICE:
         case ERR_OFF_QUOTES:
         case ERR_BROKER_BUSY:
         case ERR_TRADE_CONTEXT_BUSY:
         case ERR_TRADE_TIMEOUT:
         cnt++;
         break;
         
         case ERR_PRICE_CHANGED:
         case ERR_REQUOTE:
              RefreshRates();
              continue;
              
         default: exit_loop = true;
         break;
      }  //  switch(err)
      
      if (cnt > TryCount)
         exit_loop = true;
      
      if(!exit_loop)
      {
         Sleep(1000);
         RefreshRates();
      }
      
      if(exit_loop)
      {
         if(err != ERR_NO_ERROR)
         {
            Print ("Ошибка: " + IntegerToString(err));
         }
      }
      
      if (err == ERR_NO_ERROR)
      {
         if (OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES))
            return (aticket);
         else return (-1);
         
         Print("Ошибка открытия ордера после " + IntegerToString(cnt) + " попыток.");
         Print("Ошибка: " + IntegerToString(err));
      }
      
   }  //   while(!exit_loop)
   return(-1);
}   // OrderSendX()
//+------------------------------------------------------------------+
bool  OrderModifyX  (int        ticket,      // номер ордера 
                     double     price,       // цена открытия 
                     double     stoploss,    // stop loss 
                     double     takeprofit,  // take profit 
                     datetime   expiration,  // время истечения ордера 
                     color      arrow_color)
{
   if(IsStopped())
   {
      Print("Ошибка: советник остановлен, IsStopped == true");
      return(false);
   }
   
   int cnt = 0;
   
   while(!IsTradeAllowed() && cnt <TryCount)
   {
      Sleep(500);
      cnt++;
   }
   
   if(!IsTradeAllowed())
   {
      Print("Ошибка: операция недопустима - IsTradeAllowed() == false.");
      return(false);
   }
   
   if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
   {
      string sym = OrderSymbol();
      int digits  = int (MarketInfo(sym, MODE_DIGITS));
      
      if(digits > 0)
      {
         price      = NormalizeDouble(price, digits);
         stoploss   = NormalizeDouble(stoploss, digits);
         takeprofit = NormalizeDouble(takeprofit, digits);
      }
   }
   
   err = GetLastError();
   err = 0;
   
   bool exit_loop = false;
   bool result = false;
   
   while(!exit_loop)
   {
      result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
      err = GetLastError();
      
      if(result == true)
         return(true);
         
      switch(err)
      {
         case ERR_NO_ERROR:
         case ERR_NO_RESULT:
            exit_loop = true;
            break;
            
         case ERR_SERVER_BUSY: 
         case ERR_NO_CONNECTION:
         case ERR_INVALID_PRICE:
         case ERR_OFF_QUOTES:
         case ERR_BROKER_BUSY:
         case ERR_TRADE_CONTEXT_BUSY:
         case ERR_TRADE_TIMEOUT:
         cnt++;
         break;
         
         case ERR_PRICE_CHANGED:
         case ERR_REQUOTE:
              RefreshRates();
              continue;
              
         default: exit_loop = true;
         break;

      }  //      switch(err)
      
      if(cnt > TryCount)
         exit_loop = true;
         
      if(!exit_loop)
      {
         Print("Ошибка! Попыток: " + IntegerToString(cnt) + "/" + IntegerToString(TryCount));
         Sleep(500);
         RefreshRates();
      }
      
      if(exit_loop)
      {
         if(err != ERR_NO_ERROR && err != ERR_NO_RESULT)
         Print("Ошибка: " + IntegerToString(err));
      }
   }  //   while(!exit_loop)
   
   if(err == ERR_NO_RESULT)
   {
      return(true);
   }
   
   Print("Ошибка модификации после " + IntegerToString(cnt) + " попыток.");
   
   return(false);
}   //  bool  OrderModifyX
//+------------------------------------------------------------------+
bool ExistPosByPrice(string sy, int op, int mn, double pp)
{
   double px, py;
   int    d, i, k=OrdersTotal();
   
   for (i=0; i<k; i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
         {
//            if (OrderType()==OP_BUY || OrderType()==OP_SELL)          // Это условие посчитал не нужным.
//            {
               if (mn<0 || OrderMagicNumber()==mn)
               {
                  d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                  px=NormalizeDouble(pp, d);
                  py=NormalizeDouble(OrderOpenPrice(), d);
                  if (pp<=0 || px==py)
                     return(True);
               }
//            }
         }
      }
   }
   return(False);
}
//+------------------------------------------------------------------+

## scr1ptograf — 2018-11-26 20:22

**Доработка**

Ребят привет. Помогите разобраться и доработать индикатор. 

1. Индикатор очень сильно вешает Терминал 
2. Нужно прикрутить алерт (см. Скрин)
3. Убрать лишнее (см. Скрин)

И если есть возможность описать суть самого индикатора, на чем основан) 
Или возможно есть аналог в инете что бы не замарачиваться, ткните палцем.

## поручик — 2018-11-26 23:14

[https://forexsystemsru.com/751173-post7399.html](https://forexsystemsru.com/751173-post7399.html)

обратись к Т. Демарку. у него есть Секвента (Sequential) подробно изложенная в книге: "Технический анализ - Новая наука".

## scr1ptograf — 2018-11-27 04:23

Поручик спасибо за наводку, очень полезную инфу почерпнул. Теперь есть один нюанс, нужен параметр LookBack из предыдущего индикатора что я выложил, запихнуть его в этот более стабильный вариант без глюков. Помогите пожo_o

Или ткните палцем может есть уже такой вариант, я гуглил пол ночи но четно:facepalm:

## Sergey BAwenko — 2018-11-28 11:54

Здравствуйте УВАЖАЕМЫЕ ПРОГРАММИСТЫ прошу вашей помощи подправить данный советник.

1.Открытие ордеров автоматически. 
2.При достижении + открывает ордер в туже сторону с начальным лотом.
3.При достижении - переворачивает ордер (открывает ордер в сторону в которую был получен - ).

  o_o:please:

## crokus — 2018-11-28 22:55

уважаемые программисты можно вывести цвет стрелок и их буфера в вкладку индикатора (цвета)

## garry119 — 2018-11-30 18:29

сделайте, пожалуйста, cci on trix

## marattmb — 2018-11-30 18:56

Уважаемые специалисты! Нужна Ваша консультация. Реально ли реализовать мою идею в советник. На скриншоте дивергенция подтверждается канальным подвальным индикатором. Проблема в том, что стандартные индикаторы дивергенций не видят здесь дивергенцию на скриншоте, а она есть и подтверждается канальным подвальным индикатором, после чего можно смело входить в позицию. На больших таймфреймах советник не обязателен, и так увижу. А вот на таймфреймах H4 и ниже советник желателен. Вообщем, подтверждающий канальный индикатор и дивергенция по факту. Как это реализовать?

## Pammexpert — 2018-12-01 00:17

> Цитата (marattmb):
> Уважаемые специалисты! Нужна Ваша консультация. Реально ли реализовать мою идею в советник. На скриншоте дивергенция подтверждается канальным подвальным индикатором. Проблема в том, что стандартные индикаторы дивергенций не видят здесь дивергенцию на скриншоте, а она есть и подтверждается канальным подвальным индикатором, после чего можно смело входить в позицию. На больших таймфреймах советник не обязателен, и так увижу. А вот на таймфреймах H4 и ниже советник желателен. Вообщем, подтверждающий канальный индикатор и дивергенция по факту. Как это реализовать?

Вполне возможно. Но ... для начала нужно подремонтировать канальный индикатор. После компиляции со стриктом - он вообще перестает работать.

## marattmb — 2018-12-01 02:26

> Цитата (Pammexpert):
> Вполне возможно. Но ... для начала нужно подремонтировать канальный индикатор. После компиляции со стриктом - он вообще перестает работать.

Есть компилированный, у меня работает.

---

Следующая страница: https://forexsystemru.com/threads/77111/page-810
