FOTON
Иван

 
Уровень 11

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


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

Рейтинг 2146



РЕКОМЕНДУЮ



ручной сетка бот с общим б\у

:)  Приветствую!
Просьба написать советник с кнопочным стартом и автоматическим выставление общего б\у.
Тз:
-кнопки: «бай», «селл», «закрыть всё» расположены в левом нижнем углу мт4;
-выставление ордера бай по нажатию кнопки бай;
-выставление ордера селл по нажатию кнопки селл;
-закрытие всех ордеров по нажатию кнопки «закрыть всё»;
Логика процесса операций:
1.нажимаем кнопку бай(к примеру);
2.выставляется ордер, стоп + тейк по параметрам;
3.цена проходит в нужную сторону;
4.снова нажимаем бай(к примеру через 10п.);
5.при появлении второго ордера, советник автоматически выставляет б\у, общий на оба ордера;
6.параметр: уровень б\у(общий) к примеру 1пункт(регулируемый;
7.тейк-профит с обоих ордеров модифицируется от уровня общего б\у ордеров;
8.тейк-профит фиксирован что в параметрах, а при сетке, тейк модифицируется исчисляется расстоянием в п., от общего б\у;
Смысл советника:
-советник выставляет общий б\у на сетку ордеров отдельно по каждому направлению торговли.
т.е. отдельная логика общего б\у на ордера селл и отдельная логика по ордерам бай направления.
При выставлении далее последующих ордеров, при условии что цена продолжает движение в прибыль,
советник модифицирует общий б\у передвигая далее по мере выставления новых позиций.
Просьба, что бы работало в тестере стратегий и по реалу.

Думается данный бот будет многим полезен как помощник при торговле сеткой с быстрым выставлением общего б\у на выставленные ордера.
В процессе торговли иногда получается докупать или допродавать по ходу движения цены, а вот быстровыставить общий б\у на ордера что уже выставлены, происходит муторно, приходится каждый стоп и тейк переносить отдельно.
И вот есть идейка, как автоматизировать процесс что бы советник автоматически сам выставлял общий б\у на сетке ордеров и
автоматически модифицировал общий б\у далее по мере выставления новых ордеров.
:) Надеюсь Уважаемые программисты мысль тз донёс верно.
Заранее спасибо!
Скрин с мыслью…
  • +2
  • Просмотров: 3779
  • 1 ноября 2018, 04:51
  • FOTON
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Подобное решение есть как «скрипт».
Нам же хочется совместить с процессом выставления ордера и автоматизировать общий б\у сетки ордеров.
Так думается будет удобней.
<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '>&nbsp; '>&nbsp; '>&nbsp; Ну а уж если сложно что будет, то вот думается можно и просто вывести одну кнопку на экран «б\у».
т.е. кнопка «б\у» переводит все ордера (отдельно по позициям бай, селл) в общий б\у, отдельно общий б\у для селл ордеров и отдельно общий б\у для бай ордеров.
Редактирован: 1 ноября 2018, 05:04
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 1 ноября 2018, 04:55
+
0
код скрипта скиньте чтобы часть функций подсмотреть можно было :) 
на 8-е
avatar

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

  • 1 ноября 2018, 17:36
+
0
Советник выставляет тейк профит всем ордерам от точки их суммарного безубытка.
www.mql5.com/ru/code/19231
прикольная сова… тейк выставляется от б\у общего по всем ордерам одного направления и модифицируется по мере выставления новых ордеров одного направления.Это один из метода что надо применить в ТЗ.
Вот и подобное над бы сделать по выставлению б\у по мере выставления ордеров…
к примеру выставили 2-й, 3-й ордер по ходу движения цены,… и сова автоматом выставляет б\у общий по всем выставленным ордерам одного направления… и…
в случае обратного хода цены, ордера закроются по б\у.
Редактирован: 1 ноября 2018, 18:33
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 1 ноября 2018, 18:32
+
0
можно и к примеру, внести функцию в советник… к примеру: если выставляется 2-й и более ордеров, а первые ордера в прибыли, то советник выставляет б\у на общее количество присутствующих на паре ордеров… мона и так…
Редактирован: 1 ноября 2018, 18:43
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 1 ноября 2018, 18:42
+
0
вот подобное решение… НО! с ручным запуском б\у или трала…
www.mql5.com/ru/code/15391
панель тож прикольная, но требует внимательности и непосредственного участия трейдера для нажатия кнопки «трал» (б\у).:) 
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 1 ноября 2018, 18:48
+
0
в этой панельке есть реализация необходимого… но! она не работает в тестере стратегий и нет возможности потестировать ТС по истории.
При нажатии на клавишу «N» панелька выводит визуально на график цены уровень б\у общий по всем ордерам. При достижении определённого уровня прибыли, панелька автоматически выставит б\у общий на сетку всех ордеров. Так бы вроде всё ни чего, но в тестере не работает(  вот и заказываю вам чтоб такое подобное но что б работало в тестере.;) 
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 1 ноября 2018, 19:44
+
0
avatar

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

  • 8 ноября 2018, 20:06
комментарий был удален 2018-11-08 23:41:13 FOTON

комментарий был удален 2018-11-08 23:41:16 FOTON

+
0
1. Один ордер — бу не ставит



2. после достижения общего бу, модифицировали общий стоп и тейк. что не так?




//+------------------------------------------------------------------+
//|                                                        Foton.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 int StopLoss      = 300;      // лось
extern int TakeProfit    = 600;      // язь
extern int BULevel       = 150;      // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

double lot=Lots;
double stop=0,take=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PutButton("B",20,120,"BUY");
   PutButton("S",20,80,"SELL");
   PutButton("C",20,40,"CLOSE");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"B");
   ObjectDelete(0,"S");
   ObjectDelete(0,"C");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);

//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void AllBU()
  {
   bool mod;
   double allb=0,countb=0,alls=0,counts=0,sl=0,tp=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               allb+=OrderOpenPrice()*OrderLots();
               countb+=OrderLots();
              }
            if(OrderType()==1)
              {
               alls+=OrderOpenPrice()*OrderLots();
               counts+=OrderLots();
              }
           }
        }
     }

   if(countb>0) allb=NormalizeDouble(allb/countb,_Digits);
   if(counts>0) alls=NormalizeDouble(alls/counts,_Digits);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-allb>BULevel*_Point)
                 {
                  sl=NormalizeDouble(allb+BUPoint*Point,Digits);
                  if(OrderStopLoss()!=sl) mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,sl+TakeProfit*_Point,0,Yellow);
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(alls-Ask>BULevel*_Point)
                 {
                  sl=NormalizeDouble(alls-BUPoint*_Point,Digits);
                  if(OrderStopLoss()!=sl) mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,sl-TakeProfit*_Point,0,Yellow);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   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))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()>1) AllBU();

   if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
     {
      PutOrder(0,Ask);
      ObjectSetInteger(0,"B",OBJPROP_STATE,false);
     }

   if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
     {
      PutOrder(1,Bid);
      ObjectSetInteger(0,"S",OBJPROP_STATE,false);
     }

   if(OrdersTotal()>0 && ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
     {
      CloseAll();
      ObjectSetInteger(0,"C",OBJPROP_STATE,false);
     }

   Comment("Profit: ",(int)AllProfit());
  }
//+------------------------------------------------------------------+

avatar

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

  • 8 ноября 2018, 22:35
+
0
*good*  спасибки…
разобрался… всё работает:) 
прост в сове есть привязка по уровню б\у в параметрах. Ставлю 1:1 и всё работает.
Давно хотелось такую панельку.
Спасибо!
*hi* 
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 8 ноября 2018, 23:25
+
0
Андрей!, логика совы не нарушится, если в работе будет передвинут тейк и стоп при одном выставленном ордере?;) 
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 8 ноября 2018, 23:36
+
0
работает! спасибо;) 
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 9 ноября 2018, 00:21
+
0
привет) set файлом не поделишься?)
avatar

  9  maksGruv Сообщений: 340

  • 13 декабря 2018, 20:57
+
0
привет! та-а собственно параметры подбираете с учётом вашей ТС и ММ.
Бот, а вернее его алгоритм, протестирован по ТС на основе «импульс-откат-вход», на откате входим… пробивает лой, тут и выставляем ещё по направлению, и сразу же общий б\у… крутяк — иль б\у общий иль 2-а тралим далее, не бояся что развернёт;) 
Всё удачно получается, но, тока на ручном режиме. то что видит, понимает и принимает решение, то в советника ни как не пропишешь.
А руками оч муторно выставлять общий б\у., вот и заказал для удобства.
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 13 декабря 2018, 21:10
+
0
как вариант
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 13 декабря 2018, 21:19

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