ТС Green Red Candle

У Вас есть идея, под которую нужен торговый робот? А, быть может, требуется создание нового индикатора или адаптация старого к МТ5? Бесплатно советники и индикаторы под Ваше техническое задание!

ТС Green Red Candle

Сообщение Kalkin » 19 сен 2015, 12:03

piter1777 писал(а):На данном этапе всё работает :-ok-: Только не понял что значит параметр "номер сигнального бара" в разделе "Настройка сигнальных баров"?

Воспринимай это как сдвиг анализируемой пары баров.
1 - это анализ первого закрытого бара относительно 2-го (предыдущего по отношению к нему). 1-й бар будет для советника сигнальным, относительно него выставляются ордера и стопы. Но при большом желании можно анализировать не последний закрытый бар, а предпоследний. Сигнальным в таком случае будет бар номер 2.
Обычно в советниках я этот параметр вывожу в настройки. Если мешает - в следующей редакции бота уберу.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

ТС Green Red Candle

Сообщение piter1777 » 19 сен 2015, 13:14

Kalkin писал(а):Воспринимай это как сдвиг анализируемой пары баров.
1 - это анализ первого закрытого бара относительно 2-го (предыдущего по отношению к нему). 1-й бар будет для советника сигнальным, относительно него выставляются ордера и стопы. Но при большом желании можно анализировать не последний закрытый бар, а предпоследний. Сигнальным в таком случае будет бар номер 2.
Обычно в советниках я этот параметр вывожу в настройки. Если мешает - в следующей редакции бота уберу.


Не мешает, просто интересно было что за кнопка :-):

Уже, кстати, есть несколько плюсовых сетов для дневных графиков, но можно ровнее сделать, так что выложу после доработки :mi_ga_et:
Аватар пользователя
piter1777
 
Сообщений: 1218
Зарегистрирован: 07 май 2015, 10:02
Средств на руках: 128.10 Доллар
Награды: 1
Ветеран I (1)
Группа: Базовая
Благодарил (а): 310 раз.
Поблагодарили: 303 раз.

ТС Green Red Candle

Сообщение piter1777 » 19 сен 2015, 14:30

Я проверил все настройки. Проверял не сильно дотошно, однако на первый взгляд каждая настройка работает как и задумано. Разрабатывать и настраивать систему будем в этой ветке (post47861.html#p47861), что бы все кто хочет могли поучаствовать.
Аватар пользователя
piter1777
 
Сообщений: 1218
Зарегистрирован: 07 май 2015, 10:02
Средств на руках: 128.10 Доллар
Награды: 1
Ветеран I (1)
Группа: Базовая
Благодарил (а): 310 раз.
Поблагодарили: 303 раз.

ТС Green Red Candle

Сообщение Kalkin » 19 сен 2015, 15:17

Ok, тогда последний штрих: зачистка мусора в глобальных переменных. На работоспособность бота не влияет, но хорошие манеры ему привить обязаны :-):
Вложения
GreenRedCandle.mq4
(39.46 KB) Скачиваний: 25
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

ТС Green Red Candle

Сообщение Haos » 19 сен 2015, 16:33

Частичное закрытие лучше сразу ограничить коэф., который даст мин. лот и 1. Т.е. если пользователь задал 0 или меньше нуля вообще или 0,001 при и так небольшом лоте, то умножив первоначальный лот на коэф. я бы сравнил его с минимальным и если он меньше чем он, то просто закрыть минимальный объем... а то будут биться лбом о стенку и не смогут понять почему сделка не закрывается! :hi_hi_hi:
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

ТС Green Red Candle

Сообщение Kalkin » 19 сен 2015, 16:44

Haos писал(а):Частичное закрытие лучше сразу ограничить коэф., который даст мин. лот и 1. Т.е. если пользователь задал 0 или меньше нуля вообще или 0,001 при и так небольшом лоте, то умножив первоначальный лот на коэф. я бы сравнил его с минимальным и если он меньше чем он, то просто закрыть минимальный объем... а то будут биться лбом о стенку и не смогут понять почему сделка не закрывается! :hi_hi_hi:

Нет, так нельзя. Если минимальный лот будет больше, чем возможно по заданному коэффициенту закрытия, то нельзя обманывать клиента и закрывать больше, чем указано. Лучше пусть изучает мат.часть :hi_hi_hi:
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

ТС Green Red Candle

Сообщение Haos » 19 сен 2015, 18:27

Kalkin писал(а):Нет, так нельзя. Если минимальный лот будет больше, чем возможно по заданному коэффициенту закрытия, то нельзя обманывать клиента и закрывать больше, чем указано. Лучше пусть изучает мат.часть :hi_hi_hi:

