Kashtan
Игорь

 
Уровень 19

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


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

Рейтинг 2146



РЕКОМЕНДУЮ



Простой советник

Прошу написать простого советника ставящего два лимитных ордера выше и ниже цены в нужное время.

Техническое задание:

1. Время установки ордеров (Час: Мин)
2. Расстояние от цены до каждого ордера на момент установки
3. Т.п. для ордеров
4. С.л. для ордеров
Если сработал бай лимит, сел лимит сразу удаляется. Если сработал сел лимит, бай лимит сразу удаляется. Заранее спасибо
  • 0
  • Просмотров: 4585
  • 15 декабря 2015, 21:27
  • Kashtan
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Лок к советнику «Hello» ,подправить !
Следующая запись в группе  
советник
15 декабря 2015
16 декабря 2015

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

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

+
0
В гугле обыскался, то что нужно не нашёл(
avatar

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

  • 15 декабря 2015, 21:55
+
0
Набросаю сейчас.
avatar

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

  • 15 декабря 2015, 22:21
+
0
Готово:




//+------------------------------------------------------------------+
//|                                                        Limit.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 500;      // язь
extern int Delta        = 100;      // отступ
extern int Slip         = 30;       // реквот
extern int StartHour    = 9;        // час начала торговли
extern int StartMin     = 30;       // минута начала торговли
extern int EndHour      = 23;       // час окончания торговли
extern int EndMin       = 30;       // минута окончания торговли
extern int Magic        = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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)+" "+hb+":"+mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+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);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int    r=0;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      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)
     {
      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,Green);
   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()==OP_BUY || OrderType()==OP_SELL) 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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()==2 || OrderType()==3)  del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

/*
Тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:
0 - OP_BUY - ордер на покупку,
1 - OP_SELL - ордер на продажу,
2 - OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
3 - OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
4 - OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
5 - OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
*/

   if(isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(CountTrades()<1)
        {
         if(CountOrders(2)<1)PutOrder(2,Bid-Delta*Point);
         if(CountOrders(3)<1)PutOrder(3,Bid+Delta*Point);
        }
     }
     
   if(CountTrades()>0) DelOrder();
  }
//+------------------------------------------------------------------+


Редактирован: 15 декабря 2015, 23:00
avatar

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

  • 15 декабря 2015, 23:00
+
0
БОЛЬШОЕ СПАСИБО!!! Буду тестировать старую задумку))
avatar

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

  • 16 декабря 2015, 00:44
+
0
Извиняюсь, я в техзадании одну деталь не учёл. Советник должен всего один раз отложки поставить, и до завершения работы в его задачу входит только удалить противоположный ордер, когда сработает один из двух. Ещё можно добавить функцию, чтоб при завершении работы он закрывал сделку, если к тому времени она не по тейку не по лосю не закроется(но это не так важно). Главное чтоб когда ордер сработал, противоположный удалился и до следующего раза(то есть через сутки, если настройки не менять) новые не при каких обстоятельствах не ставились) Две отложки один раз в день в указанное время.
avatar

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

  • 16 декабря 2015, 00:58
+
0
Неплохо для такой простой штуки!




//+------------------------------------------------------------------+
//|                                                        Limit.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 500;      // язь
extern int Delta        = 100;      // отступ
extern int Slip         = 30;       // реквот
extern int StartHour    = 9;        // час начала торговли
extern int StartMin     = 30;       // минута начала торговли
extern int EndHour      = 23;       // час окончания торговли
extern int EndMin       = 30;       // минута окончания торговли
extern int Magic        = 123;      // магик

int one=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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)+" "+hb+":"+mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+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);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int    r=0;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      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)
     {
      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,Green);
   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()==OP_BUY || OrderType()==OP_SELL) 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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()==2 || OrderType()==3) del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void ClosePos()
  {
   bool c;
   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)
              {
               c=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White);
               break;
              }
            if(OrderType()==OP_SELL)
              {
               c=OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White);
               break;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

/*
Тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:
0 - OP_BUY - ордер на покупку,
1 - OP_SELL - ордер на продажу,
2 - OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
3 - OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
4 - OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
5 - OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
*/

   if(isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(CountTrades()<1 && one<1)
        {
         if(CountOrders(2)<1)PutOrder(2,Bid-Delta*Point);
         if(CountOrders(3)<1)PutOrder(3,Bid+Delta*Point);
         one++;
        }
     }

   if(CountTrades()>0) DelOrder();
   if(!isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(CountTrades()>0) ClosePos();
      one=0;
     }
  }
//+------------------------------------------------------------------+

avatar

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

  • 16 декабря 2015, 16:51
комментарий был удален 2016-03-31 06:42:15 Kashtan

+
0
В тестере всё работает хорошо!) Впереди доооолгие экс(кр)именты с настройками:D 
avatar

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

  • 16 декабря 2015, 20:42
+
0
Научитесь пользоваться оптимизацией в тестере — время и сэкономите. (Вот я и ваш топик прокомментировала)
avatar

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

  • 16 декабря 2015, 21:30
+
0
Про оптимизацию отдельный разговор! Вы советников в базовом тестере гоняете, или через тик дата сюит?)
avatar

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

  • 16 декабря 2015, 22:05
+
0
Прошу добавить в советник реверс, чтоб вместо лимитных ордеров ставил стоповые. В текущем варианте с разными настройками стабильных результатов пока получить не удалось. То зарабатывает, то сливает.
avatar

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

  • 21 декабря 2015, 20:51
+
0
Есть выбор типа ордеров: www.opentraders.ru/downloads/981/

avatar

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

  • 22 декабря 2015, 15:00
+
0
Привет Андрей. Советник при завершении работы не закрывает открытую сделку, в тестере стратегий только проверял. Думал это не важно, оказалось не так
Редактирован: 26 декабря 2015, 00:01
avatar

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

  • 25 декабря 2015, 23:59
+
0
Привет Андрей. Советник при завершении работы не закрывает открытую сделку, в тестере стратегий только проверял. Думал это не важно, оказалось не так


Я его переделывал, кто то просил, сейчас другие условия. Смотрите у себя предыдущие версии.
avatar

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

  • 26 декабря 2015, 00:23
+
0
Делаю такой же советник но в придачу он открывает отложки по индикатору ADX. И открывает сделки по 3 машкам. Вот только одна беда работает только пробойная стратегия или машки, а вместе работать отказываются. Выставляет срасязу пачки ордеров которые удаляются после закрытия свечи. Помогите советом:) 
avatar

  10  Nadejda-stav Сообщений: 157

  • 5 октября 2016, 22:26
+
0
Обратитесь в стол заказов, приведите код и посмотрим что можно сделать.
avatar

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

  • 6 октября 2016, 06:23

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