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

Рейтинг 1165



РЕКОМЕНДУЮ



Здравствуйте. Сделайте пожалуйста советник по индикатору Pivot Points для MT4 пять знаков.

Тех. Задание. Советник Pivot Points
Советник работает по индикатору Pivot Points.PivotPoints.rar (36 Kb) На открытие дня (время регулируется) советник выставляет отложенный ордер Buy Limit или Sell Limit.

Ордер на покупку: На открытии дня, если цена выше уровня Pivot Points на N – расстояние True/False, то на уровне Pivot Points выставляется три отложенных ордера одного лота Buy Limit (количество ордеров регулируется от 1 до 3).
Если в функциях советника тейк профит выставить =0, то по умолчанию советник выставляет
Тейк профит первого ордера на уровне сопротивление R1
Тейк профит второго ордера на уровне сопротивление R2
Тейк профит третьего ордера на уровне сопротивление R3

Если в функциях советника тейк профит указать не ноль, а указать цену, то профит выставляется по цене.
Если в функциях советника стоп лосс указать =0, то по умолчанию советник выставляет стоп лосс всех ордеров или одного ордера за уровень ЛОУ предыдущего дня с возможностью отступа N –расстояние.

Если в функциях советника стоп лосс указать не ноль, а указать цену, то стоп лосс выставляется по цене.
Без убыток: Если в функциях советника без убыток выставить=0, то по умолчанию советник выставляет без убыток, как только цена дошла до первого уровня сопротивления R1 и первый ордер закрылся по тейк профиту два оставшихся переводятся в без убыток на N-расстояние.
Если в функциях советника без убыток указать не ноль, а указать расстояние в пунктах, то без убыток выставляется по пунктам.
Трелинг стоп.

Ордер на продажу: На открытии дня, если цена ниже уровня Pivot Points на N – расстояние True/False, то на уровне Pivot Points выставляется три отложенных ордера одного лота Sell Limit (количество ордеров регулируется от 1 до 3).
Если в функциях советника тейк профит выставить =0, то по умолчанию советник выставляет
Тейк профит первого ордера на уровне поддержки S1
Тейк профит второго ордера на уровне поддержки S2
Тейк профит третьего ордера на уровне поддержки S3

Если в функциях советника тейк профит указать не ноль, а указать цену, то профит выставляется по цене.
Если в функциях советника стоп лосс указать =0, то по умолчанию советник выставляет стоп лосс всех ордеров или одного ордера за уровень ХАЙ предыдущего дня с возможностью отступа N –расстояние.

Если в функциях советника стоп лосс указать не ноль, а указать цену, то стоп лосс выставляется по цене.
Без убыток: Если в функциях советника без убыток выставить=0, то по умолчанию советник выставляет без убыток, как только цена дошла до первого уровня поддержки S1 и первый ордер закрылся по тейк профиту два оставшихся переводятся в без убыток на N-расстояние.
Если в функциях советника без убыток указать не ноль, а указать расстояние в пунктах, то без убыток выставляется по пунктам.
Трелинг стоп.

Если за день цена не подошла к уровню Pivot Points и ордер или ордера не активировались, то на открытие следующего дня эти ордера удаляются и уже по новому уровню Pivot Points выставляются новые отложенные ордера.
Если ордера активировались и за день не закрылись по тейк профиту или стоп лоссу то на следующий день новые отложенные ордера не выставляются.
Если в течение дня отложенные ордера активировались и в этот же день закрылись по тейку или стоп лоссу, то следующие выставляются на следующий день по новому уровню Pivot Points.

Фильтр для флета:
Если на открытие нового дня уровень Pivot Points на N-расстояние True/False меньше предыдущего дня уровня Pivot Points отложенные ордера не выставляются.

Сам уровень Pivot вычисляется по формуле

Pivot = (High + Low + Close) / 3, где
high — максимум вчерашнего дня;
low — минимум вчерашнего дня;
close — цена закрытия вчерашнего дня.
Затем вычисляем уровни сопротивления и поддержки, используя полученные значения для пивота:
R1 = 2Pivot — Low;
S1 = 2Pivot — High;
R2 = Pivot + (R1 — S1);
S2 = Pivot — (R1 — S1);
R3 = High + 2 × (Pivot — Low);
S3 = Low — 2 × (High — Pivot), где:
R1, R2, R3 — уровни сопротивления; S1, S2, S3 — уровни поддержки.
  • +3
  • Просмотров: 735
  • 2 декабря 2017, 13:22
  • ID1972
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
В понедельник посмотрю.
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 2 декабря 2017, 21:24
+
0
Архив я не открыл. Скиньте ссылку на файлик.
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 4 декабря 2017, 20:05
+
0
Как прикрепить файл?
avatar

  4  ID1972 Автор Сообщений: 46

  • 4 декабря 2017, 20:16
+
0
можно в базу или на файлообменник скинуть и здесь разместить ссылку
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 4 декабря 2017, 20:29
+
0
avatar

  4  ID1972 Автор Сообщений: 46

  • 4 декабря 2017, 21:00
+
0
если цена выше уровня Pivot Points на N – расстояние True/False


Эту фразу как понимать?
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 4 декабря 2017, 21:21
+
0
Это некий фильтр если на открытие дня цена очень близко к уровню пивот на N-расстояние, то ордера не выставляются.
Допустим в этой функции в советнике мы выставили 25 пунктов. А на открытии дня цена от уровня пивот 10 пунктов, значит в этот день ордера не выставляются.
avatar

  4  ID1972 Автор Сообщений: 46

  • 4 декабря 2017, 21:28
+
+1
Пока сделал набросок. Еще завтра добавлю то что можно быстро сделать.



//+------------------------------------------------------------------+
//|                                                        Pivot.mq4 |
//|                                              Copyright 2017, AM2 |
//|                                      http://www.forexsyatems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link      "http://www.forexsyatems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 300;      // лось
extern int TakeProfit    = 400;      // язь
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int Slip          = 30;       // реквот
extern int Delta         = 100;      // расстояние от цены
extern int Count         = 3;        // число отложек
extern int Bar           = 10;       // баров для линии
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,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);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
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());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 PutTrendLine(string name,datetime time1,double price1,datetime time2,double price2,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
//--- установим цвет линии 
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии 
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линии 
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо 
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double low=iLow(NULL,PERIOD_D1,1);
   double high=iHigh(NULL,PERIOD_D1,1);
   double close=iClose(NULL,PERIOD_D1,1);
   double p=(close+high+low)/3;
   double r1=2*p-low;
   double s1=2*p-high;
   double r2=p+(r1-s1);
   double s2=p-(r1-s1);
   double r3=high+2*(p-low);
   double s3=low-2*(high-p);

   PutTrendLine("p",Time[0],p,Time[Bar],p,Yellow);
   PutTrendLine("r1",Time[0],r1,Time[Bar],r1,Red);
   PutTrendLine("s1",Time[0],s1,Time[Bar],s1,Blue);
   PutTrendLine("r2",Time[0],r2,Time[Bar],r2,Red);
   PutTrendLine("s2",Time[0],s2,Time[Bar],s2,Blue);
   PutTrendLine("r3",Time[0],r3,Time[Bar],r3,Red);
   PutTrendLine("s3",Time[0],s3,Time[Bar],s3,Blue);

   if(OrdersTotal()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(Bid<p) for(int i=0;i<Count;i++) PutOrder(3,p);
      if(Bid>p) for(int i=0;i<Count;i++) PutOrder(2,p);
     }
   if(!isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) DelOrder();

   Comment("\n Pivot: ",p);
  }
//+------------------------------------------------------------------+
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 4 декабря 2017, 21:47
+
0
ок
avatar

  4  ID1972 Автор Сообщений: 46

  • 4 декабря 2017, 21:56
+
0
Добавил контроль расстояния от пивота и стопы по уровням: www.opentraders.ru/downloads/1743/

avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 5 декабря 2017, 20:32
+
0
А без убыток и трейлинг стоп?
avatar

  4  ID1972 Автор Сообщений: 46

  • 5 декабря 2017, 20:44
+
0
Простой трал и бу могу добавить.
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 5 декабря 2017, 21:38
+
0
Добавьте пожалуйста.
avatar

  4  ID1972 Автор Сообщений: 46

  • 6 декабря 2017, 06:37
+
0
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 6 декабря 2017, 17:35
+
0
Андрей здравствуйте. Исправьте, пожалуйста выставление стоп лосса, чтобы соответствовала тех. заданию. Вы сделали стоп лосс выставляется по уровням сопротивления или поддержки по трём разным уровням, а надо чтоб стоп лосс выставлялся по хаю или лоу предыдущего дня все три на одном уровне.
avatar

  4  ID1972 Автор Сообщений: 46

  • 9 декабря 2017, 18:14
+
0
Стопы по хаю лоу предыдушего дня:




   if(OrdersTotal()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(Bid<p && p-Bid>Delta*Point) for(int i=0;i<Count;i++)
        {
         if(i==0) PutOrder(3,p,high,s1);
         if(i==1) PutOrder(3,p,high,s2);
         if(i==2) PutOrder(3,p,high,s3);
        }
      if(Bid>p && Bid-p>Delta*Point) for(int i=0;i<Count;i++)
        {
         if(i==0) PutOrder(2,p,low,r1);
         if(i==1) PutOrder(2,p,low,r2);
         if(i==2) PutOrder(2,p,low,r3);
        }
     }


Если не разберетесь как поменять этот блок обновлю в базе.
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 10 декабря 2017, 10:07
+
0
Обновите в базе пожалуйста.Спасибо.
avatar

  4  ID1972 Автор Сообщений: 46

  • 10 декабря 2017, 10:52
+
0
avatar

  26  AM2 Сообщений: 6598 - Андрей

  • 10 декабря 2017, 13:26

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

 
Как начать: открываем первую торговую сделку за 7 шагов →