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

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

---

## marattmb — 2018-11-19 02:59

Уважаемые специалисты!  Нельзя ли модифицировать данный индикатор. Данный индикатор я использую для парного трейдинга. В параметрах прописываются два инструмента. А нельзя ли модифицировать его для использования в треугольнике. Например EUR USD,  GBPUSD, EURGBP   или какой-либо другой треугольник, вписав в параметры названия инструментов.

## MrGreen86 — 2018-11-19 12:37

> Цитата (mobidik):
> Подключить библиотеку WinUser32 в начале кода:
> #include <WinUser32.mqh>
> Прописать следующую функцию:
> 
> //+------------------------------------------------------------------+
> //| Break Point                                                      |
> //+------------------------------------------------------------------+
> void BreakPoint()
>   {
>     if(!IsVisualMode()) return;
>
>     keybd_event(19,0,0,0);
>     Sleep(20);
>     keybd_event(19,0,2,0);
>   }
> Данную ф-цию вызывать по условию просадки:
> if(условие определения просадки)  BreakPoint();
> Теперь, при работе в тестере **в режиме визуализации**, как только просадка достигнет заданного значения - будет нажатие на кнопку паузы (нажатие длительностью в 20 мсек. и отпустили). Для продолжения тестирования необходимо будет вручную нажать на кнопку "Старт/пауза" в тестере. При оптимизации данная функция выполняться не будет, работает только при визуализации.

Хотелось бы но нет ) Sleep в тестере не вызывает задержек.

## MrGreen86 — 2018-11-19 13:20

> Цитата (wintrades):
> Как понимаю, необходимо вставить этот код, чтобы тестирование приостанавливалось на паузу при заданном уровне просадки в валюте депозита?
> Но какой параметр вывести в настройки? и что написать вместо слов "условие определения просадки"? как в коде обозначается максимальная просадка в валюте депозита?

1) Для начала определимся с настройками, сделаем вариант в деньгах или в процентах. вот этот кусок кода вставь в самое начало. И есть опция в которой задается пауза в секундах. Также этот кусок кода содержит 2 глобальные переменные которые нам потребуются в дальнейшем.
enum ENUM_DD_TYPE{
   money = 0,
   percent = 1
   };

input ENUM_DD_TYPE   drow_down_type    = money;
input double         drow_down_money   = 500;
input double         drow_down_percent = 15;

input int            paused_seconds    = 20;

double max_equity;
bool   drow_down_flag = false;

В первой настройке ты выбираешь какая просадка тебе нужна, во вторых двух опциях вводишь значение для выбранного варианта.

2) теперь разберемся с функцией паузы, вставь ее в конец кода для удобства.
void Paused() {
   uint start_time = GetTickCount();
   while(GetTickCount() - start_time < (uint)(paused_seconds*1000)) {
      int seconds_left = MathFloor((start_time + paused_seconds*1000 - GetTickCount()) / 1000); 
      Comment("Paused seconds left: ",(string)seconds_left);
      }
   Comment("");
   }

3) Теперь нужно поймать просадку. 
Вставить текущий код в функцию start() или OnTick() (смотря какая будет в советнике, будет только одна из них, по сути они одинаковые).

Варианта на скидку я вижу 2:
А) по открытым позициям, подходит для сеток чтобы просадка считалась именно по текущей сетке.
   double current_drow_down = 0;
   for(int dd = OrdersTotal()-1;dd>=0;dd--) if(OrderSelect(dd,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==magic) {
      current_drow_down += OrderProfit()+OrderSwap()+OrderCommission();
      }
   if(!drow_down_flag) {
      if(drow_down_type == money && current_drow_down<=-drow_down_money) {
         drow_down_flag = true;
         Paused();
         }
      if(drow_down_percent == percent && current_drow_down <= - AccountBalance()*(drow_down_percent/100.0)) {
         drow_down_flag = true;
         Paused();
         }
      }
   if(drow_down_flag && current_drow_down>=0) drow_down_flag = false;

Б) Вариант просадки от баланса, подойдет для позиционной торговли, тоже довольно простой вариант:
   if(!drow_down_flag) {
      if(drow_down_type == money && AccountBalance() - AccountEquity() >= drow_down_money) {
         drow_down_flag = true;
         Paused();
         }
      if(drow_down_type == percent && AccountBalance() - AccountEquity() <= - AccountBalance()*(drow_down_percent/100.0)) {
         drow_down_flag = true;
         Paused();
         }
      }
   if(drow_down_flag && AccountEquity() >= AccountBalance()) drow_down_flag = true;

Как можешь обратить внимание, присутсвует флаг drow_down_flag. Он помечает что просадка была достигнута чтобы на следующем тике при сохранении просадки снова не была вызвана пауза, так как это приведет к бесконечной паузе. Флаг в данных вариантах обнулится когда будет хотя бы минимальная прибыль, или все позиции будут закрыты. 

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

## sampath kuppuswamy — 2018-11-19 14:41

Hi programmers

Can some one please replace the Price Action line (Green) in the TDI indicator with the StochRSI attached.

Thanks

## tulqin — 2018-11-19 18:18

Здравствуйте товарищи программисты.кто может ренж барах не работает это индикатор UTPOW

## wintrades — 2018-11-19 20:34

Благодарю, сделал! Но, как вижу, после достижения заданного уровня просадки - тестирование приостанавливается на время, а потом само опять продолжается... Но как сделать так - чтобы тестирование приостанавливалось на паузу (включалась пауза), и тестирование продолжалось бы только после того, как я отожму кнопку паузы?
Также еще один нюанс - после уменьшения просадки до заданного уровня также тестирование приостанавливается (а необходимо чтобы по данной серии ордеров уже больше пауза на просадке не срабатывала, а то пока просадка колеблется туда-сюда вокруг заданного уровня - все время тестирование приостанавливается).

## Nazan — 2018-11-19 20:45

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

## cmillion — 2018-11-19 21:20

**cm_ea_Parabolic**

> Цитата (Nazan):
> здравствуйте. подскажите где найти советника по параболику без всяких наворотов, только открытие по стандартным сигналам( точка сверху сел, точка снизу бай)

Из наворотов здесь только стоплосс и тейкпрофит. Но если установите их = 0 то они отключены. На обратном сигнале позиция закрывается и открывается противоположная.

extern int     Stoploss    = 0,
               Takeprofit  = 0;     
extern double  Lot         = 0.1;

extern double  Step        = 0.02;  //параметр Parabolic Step
extern double  Maximum     = 0.2;   //параметр Parabolic Maximum

extern int     Magic       = 123,   //уникальный номер ордеров этого советника, если 0 то ведет все ордера, в том числе выставленные вручную
               slippage    = 3;     //Максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------

 Обращайтесь, если нужно будет что то добавить....

## Nazan — 2018-11-19 21:31

спасибо.а без закрытия на обратном сигнале есть?

## Sergey BAwenko — 2018-11-19 22:08

Здравствуйте УВАЖАЕМЫЕ ПРОГРАММИСТЫ прошу вашей помощи подправить данный советник.
 
1.Открытие ордеров автоматически. 
2.При достижении + открывает ордер в туже сторону с начальным лотом.
3.При достижении -  переворачивает ордер (открывает ордер в сторону в которую был получен - ).

## cmillion — 2018-11-19 22:15

> Цитата (Sergey BAwenko):
> Здравствуйте УВАЖАЕМЫЕ ПРОГРАММИСТЫ прошу вашей помощи подправить данный советник.
>
> 1.Открытие ордеров автоматически.
> 2.При достижении + открывает ордер в туже сторону с начальным лотом.
> 3.При достижении -  переворачивает ордер (открывает ордер в сторону в которую был получен - ).

[В ветка этого советника](https://forexsystemsru.com/sovetniki-eksperty-foreks-roboty/39772-sovetnik-nevalyashka_breakdownlevel.html) я уже писал такие модификации. Не пробовали поискать?
Не смотрел, что Вы выложили, но советник именно так изначально и должен работать :)
Во всяком случае я его так изначально и задумывал. И именно так он и торговал в первых версиях.

## Sergey BAwenko — 2018-11-19 22:31

> Цитата (cmillion):
> [В ветка этого советника](https://forexsystemsru.com/sovetniki-eksperty-foreks-roboty/39772-sovetnik-nevalyashka_breakdownlevel.html) я уже писал такие модификации. Не пробовали поискать?
> Не смотрел, что Вы выложили, но советник именно так изначально и должен работать :)
> Во всяком случае я его так изначально и задумывал. И именно так он и торговал в первых версиях.

 
смотрел, такого нету, там есть где при достижении + или - он переворачиваеться

## cmillion — 2018-11-19 22:32

> Цитата (Bullra):
> Просьба добавить в индикатор функцию StartDate, чтобы сигу можно было курить от определенной даты и расчеты не сбивались с каждой новой свечкой.

Я может не в теме?
Что такое "курить сигу"?

## MrGreen86 — 2018-11-19 22:44

> Цитата (wintrades):
> Благодарю, сделал! Но, как вижу, после достижения заданного уровня просадки - тестирование приостанавливается на время, а потом само опять продолжается... Но как сделать так - чтобы тестирование приостанавливалось на паузу (включалась пауза), и тестирование продолжалось бы только после того, как я отожму кнопку паузы?
> Также еще один нюанс - после уменьшения просадки до заданного уровня также тестирование приостанавливается (а необходимо чтобы по данной серии ордеров уже больше пауза на просадке не срабатывала, а то пока просадка колеблется туда-сюда вокруг заданного уровня - все время тестирование приостанавливается).

