andre71g
andre71g

 
Уровень 11

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


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

Рейтинг 2081



РЕКОМЕНДУЮ



Модификатор тейка

Просьба написать простейший, но очень полезный советник — модификатор тейка для сетки лимитных ордеров.

Настройки советника:
магик-0
реквот-30

Трейдер выставляет сетку лимиток (например селл) и тейков к ним.Открывается первый ордер селл.Советник ждёт открытия второго селла и когда открывается второй ордер, тейки обоих ордеров ставятся по тейку второго ордера. Открывается третий ордер — тейки 1 и 2 ордеров передвигаются на уровень тейка 3го ордера и т.д. То есть, при открытии очередного ордера тейки всех уже открытых ордеров этого направления выставляются на уровень тейка вновь открывшегося ордера.
Для баев советник модифицирует тейки отдельно.
На скрине стрелками показано, что при открытии вторых ордеров тейки первых передвигаются на уровни тейков вторых ордеров.
  • 0
  • Просмотров: 1861
  • 14 декабря 2020, 17:58
  • andre71g
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
сейчас буду смотреть
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 14 декабря 2020, 20:07
+
0
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 14 декабря 2020, 20:32
+
0
Спасибо за оперативность, но это совсем другой советник!
Он выставляет лимитки, при открытии первого ордера выставляет указанный в настройках ТП, при открытии второго ордера советник советник выставляет тот же тейк от уровня безубытка и т.д.
Кстати, этот вариант тоже пригодится для сеточной торговли.
Я же хотел, чтобы при, например таких настройках робота:



я мог бы выставить кнопками, например 2 селлимит на любом расстоянии друг от друга и для каждого выставить свой уровень тейка(прямо на графике). Открылся первый ордер — ничего не происходит. Открылся второй ордер — уровень тейка первого робот перемещает на уровень тейка второго ордера.На языке робота это можно озвучить так: при открытии очередного ордера тейкпрофит всех открытых ордеров устанавливается по самому высшему на графике(для селл) и по самому нижнему на графике(для бай).Если для какой-то лимитки трейдер не стал выставлять тейк, или забыл, то уровень тейка при открытии этого ордера остаётся прежним.
Редактирован: 15 декабря 2020, 08:40
avatar

  11  andre71g Автор Сообщений: 168 - andre71g

  • 15 декабря 2020, 08:35
+
0
здесь нужно будет писать функции поиска самого нижнего села и самого верхнего бая и брать у них тейк. посмотрю еще сегодня
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 15 декабря 2020, 17:40
+
0
готово:




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

//--- Inputs
extern double Lot        = 0.1;      // лот позы
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 150;      // язь
extern int Delta         = 300;      // расстояние от цены
extern int Step          = 200;      // шаг
extern int Count         = 5;        // число ордеров
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PutButton("B",100,160,"BUY LIMIT");
   PutButton("S",100,120,"SELL LIMIT");
   PutButton("C",100,80,"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,3);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
//--- установим цвет текста
   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 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 LastTake()
  {
   double pr=0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
              {
               pr=OrderTakeProfit();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   bool m=1;
   double tp=NormalizeDouble(LastTake(),Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {            
            if(OrderTakeProfit()!=tp && OrderType()<2)
              {
               m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   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 || type==-1)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()>1)
      ModifyOrders();

   if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
     {
      for(int i=0; i<Count; i++)
         PutOrder(2,Bid-Delta*_Point-Step*_Point*i);
      ObjectSetInteger(0,"B",OBJPROP_STATE,0);
     }

   if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
     {
      for(int i=0; i<Count; i++)
         PutOrder(3,Bid+Delta*_Point+Step*_Point*i);
      ObjectSetInteger(0,"S",OBJPROP_STATE,0);
     }

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

   Comment(LastTake());
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+


Редактирован: 15 декабря 2020, 21:40
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 15 декабря 2020, 18:20

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