Вот блин... случайно отредактировал сообщение! в общем писал что может быть ситуация, типа когда торговый лот
0,01 (и минимальный 0,01), а коэф. закрытия указал 0,99 тогда 0,01 * 0,99 = 0,099 меньше минимального! Формально нормалайз дабл должно округлить до 0,01, но хрен его знает! :hi_hi_hi:
А если даже не при минимальном лоте 0,02 например, задаст 0,9 для закрытия? Тогда останется объем меньше минимального лота? 0,02 - 0,018 = 0,002. И т. д.
Последний раз редактировалось Haos 19 сен 2015, 19:05, всего редактировалось 3 раз(а).
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

ТС Green Red Candle

Сообщение Haos » 19 сен 2015, 18:40

По-нормальному я бы все это в отдельную функцию вынес - проверка получившегося размера лота после преобразования от умножения на коэффициент.
Код: выделить все
void f_ClosePositions(string sy, int op, double kl, int mn, int si)
{
/*
   Описание : Закрытие позиций по рыночной цене 
   Сторонних ресурсов не использует!!!                           
   Параметры:                                                               
   sy - наименование инструмента   (""   - любой символ,                   
                                   "0" - текущий символ)                 
   op - операция                   (-1   - любая позиция)                 
   kl - часть от объема позиции, которую надо закрыть (0,01 - 1,0)
   mn - MagicNumber                (-1   - любой магик)   
   si - проскальзывание (slippage) (пнт.)               
*/   
   int      int_Try     = 5;              // Количество торговых попыток
   bool     bol_Sou     = true;           // Использовать звуковой сигнал
   string   str_Suc     = "ok.wav";       // Звук успеха
   string   str_Err     = "timeout.wav";  // Звук ошибки
   bool     bol_Sin     = false;          // Использовать значок закрытия сделки?   
   color    clClose     = clrNONE,
            clCloseBuy  = Blue,           // Цвет значка закрытия покупки
            clCloseSell = Red;            // Цвет значка закрытия продажи
   bool     bol_Clo;                      // Сработала ли ф-ия OrderClose
   double   dbl_Ask,
            dbl_Bid;
   double   k,
            dbl_Lot,
            pp;

   if(sy == "0") sy = Symbol();
   int int_Dig  = (int) MarketInfo(sy, MODE_DIGITS);
   double dbl_LotStep = MarketInfo(sy, MODE_LOTSTEP);
   double dbl_LotMin = MarketInfo(sy, MODE_MINLOT);
   double dbl_LotMax = MarketInfo(sy, MODE_MAXLOT);
 
   for(int i = OrdersTotal() - 1; i >= 0; 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)
               {
                  for(int j = 1; j <= int_Try; j++)
                  {
                     if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
                     {
                        Print("f_ClosePositions(): Остановка работы функции");
                        break;
                     }
                     while(!IsTradeAllowed()) Sleep(5000);
                     RefreshRates();
                     if(OrderType() == OP_BUY)
                     {
                        dbl_Bid  = MarketInfo(sy, MODE_BID);
                        pp = dbl_Bid;
                        if(bol_Sin) clClose = clCloseSell;
                     }
                     else
                     {
                        dbl_Ask  = MarketInfo(sy, MODE_ASK);
                        pp = dbl_Ask;
                        if(bol_Sin) clClose = clCloseBuy;
                     }
                     //-----Пересчет величины объема сделки для закрытия:---------------
                     if(dbl_LotMin == 0) dbl_LotMin = 0.1;
                     if(dbl_LotMax == 0) dbl_LotMax = 100;
                     if(kl > 1) kl = 1;
                     else if(kl < 0.01) kl = 0.01;
                     dbl_Lot = kl * OrderLots();
                     if(dbl_LotStep > 0) k = 1 / dbl_LotStep; else k = 1 / dbl_LotMin;
                     dbl_Lot = MathFloor(dbl_Lot * k) / k;
                     if(dbl_Lot < dbl_LotMin) dbl_Lot = dbl_LotMin;
                     if(dbl_Lot > dbl_LotMax) dbl_Lot = dbl_LotMax;
                     //------------------------------------------------------------------
                     pp = NormalizeDouble(pp, int_Dig);
                     bol_Clo = OrderClose(OrderTicket(), dbl_Lot, pp, si, clClose);
                     if(bol_Clo)
                     {
                        if(bol_Sou) PlaySound(str_Suc);
                        Print("Функция закрытия позиций успешно выполнена");
                        break;
                     }
                     else
                     {
                        if(bol_Sou) PlaySound(str_Err);
                        Print("Функция закрытия позиций завершилась с ошибкой #", GetLastError());
                     }
                  }
               }
            }
         }
      }
   }
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

ТС Green Red Candle