1) функцию Paused() заменить на эту:
void Paused() {
   Comment("start");
   ObjectCreate(0,"paused",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"paused",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"paused",OBJPROP_YDISTANCE,40);
   ObjectSetInteger(0,"paused",OBJPROP_XSIZE,100);
   ObjectSetInteger(0,"paused",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"paused",OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
   ObjectSetInteger(0,"paused",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"paused",OBJPROP_FONTSIZE,12);
   ObjectSetString(0,"paused",OBJPROP_FONT,"Verdana");
   ObjectSetString(0,"paused",OBJPROP_TEXT,"Play");
   ObjectSetInteger(0,"paused",OBJPROP_COLOR,clrWhite);
   ObjectSetInteger(0,"paused",OBJPROP_BGCOLOR,clrGreen);
   ObjectSetInteger(0,"paused",OBJPROP_STATE,false);
   while(!ObjectGetInteger(0,"paused",OBJPROP_STATE)) {
      continue;
      }
   ObjectDelete(0,"paused");
   Comment("end");
   } 

2) Вместе с флагом запоминать тикет одного из открытых ордеров и каждый тик проверять не закрылся ли этот ордер. если закрылся - снимать флаг. если не закрылся не снимать.
и соответсвенно часть которая отвечала за отмену флага при 0 прибыли убрать.

## Bullra — 2018-11-19 22:56

> Цитата (cmillion):
> Я может не в теме?
> Что такое "курить сигу"?

Сига - это сигмоид. Курить сигу - значит наблюдать. ;) В индикаторе сига рассчитывается по количеству точек (баров). Следственно с каждым новым баром нужно вручную добавлять в расчет новый бар. В принципе можно курить и так, но было бы веселее, если бы расчет сиги можно было менять прямо с графика или функцией StartDate. :)

## FOTINI — 2018-11-19 23:42

Добрый вечер!
Пожалуйста,если возможно уменьшить размер файла, после компиляции он вот такого размера стал...А индюк замечательный и нужный...
Спасибо.

## wintrades — 2018-11-20 00:33

> Цитата (MrGreen86):
> 1) функцию Paused() заменить на эту:
> PHP код:
> void Paused() {
>    Comment("start");
>    ObjectCreate(0,"paused",OBJ_BUTTON,0,0,0);
>    ObjectSetInteger(0,"paused",OBJPROP_XDISTANCE,20);
>    ObjectSetInteger(0,"paused",OBJPROP_YDISTANCE,40);
>    ObjectSetInteger(0,"paused",OBJPROP_XSIZE,100);
>    ObjectSetInteger(0,"paused",OBJPROP_YSIZE,20);
>    ObjectSetInteger(0,"paused",OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
>    ObjectSetInteger(0,"paused",OBJPROP_CORNER,CORNER_LEFT_LOWER);
>    ObjectSetInteger(0,"paused",OBJPROP_FONTSIZE,12);
>    ObjectSetString(0,"paused",OBJPROP_FONT,"Verdana");
>    ObjectSetString(0,"paused",OBJPROP_TEXT,"Play");
>    ObjectSetInteger(0,"paused",OBJPROP_COLOR,clrWhite);
>    ObjectSetInteger(0,"paused",OBJPROP_BGCOLOR,clrGreen);
>    ObjectSetInteger(0,"paused",OBJPROP_STATE,false);
>    while(!ObjectGetInteger(0,"paused",OBJPROP_STATE)) {
>       continue;
>       }
>    ObjectDelete(0,"paused");
>    Comment("end");
>    }
> 2) Вместе с флагом запоминать тикет одного из открытых ордеров и каждый тик проверять не закрылся ли этот ордер. если закрылся - снимать флаг. если не закрылся не снимать.
> и соответсвенно часть которая отвечала за отмену флага при 0 прибыли убрать.

Благодарю, функцию заменил! Как вижу, прекрасно срабатывает. Кнопочка play - супер, очень удобно и наглядно.
Касательно избежания повторов паузы при повторении этой же просадки в одной и той же серии ордеров по сетке - не совсем понял, но это не критично. Еще раз благодарю.

## Sergey BAwenko — 2018-11-20 06:47

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

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

                          :please:

## sampath kuppuswamy — 2018-11-20 08:48

**Indicator modification**

Hello Programmers,

Please replace the Price action line (Green) in the TDI indicator with the Stoch RSI indicator. 

Thanks

## Sanz — 2018-11-20 20:13

Привет друзья, я хотел бы знать, что это за индикатор и версия mql4, перерисовать?
Благодарю вас

---

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