Vadim710

 
Уровень 13

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2152



РЕКОМЕНДУЮ



советник по барного анализа

Всем Профита!

Уважаемые программисты! Прошу написать мультивалютный советник по барного анализа. Пусть имя ему будет «Bar-scalper»

Логика работы:
Советник анализирует закрытый бар и выставляет стоповые + лимитные ордера сразу после открытия нового.
Торговля ведется временем одного бара, после чего закрываются все позы, анализируется закрытый бар и если он проходит по фильтру, то открытие новых стоп и лимит ордеров. И так по кругу.

Цель: 10-20 пп от движения + 10-20 пп на откате в текущем баре

Фильтр:
В расчет берется бар если разница значений open и close больше n пунктов ( n – в настройки), минуем флет.
Советник не открывает ордера если разница между close закрытого бара и open открытого бара больше n пунктов ( n – в настройки), минуем геп.

Если закрытый бар соответствует параметрам, то выставляются стоп-ордера на n пунктов от open и close закрытого бара, плюс лимитные ордера от open и close на W+n пунктов.

Если закрылся бар вверх, то от open sell-stop, от close bay-stop на n- пунктов (n- в настройки)
Если закрылся бар вниз, то от open bay-stop, от close sell-stop на n- пунктов (n- в настройки)

После срабатывания одного стоп-ордера, второй стоп удаляется и удаляется его лимитник.
Если стоп-ордер закрылся по тейку,
лимитный ордер остается висеть до закрытия бара. Не отработал – удаляется.

Если позиция закрылась в минус или по stop-loss, следующие стоп-ордера выставляются с умножением по мартину (в настройки ).
Если закрылась поза в плюс, после умножения, возврат к первоначальному лоту.

Блок лимитных ордеров рассчитан на откат внутри бара вкл/выкл:

Расчет лимитных ордеров идет по следующей формуле:
Пусть High-Open=x; Close -Low =y (значение на один бар),
тогда сумма значений Х или У анализируемых баров истории, разделенная на количество этих анализируемых баров,
даст среднее значение W между High-Open или значение Q между Close-Low проанализированных баров:
(х + х + х + х +……):4…= W; (у + у + у + у +…):4…= Q

Количество анализируемых баров для значений W и Q, в настройки

Бар вверх:
Bay-limit выставляется от Close на Q+n — пунктов (n- в настройки)
Sell-limit выставляется от Open на W+n- пунктов (n- в настройки)

Бар вниз:
Bay-limit выставляется от Open на Q+n — пунктов (n- в настройки)
Sell-limit выставляется от Close на W+n- пунктов (n- в настройки)

Lot, StopLoss, TakeProfit и Trall для лимитных ордеров отдельно.

Если Т/З очень объемное, то, пожалуйста, без лимитных ордеров. Тогда в следующем т/з буду просить дополнить.
Если нужны скрины, разъясняющие что либо, нарисую.
За ранее благодарю всех принявших участие
  • 0
  • Просмотров: 3008
  • 10 декабря 2018, 17:29
  • Vadim710
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Советник 5patterns
09 декабря 2018
11 декабря 2018

Брокер для ваших роботов, 15 лет на рынке

Комментарии (14)

+
0
за одновалютную версию я еще могу взяться
avatar

  35  AM2 Сообщений: 16428 - Андрей

  • 11 декабря 2018, 22:59
+
0
отлично, тогда EURUSD. Спасибо!
avatar

  13  Vadim710 Автор Сообщений: 37

  • 11 декабря 2018, 23:58
+
0
для стоповых сделал: www.opentraders.ru/downloads/2192/

avatar

  35  AM2 Сообщений: 16428 - Андрей

  • 15 декабря 2018, 03:51
+
0
Спасибо!
avatar

  13  Vadim710 Автор Сообщений: 37

  • 15 декабря 2018, 07:40
+
0
на D1
-советник не удаляет селл-стоп при срабатывании бай-стоп. Продолжает открывать и закрывать селл-стоп на текущем баре(4016 ордера было вкл/выкл).
-при срабатывании бай-стоп и закрытии бай по тейку, советник держит селл-стоп на текущем баре (должен удаляться), и так же для селл-стоп ордера
-бар закрылся вверх: советник выставляет по настройкам селл-стоп, а бай-стоп выставляет когда цена прошла вверх на n-пунктов, развернулась, цепанула открытие бара и только тогда советник открывает бай-стоп(возможный тейк потерян)
-при срабатывании тейка по сел-стоп, советник на текущем баре выставляет еще селл (такого не должно быть)