Сообщение Kalkin » 19 сен 2015, 19:52

Haos писал(а):По-нормальному я бы все это в отдельную функцию вынес - проверка получившегося размера лота после преобразования от умножения на коэффициент.
Код: выделить все
void f_ClosePositions(string sy, int op, double kl, int mn, int si)
{
/*
   Описание : Закрытие позиций по рыночной цене 
   Сторонних ресурсов не использует!!!                           
   Параметры:                                                               
   sy - наименование инструмента   (""   - любой символ,                   
                                   "0" - текущий символ)                 
   op - операция                   (-1   - любая позиция)                 
   kl - часть от объема позиции, которую надо закрыть (0,01 - 1,0)
   mn - MagicNumber                (-1   - любой магик)   
   si - проскальзывание (slippage) (пнт.)               
*/   
   int      int_Try     = 5;              // Количество торговых попыток
   bool     bol_Sou     = true;           // Использовать звуковой сигнал
   string   str_Suc     = "ok.wav";       // Звук успеха
   string   str_Err     = "timeout.wav";  // Звук ошибки
   bool     bol_Sin     = false;          // Использовать значок закрытия сделки?   
   color    clClose     = clrNONE,
            clCloseBuy  = Blue,           // Цвет значка закрытия покупки
            clCloseSell = Red;            // Цвет значка закрытия продажи
   bool     bol_Clo;                      // Сработала ли ф-ия OrderClose
   double   dbl_Ask,
            dbl_Bid;
   double   k,
            dbl_Lot,
            pp;

   if(sy == "0") sy = Symbol();
   int int_Dig  = (int) MarketInfo(sy, MODE_DIGITS);
   double dbl_LotStep = MarketInfo(sy, MODE_LOTSTEP);
   double dbl_LotMin = MarketInfo(sy, MODE_MINLOT);
   double dbl_LotMax = MarketInfo(sy, MODE_MAXLOT);
 
   for(int i = OrdersTotal() - 1; i >= 0; 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)
               {
                  for(int j = 1; j <= int_Try; j++)
                  {
                     if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
                     {
                        Print("f_ClosePositions(): Остановка работы функции");
                        break;
                     }
                     while(!IsTradeAllowed()) Sleep(5000);
                     RefreshRates();
                     if(OrderType() == OP_BUY)
                     {
                        dbl_Bid  = MarketInfo(sy, MODE_BID);
                        pp = dbl_Bid;
                        if(bol_Sin) clClose = clCloseSell;
                     }
                     else
                     {
                        dbl_Ask  = MarketInfo(sy, MODE_ASK);
                        pp = dbl_Ask;
                        if(bol_Sin) clClose = clCloseBuy;
                     }
                     //-----Пересчет величины объема сделки для закрытия:---------------
                     if(dbl_LotMin == 0) dbl_LotMin = 0.1;
                     if(dbl_LotMax == 0) dbl_LotMax = 100;
                     if(kl > 1) kl = 1;
                     else if(kl < 0.01) kl = 0.01;
                     dbl_Lot = kl * OrderLots();
                     if(dbl_LotStep > 0) k = 1 / dbl_LotStep; else k = 1 / dbl_LotMin;
                     dbl_Lot = MathFloor(dbl_Lot * k) / k;
                     if(dbl_Lot < dbl_LotMin) dbl_Lot = dbl_LotMin;
                     if(dbl_Lot > dbl_LotMax) dbl_Lot = dbl_LotMax;
                     //------------------------------------------------------------------
                     pp = NormalizeDouble(pp, int_Dig);
                     bol_Clo = OrderClose(OrderTicket(), dbl_Lot, pp, si, clClose);
                     if(bol_Clo)
                     {
                        if(bol_Sou) PlaySound(str_Suc);
                        Print("Функция закрытия позиций успешно выполнена");
                        break;
                     }
                     else
                     {
                        if(bol_Sou) PlaySound(str_Err);
                        Print("Функция закрытия позиций завершилась с ошибкой #", GetLastError());
                     }
                  }
               }
            }
         }
      }
   }
}


Круто... Да, всё понятно, спасибо. Ещё бы добавить анализ ошибок исполнения - и можно использовать.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

ТС Green Red Candle

Сообщение Haos » 19 сен 2015, 20:01

Да, я пользовался давно написанными, но они устарели. Видел у тебя есть обработка ошибок. Это "современный вариант"?
... обрати внимание на юморок с возможностью отключения звука и значков. Столкнулся с тем, что заказчики просили вырубить звук ("а то по мозгам бьет"), а я терпеть не могу значки, захламляющие график при открытии-закрытии сделок. Пришлось добавить такие фичи. :-)
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в Торговые советники на заказ

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 835

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron