Kashtan
Игорь

 
Уровень 18

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


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

Рейтинг 2090



РЕКОМЕНДУЮ



Доработка советника

Прошу доработать один из моих заказов zakaz.opentraders.ru/30339.html

1. Вместо настройки «сколько часов назад» сделать возможность задать начальный и конечный бары для расчёта. Например если время торговли в 14.00, начальный бар 29 (оранжевый), конечный бар 57 (жёлтый) — хай и лоу окажутся 4484.4 и 4430.9 соответственно.

2. Добавить выбор дней недели для торговли.
3. Добавить открытие ордера в противоположном направлении, ЕСЛИ основной закрылся по лосю. То есть закрылась покупка по лосю, открылась продажа. Закрылась продажа по лосю, открылась покупка. Для этого ордера свой Лот, Лось, Язь.
  • +2
  • Просмотров: 3382
  • 1 января 2017, 15:05
  • Kashtan
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
+2
Завтра буду смотреть что можно сделать.
avatar

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

  • 1 января 2017, 16:50
+
+4
Kashtan, весь декабрь крепился, ждал, чтобы именно 1-го января опубликовать заказ?
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 1 января 2017, 17:13
+
0
:D 
avatar

  22  poker Сообщений: 803

  • 1 января 2017, 17:16
+
0
Именно так Ксюша;) 
avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 1 января 2017, 17:26
+
0
Первые 2 пункта сделал, а третий подробнее пожалуйста и со скринами?




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

//--- Inputs
extern double Lots      = 0.1; // объем позиции
extern int StopLoss     = 500; // стоп лосс ордера
extern int TakeProfit   = 500; // тейк профит ордера
extern int Expiration   = 10;  // время истечения ордера
extern int Slip         = 30;  // реквот
extern int Type         = 0;   // 0-Stop. 1-Limit
extern int Start        = 11;  // час торговли
extern int StartBar     = 29;  // начальный бар
extern int EndBar       = 50;  // конечный бар
extern int Delta        = 100; // расстояние от вершин +
extern int Indent       = 100; // расстояние от вершин -
extern int Magic        = 333; // магик

extern bool MonDay      = true;
extern bool TuesDay     = true;
extern bool WednesDay   = true;
extern bool ThursDay    = true;
extern bool FriDay      = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Trade()
  {
   if(DayOfWeek()==1 && MonDay)    return(true);
   if(DayOfWeek()==2 && TuesDay)   return(true);
   if(DayOfWeek()==3 && WednesDay) return(true);
   if(DayOfWeek()==4 && ThursDay)  return(true);
   if(DayOfWeek()==5 && FriDay)    return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int    r=0;
   color clr=clrNONE;
   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,TimeCurrent()+Expiration*3600,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()==0 || OrderType()==1) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime OpenTime()
  {
   datetime t=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) t=OrderOpenTime();
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
            if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
           }
         Sleep(1000);
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double h=High[iHighest(NULL,0,MODE_HIGH,EndBar,StartBar)];
   double l=Low[iLowest(NULL,0,MODE_LOW,EndBar,StartBar)];

   if(Hour()==Start && CountTrades()<1 && Trade())
     {
      if(Type==0)
        {
         if(CountOrders(4)<1 && h-Bid>Indent*Point) PutOrder(4,h+Delta*Point);
         if(CountOrders(5)<1 && Bid-l>Indent*Point) PutOrder(5,l-Delta*Point);
        }

      if(Type==1)
        {
         if(CountOrders(2)<1 && h-Bid>Indent*Point) PutOrder(2,l-Delta*Point);
         if(CountOrders(3)<1 && Bid-l>Indent*Point) PutOrder(3,h+Delta*Point);
        }
     }

   if(CountTrades()>0 && TimeCurrent()-OpenTime()>Expiration*3600)
     {
      CloseAll();
     }
  }
//+------------------------------------------------------------------+

avatar

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

  • 2 января 2017, 09:20
+
0
Спс:)  Опишу про третий пункт и буду проверять первые два.
Например в настройках было задано ставить Байстоп и Селлстоп. Ордера встали на экстремумы отмеченные белым цветом за период отмеченный жёлтым цветом. ТП синий, СЛ красный.


В текущем варианте когда сработавший ордер до времени экспирации успел закрыться по профиту или лосю, советник ждёт следующего дня. А надо, что бы если ордер закрылся по лосю, то советник не дожидаясь следующего дня открыл сделку по текущей цене но в противоположном направлении. В примере на скрине если был активирован Байстоп и закрылся с убытком по цене 1.26757, сразу должна открыться продажа со своими параметрами. Если ко времени экспирации эта продажа не закрылась, советник её закрывает так же как если бы это висел Байстоп. Дальше как обычно советник ждёт новый день для установки ордеров.
avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 2 января 2017, 10:35
+
0
3-й пункт только в упрощенном виде: www.opentraders.ru/downloads/1441/

avatar

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

  • 2 января 2017, 11:04
+
+1
C отдельными параметрами для маркет ордера:



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

//--- Inputs
extern double Lots      = 0.1; // объем позиции
extern int StopLoss     = 500; // стоп лосс ордера
extern int TakeProfit   = 500; // тейк профит ордера
extern double Lots2     = 0.1; // объем маркет позиции
extern int StopLoss2    = 500; // стоп лосс маркет ордера
extern int TakeProfit2  = 500; // тейк профит маркет ордера
extern int Expiration   = 10;  // время истечения ордера
extern int Slip         = 30;  // реквот
extern int Type         = 0;   // 0-Stop. 1-Limit
extern int Start        = 11;  // час торговли
extern int StartBar     = 29;  // начальный бар
extern int EndBar       = 50;  // конечный бар
extern int Delta        = 100; // расстояние от вершин +
extern int Indent       = 100; // расстояние от вершин -
extern int Magic        = 333; // магик

extern bool MonDay      = true;
extern bool TuesDay     = true;
extern bool WednesDay   = true;
extern bool ThursDay    = true;
extern bool FriDay      = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Trade()
  {
   if(DayOfWeek()==1 && MonDay)    return(true);
   if(DayOfWeek()==2 && TuesDay)   return(true);
   if(DayOfWeek()==3 && WednesDay) return(true);
   if(DayOfWeek()==4 && ThursDay)  return(true);
   if(DayOfWeek()==5 && FriDay)    return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int    r=0;
   color clr=clrNONE;
   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,TimeCurrent()+Expiration*3600,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutMarketOrder(int type,double price)
  {
   int    r=0;
   color clr=clrNONE;
   double sl=0,tp=0;

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

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

   r=OrderSend(NULL,type,Lots2,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,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()==0 || OrderType()==1) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime OpenTime()
  {
   datetime t=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) t=OrderOpenTime();
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
            if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
           }
         Sleep(1000);
        }
     }
  }
//+------------------------------------------------------------------+
//| Результат последней сделки                                       |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Результат последней сделки                                       |
//+------------------------------------------------------------------+
int LastDealType()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==0)
           {
            result=1;//tp  
           }
         if(OrderType()==1)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double h=High[iHighest(NULL,0,MODE_HIGH,EndBar-StartBar,StartBar)];
   double l=Low[iLowest(NULL,0,MODE_LOW,EndBar-StartBar,StartBar)];

   if(Hour()==Start && CountTrades()<1 && Trade())
     {
      if(Type==0)
        {
         if(CountOrders(4)<1 && h-Bid>Indent*Point) PutOrder(4,h+Delta*Point);
         if(CountOrders(5)<1 && Bid-l>Indent*Point) PutOrder(5,l-Delta*Point);
        }

      if(Type==1)
        {
         if(CountOrders(2)<1 && h-Bid>Indent*Point) PutOrder(2,l-Delta*Point);
         if(CountOrders(3)<1 && Bid-l>Indent*Point) PutOrder(3,h+Delta*Point);
        }
     }

   if(CountTrades()<1 && Trade())
     {
      if(LastDealResult()==2 && LastDealType()==1) PutMarketOrder(1,Bid);
      if(LastDealResult()==2 && LastDealType()==2) PutMarketOrder(0,Ask);
     }

   if(CountTrades()>0 && TimeCurrent()-OpenTime()>Expiration*3600)
     {
      CloseAll();
     }
  }
//+------------------------------------------------------------------+

Редактирован: 2 января 2017, 21:13
avatar

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

  • 2 января 2017, 12:25
+
0
Мерси и хорошо провести праздники*drinks* 
avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 2 января 2017, 12:41
+
0
Советник не верно считает бары. Исходя из настроек

начальный бар 10 (жёлтый) и конечный бар 23 (синий). Так как время установки ордеров, это нулевой бар от которого и надо считать. Ордера на уровне белых линий.


Вместо этого Селлстоп встал на расстоянии 31 свечи от нулевого, байстопа вообще нет.
avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 2 января 2017, 15:39
+
0
Поставил ордера по экстремумам на участке с 10 по 23 бары:

avatar

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

  • 2 января 2017, 16:07
+
0
Видно же на скрине, что ордера стоят на экстремумах не внутри участка, а за его пределами слева…
avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 2 января 2017, 16:33
+
+1
Видно же на скрине, что ордера стоят на экстремумах не внутри участка, а за его пределами слева…


нормально ставит

avatar

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

  • 2 января 2017, 19:49
+
0
Даже если считать что время установки это не нулевой а первый бар, то Селлстоп должен быть на этом баре


А он у вас на этом

avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 2 января 2017, 18:08
+
0
*girlcry* 
avatar

  18  Kashtan Автор Сообщений: 737 - Игорь

  • 2 января 2017, 18:08
+
0
В подобных советниках не по… &2. Добавить выбор дней недели для торговли.& А по выбору месяцев надо делать!!!<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
Редактирован: 7 января 2017, 19:57
avatar

  4  Vadikus Сообщений: 7 - Вадим

  • 7 января 2017, 19:57

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