Андрей, исправьте пожалуйста по т/з. Спасибо
… за 3 неполных дня теста по всем тикам, было открыто-закрыто 6220 ордера
avatar

  13  Vadim710 Автор Сообщений: 37

  • 16 декабря 2018, 17:43
+
0
сделайте пошагово на скринах
avatar

  35  AM2 Сообщений: 16428 - Андрей

  • 16 декабря 2018, 22:18
+
0


avatar

  13  Vadim710 Автор Сообщений: 37

  • 17 декабря 2018, 00:17
+
0
советник не удаляет селл-стоп при срабатывании бай-стоп. Продолжает открывать и закрывать селл-стоп на текущем баре(4016 ордера было вкл/выкл).


бай стоп сработал, селл стоп удалил, новых не открывает:



новые откроет только когда выполнится условие:



ордера живут только в течение свечи:



www.opentraders.ru/downloads/2192/
avatar

  35  AM2 Сообщений: 16428 - Андрей

  • 17 декабря 2018, 21:07
+
0
почему тогда открыто 6220 ордеров?
… как я понимаю, на одну свечу должно быть открыто 2 стоповых ордера, потом один удалиться и остаться ордер бай или сел, и потом закрыться и этот( или в конце жизни свечи или по ТР);

Т.е., в результатах тестера должно быть всего 4 записи на одну свечу:
Baystop
Sellstop
Delet (Baystop или Sellstop)
TP (или Delet)
(а сейчас советник на каждом тике открывает-закрывает стоп ордера)




Редактирован: 17 декабря 2018, 23:40
avatar

  13  Vadim710 Автор Сообщений: 37

  • 17 декабря 2018, 23:39
+
0
datatime, надо добавить, чтобы свечи контролировал, не открывался каждый тик.
Редактирован: 18 декабря 2018, 13:45
avatar

  16  cerber04 Сообщений: 409

  • 18 декабря 2018, 13:45
+
0
Андрей, поправьте, пожалуйста, робота
avatar

  13  Vadim710 Автор Сообщений: 37

  • 20 декабря 2018, 09:22
+
0
в базе обновленный вариант. проверьте еще у себя.
avatar

  35  AM2 Сообщений: 16428 - Андрей

  • 20 декабря 2018, 17:53
+
0
может не обновился. еще сюда скинул код:


//+------------------------------------------------------------------+
//|                                                       ProBoy.mq4 |
//|                                              Copyright 2018, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 2;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 20;       // язь
extern int Max           = 1500;     // максимальный размах свечи
extern int Min           = 300;      // минимальный размах свечи
extern int Delta         = 50;       // расстояние от цены для стоповых
extern int Slip          = 0;        // реквот
extern int Shift         = 1;        // на каком баре сигнал 
extern int Magic         = 123;      // магик

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderProfit()>0) break;
            if(OrderProfit()<0)
              {
               lot=OrderLots()*KLot;
               break;
              }
           }
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta=Close[1]-Open[1];

   if(CountTrades()>0) DelOrder();


   if(t!=Time[0])
     {
      DelOrder();
      CloseAll();
      
      if(MathAbs(delta)>Min*_Point && MathAbs(delta)<Max*_Point)
        {
         if(delta>0)
           {
            if(CountOrders(4)<1 && Bid<Close[1]+Delta*_Point) PutOrder(4,Close[1]+Delta*_Point);
            if(CountOrders(5)<1 && Bid>Open[1]-Delta*_Point) PutOrder(5,Open[1]-Delta*_Point);
           }
         if(delta<0)
           {
            if(CountOrders(4)<1 && Bid<Open[1]+Delta*_Point) PutOrder(4,Open[1]+Delta*_Point);
            if(CountOrders(5)<1 && Bid>Close[1]-Delta*_Point) PutOrder(5,Close[1]-Delta*_Point);
           }
        }
      t=Time[0];
     }

   Comment("\n Delta: ",delta/_Point);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16428 - Андрей

  • 20 декабря 2018, 17:52
+
0
Андрей, спасибо! Буду тестить.
avatar

  13  Vadim710 Автор Сообщений: 37

  • 20 декабря 2018, 22:57

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий