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

Рейтинг 2146



РЕКОМЕНДУЮ



Советник работающий в определенное время

Здравствуйте! Напишите пожалуйста советник для МТ4.
Советник должен в определенное время по терминалу выставить два отложенных ордера на покупку и продажу. Ордера выставляются на выбранном расстоянии от цены. Через определенное время если ордер не достиг Т/П должен закрываться, а не сработавший ордер удаляется. Должна быть возможность выбора какими ордерами торговать stop или Limit

Параметры советника:
— Лот
— Тэйк профит
— Стоп лосс
— Выбор какими ордерами торгуем stop или Limit
— Время начала торговли
— Время через которое советник закрывает все ордера
— На каком расстоянии от цены выставляются ордера
— Мэджик
  • 0
  • Просмотров: 3632
  • 1 марта 2016, 21:21
  • mecenat
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Посмотрите в базе, там были подобные.
avatar

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

  • 1 марта 2016, 21:45
+
0
смотрел похожие есть, но у них нет выбора какими ордерами работать
avatar

  15  mecenat Автор Сообщений: 41

  • 1 марта 2016, 21:48
+
0
приведите пару ссылок, я переделаю просто
avatar

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

  • 1 марта 2016, 21:50
+
0
вот похожий www.opentraders.ru/downloads/712/
avatar

  15  mecenat Автор Сообщений: 41

  • 1 марта 2016, 22:09
+
0
Завтра с утра уже посмотрю.
avatar

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

  • 1 марта 2016, 22:20
+
0
По ТЗ все есть: www.opentraders.ru/downloads/1083/




//+------------------------------------------------------------------+
//|                                                    StopLimit.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, 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 StartHour    = 0;   // час начала торговли
extern int StartMin     = 30;  // минута начала торговли
extern int EndHour      = 23;  // час окончания торговли
extern int EndMin       = 30;  // минута окончания торговли
extern int Slip         = 30;  // реквот
extern int Type         = 0;   // 0-Stop. 1-Limit
extern int Hours        = 8;   // через сколько часов удаляем ордера
extern int Delta        = 100; // расстояние от цены
extern int Magic        = 333; // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()<2) 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,del;
   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);
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
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()
  {
   if(isTradeTimeInt(StartHour,StartMin,EndHour,EndMin) && CountTrades()<1)
     {
      if(Type==0)
        {
         if(CountOrders(4)<1) PutOrder(4,Bid+Delta*Point);
         if(CountOrders(5)<1) PutOrder(5,Bid-Delta*Point);
        }

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

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

   Comment("\n OpenTime: ",OpenTime(),
           "\n TimeCurrent: ",TimeCurrent(),
           "\n TimeCurrent()-OpenTime(): ",(int)(TimeCurrent()-OpenTime()));
  }
//+------------------------------------------------------------------+


Редактирован: 4 марта 2016, 17:03
avatar

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

  • 2 марта 2016, 00:31
+
0
Здравствуйте, а можно сюда добавить ещё секунды открытия ордера
avatar

  2  Wladimir111 Сообщений: 4

  • 8 марта 2016, 18:16
+
+1
А что вам дадут секунды открытия? Если только в тестере посмотреть на красивое исполнение ордеров.
В реальной торговле вполне достаточно точности до минуты. Ибо есть реквоты и расширения спреда…
avatar

  13  Fargo Сообщений: 495

  • 9 марта 2016, 14:24
+
0
Читал ранее, что сессия пользователя в мт4 закрывается каждые 30 сек после выставления ордера, а если я попадаю в эти 30 сек, то следующий ордер исполнится немного быстрее, чего я и хочу добиться.
avatar

  2  Wladimir111 Сообщений: 4

  • 9 марта 2016, 15:46

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