preasto

 
Уровень 11

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


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

Рейтинг 2146



РЕКОМЕНДУЮ



Доработка - Советник, выставляющий новые ордера на каждой свече

Просьба дополнить Советник, выставляющий новые ордера на каждой новой свече выбранного ТФ:
zakaz.opentraders.ru/25138.html

— Час и мин. начала торговли
— Час и мин. окончания торговли
— Выбор ТФ (от М1 и далее — все ТФ)
— Уровень старта // если старт от уровня, а не по времени
— Уровень завершения // если завершение от уровня, а не по времени
— Направление старт-ордера: По рынку / Бай/Селл

При СЛ, ТП = 0 (или -1 и т.п.) — СЛ, ТП не выставлять.

Советник может начинать работу от внешнего старт-ордера.

— По рынку — Старт в направлении 1го рыночного ордера: да/нет
— Магик внешнего старт-ордера: 0
— Длительность сессии:… мин. // для работы со стартом от рыночного старт-ордера. Если не указано — работа по времени или уровню завершения: 0, или -1, или пусто = нет.
— Стоп-ордер против стартового* лотностью равной стартовому ордеру
— с отступом:… п.
* после срабатывания стоп-ордера советник открывает ордера в направлении обратном стартовому ордеру,
на свечах с ценой открытия в минусовой зоне от цены стартового ордера (против цены 1го стартового ордера)
т.е.
— если 1й старт-ордер Бай а цена открытия очередной свечи ниже его цены — то открывать ордера Селл,
— если 1й старт-ордер Селл а цена открытия очередной свечи выше его цены — то открывать ордера Бай.

Пока не сработает стоп-ордер — открывать ордера на каждой новой свече в направлении старт-ордера.
На свечах с ценой открытия в плюсовой зоне от цены старт-ордера — всегда открывать ордера в направлении старт-ордера.

— локировать: да/нет //ставить ордер направлением и лотностью равной разнице всех Бай и Селл ордеров на это время при завершении сессии для баланса всех ордеров
— при завершении — открывать новую серию ордеров: да/нет
— на время = Длительность сессии 2:… мин. // 0, или -1, или пусто = нет
— до уровня 2:… // 0, или -1, или пусто = нет
или до уровня 3:… // какой первый будет достигнут
— реверс — ордера в обратную сторону от направления предыдущих: да/нет
  • +1
  • Просмотров: 8962
  • 7 апреля 2017, 13:06
  • preasto
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
+1
Я знаю, вы большой придумщик :) 
avatar

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

  • 7 апреля 2017, 17:27
+
0
Ага! Так, что-то сделать реально?
Главное, конечно — работа по всем ТФ с минутами.
И, Суть основная: все ордера к-е в области прибыли от стартового — в его направлении (на доливку),
все к-е в области убытка стартового — обратные.
И можно сделать функцию: закрытие всех ордеров по завершению сессии.

Если так проще — можно и без стоп-ордера *???* 
Хотя бы относительно цены стартового… *pardon* 

Ну, и, что сходу исполнимо из остального — тоже б хорошо б. <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; 


Редактирован: 7 апреля 2017, 20:05
avatar

  11  preasto Автор Сообщений: 445

  • 7 апреля 2017, 19:40
+
0
Может быть так ТЗ будет проще и понятнее(? ):

Добавить:
— Час и мин. начала торговли
— Час и мин. окончания торговли
— Выбор ТФ (от М1 и далее — все ТФ)
— Направление старт-ордера: По рынку / Бай/Селл

В заданное время сов. открывает ордер в указанном направлении.
Если выбрано «по рынку», то старт-ордер — это первый ордер открытый извне. Без учёта времени старта.
Хорошо бы) для внешнего стартового задать свой магик
(напр. -1 = любой магик, 0 — ручное, 123 — конкретный внешний)
Окончание работы — согласно заданному в советнике.

Далее на каждой свече сов. открывает новый ордер:
— если цена открытия свечи выше цены стартового — то ордер Бай;
— если цена открытия свечи ниже цены стартового — то ордер Селл;

По сигналу завершения(на крайней свече) производится подсчёт разницы всех Бай и Селл ордеров
и открывается балансирующий запирающий ордер лотностью равной разнице лотностей всех Бай и Селл ордеров
того направления, где общая лотность меньше (Лок).

Для проверки в тестере добавить:
— функцию авто-работы с ордерами по МА — которая уже «по-умолчанию» стоит во многих советниках же,
и
— функцию: Закрывать все ордера, если общая сумма от закрытия всех ордеров в прибыли
(нет — локировать и оставлять на «ручной разбор»).

Всё.
Это же, возможно сделать?

Добавление способа начала/завершения работы от уровней приветствуется <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; '>&nbsp; '>&nbsp; '>&nbsp; '>&nbsp; .
Приблуда с доп. стоп-ордером интересна,
но, как понимаю — выпадает из обычного объёма для среднего ТЗ в столе заказов.


Редактирован: 14 апреля 2017, 12:36
avatar

  11  preasto Автор Сообщений: 445

  • 11 апреля 2017, 10:10
+
0
Андрей! Вами только, что, успешно сделан похожий
Советник по свечам с добавлением лотов.
zakaz.opentraders.ru/38480.html#comment129896

Его ТЗ даже более мудрёное, вроде как и с бОльшим количеством условий.
Может быть откликнитесь и сможете сделать подобного рода вспомогательный советник по моему ТЗ, к-е переписано в комментарии выше и, как мне кажется, имеет довольно простые условия и понятную логику в таком виде.
avatar

  11  preasto Автор Сообщений: 445

  • 13 апреля 2017, 10:29
+
0
но, как понимаю — выпадает из обычного объёма для среднего ТЗ в столе заказов.


Это радует что понимате :D 
avatar

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

  • 14 апреля 2017, 07:10
+
0
Хорошо. Но основная часть — там же задача подобна уже нескольким сделанным такого типа советникам.
Сделаете?
Для проверки в тестере можно добавить
— функцию авто-работы с ордерами по МА — которая уже «по-умолчанию» стоит во многих советниках же,
и
— функцию: Закрывать все ордера, если общая сумма от закрытия всех ордеров в прибыли (нет — локировать и оставлять на «ручной разбор»).
avatar

  11  preasto Автор Сообщений: 445

  • 14 апреля 2017, 09:27
+
0
Андрей, добавить
— Час и мин. начала торговли
— Час и мин. окончания торговли
— Выбор ТФ (от М1 и далее — все ТФ)

и сделать так:
На каждой свече сов. открывает новый ордер:
— если цена открытия свечи выше цены стартового — то ордер Бай;
— если цена открытия свечи ниже цены стартового — то ордер Селл;

— По завершении работы ставится лок — ордер лотностью в разницу лотов всех Бай и Селл ордеров.

— это посильная задача?
avatar

  11  preasto Автор Сообщений: 445

  • 18 апреля 2017, 17:38
+
0
Напишите подробнее когда именно ставится лок? Желательно с картинками для наглядности.
avatar

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

  • 18 апреля 2017, 22:36
+
0
Лок ставится на свече следующей за крайней свечой:
а) в — Час и мин. окончания торговли
б) при достижении — Уровня завершения (заданной цены, или отступа в п. от старта, типа ТП) // если завершение от уровня, а не по времени (если будет функция и параметр закрытия по уровню)
Например:



Редактирован: 18 апреля 2017, 23:29
avatar

  11  preasto Автор Сообщений: 445

  • 18 апреля 2017, 23:09
+
0
Я часа 3 просидел с вашим ТЗ и никак. Обращайтесь к платному.
avatar

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

  • 19 апреля 2017, 00:05
+
0
Пока такой набросок:


//+------------------------------------------------------------------+
//|                                                        Start.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 Start      = 1.1;      // старт
extern double Lots       = 0.1;      // лот
extern double LockLoss   = 3000;     // убыток когда ставим лок
extern double Loss       = 3000;     // лось в рублях
extern double Profit     = 1000;     // язь в рублях
extern int StopLoss      = 2222;     // лось 
extern int TakeProfit    = 150;      // язь
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

int lock=0;
datetime t=0;
//+------------------------------------------------------------------+
//| 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=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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CountLots(int type)
  {
   double lots=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) lots+=OrderLots();
           }
        }
     }
   return(lots);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=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 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   if(Bid<Start)
     {
      PutOrder(1,Bid);
     }

   if(Ask>Start)
     {
      PutOrder(0,Ask);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLockOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double lot=MathAbs(CountLots(0)-CountLots(1));

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,CountLots(type),NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(t!=Time[0] && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
      if((AllProfit()>=Profit && Profit>0) || (AllProfit()<-Loss && Loss>0)) CloseAll();
      t=Time[0];
     }
     
   if(!isTradeTimeInt(StartHour,StartMin,EndHour,EndMin) && lock<1)
     {
      if(AllProfit()<-LockLoss && LockLoss>0 && CountOrders(0)<CountOrders(1)) PutLockOrder(0,Ask); lock++;
      if(AllProfit()<-LockLoss && LockLoss>0 && CountOrders(1)<CountOrders(0)) PutLockOrder(1,Bid); lock++;
     }
     
   Comment("\n All Profit: ",AllProfit(),
           "\n Count Trades: ",CountTrades(),
           "\n Count Buy: ",CountOrders(0),
           "\n Count Sell: ",CountOrders(1),
           "\n Count Buy Lots: ",CountLots(0),
           "\n Count Sell Lots: ",CountLots(1));
  }
//+------------------------------------------------------------------+

avatar

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

  • 19 апреля 2017, 00:01
+
0
Андрей, а возможно сделать лок сразу тут, независимо от прибыли, просто по времени:
<code>extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли</code>

На этой свече, или на следующей после неё?

Независимо, какой результат по прибыли — поставить ордер балансирующий по лотности суммы всех Бай и Селл ордеров, лотностью равной разнице их всех лотностей.
Редактирован: 19 апреля 2017, 09:23
avatar

  11  preasto Автор Сообщений: 445

  • 19 апреля 2017, 09:15
+
0
Ну, и по логике… не думал, что тут так сложно с точки зрения кодинга,
алгоритм весьма простой:

1. В указанное время открывается старт-ордер указанной лотности и направления (Бай или Селл).
Допустим — Селл (как в тестере сейчас).
Советником фиксируется(«запоминается») цена открытия этого старт-ордера.

2. На открытии каждой новой свече открывается новый ордер:
— если рыночная цена при этом БОЛЬШЕ чем цена старт-ордера — то открывается БАЙ,
— если рыночная цена при этом МЕНЬШЕ чем цена старт-ордера — то открывается СЕЛЛ.

3. В заданное время (час и мин.окончания торговли)- ставится общий ЛОК.
т.е. ордер лотностью равной разнице лотностей всех БАЙ и СЕЛЛ ордеров открытых до этого, того направления, где этих ордеров меньше.
Независимо: лок положительный(в прибыли), или отрицательный (фиксирует убыток).
===
Всё.


Редактирован: 19 апреля 2017, 13:32
avatar

  11  preasto Автор Сообщений: 445

  • 19 апреля 2017, 09:37
+
+1
что тут так сложно с точки зрения кодинга

Вы программист чтобы оценить сложность?

алгоритм весьма простой

На основе чего вы сделали такие выводы?

Отладил свой вариант. Цена старт ордера задается вручную, все остальное есть:




//+------------------------------------------------------------------+
//|                                                        Start.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 Start      = 1.1;      // старт
extern double Lots       = 0.1;      // лот
extern double LockLoss   = 3000;     // убыток когда ставим лок
extern double Loss       = 3000;     // лось в рублях
extern double Profit     = 1000;     // язь в рублях
extern int StopLoss      = 2222;     // лось 
extern int TakeProfit    = 150;      // язь
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

datetime t=0;
bool trade=true;
//+------------------------------------------------------------------+
//| 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=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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CountLots(int type)
  {
   double lots=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) lots+=OrderLots();
           }
        }
     }
   return(lots);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=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 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   if(Bid<Start)
     {
      PutOrder(1,Bid);
     }

   if(Ask>Start)
     {
      PutOrder(0,Ask);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLockOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double lot=MathAbs(CountLots(0)-CountLots(1));

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(t!=Time[0] && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin) && trade)
     {
      OpenPos();
      if((AllProfit()>=Profit && Profit>0) || (AllProfit()<-Loss && Loss>0)) CloseAll();
      t=Time[0];
     }
     
   if(!isTradeTimeInt(StartHour,StartMin,EndHour,EndMin) && trade)
     {
      if(AllProfit()<-LockLoss && LockLoss>0 && CountOrders(0)<CountOrders(1)) {PutLockOrder(0,Ask); trade=false;}
      if(AllProfit()<-LockLoss && LockLoss>0 && CountOrders(1)<CountOrders(0)) {PutLockOrder(1,Bid); trade=false;}
     }
     
   Comment("\n All Profit: ",AllProfit(),
           "\n Count Trades: ",CountTrades(),
           "\n Count Buy: ",CountOrders(0),
           "\n Count Sell: ",CountOrders(1),
           "\n Count Buy Lots: ",CountLots(0),
           "\n Count Sell Lots: ",CountLots(1));
  }
//+------------------------------------------------------------------+



avatar

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

  • 19 апреля 2017, 18:26
+
0
Благодарю.
Что значит 1.1 в extern double Start = 1.1; // старт? Какие ещё варианты?

LockLoss = 3000; // убыток когда ставим лок — по времени окончания работы Лок тоже ставится?

Сов. будет работать на ТФ который установлен в окне с ним?

Пока проверил только в тестере, почему-то открывает одни Селлы — при Start = 1.1;.
при Start = 0; — одни Баи
Причём и выше, и ниже старт. ордера. Проверял и на Н1 и на меньших ТФ.
Редактирован: 19 апреля 2017, 23:46
avatar

  11  preasto Автор Сообщений: 445

  • 19 апреля 2017, 23:37
+
+1
Если вы внимательно почитаете последний комментарий от AM2, в котором код советника, то там написано, что такое «старт».
avatar

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

  • 20 апреля 2017, 00:58
+
0
Благодарю за подсказку :) 
avatar

  11  preasto Автор Сообщений: 445

  • 20 апреля 2017, 09:44
+
0
Понятно. extern double Start = 1.1; // старт
это цена старт ордера. Типа линии(уровня) срабатывания.
<code>extern double Start      = 1.1;      // цена старт ордера</code>

Не сразу понял. Искал прежде всего старт по времени свечи.
Основной старт, по существу, нужен именно по заданному времени на открытии свечи // час и мин. начала торговли,
закрытие — // час и мин. окончания торговли.
К нему — задание направления старт-ордера Бай или Селл.

В начальной версии сов. AllCandle.mq4 и было:
<code>extern int    Type         = 0;        // 0-Buy,1-Sell
extern int    Try          = 5;        // количество попыток выставить ордер</code>


Работа от уровней цены — это как доп. опция, для тестов по такому принципу.
Так, задав цену старта — работает и в Бай, и в Селл.

Дополнить бы, так же, старт по времени // в час и мин. начала торговли — на открытии свечи
с локом на закрытие — // час и мин. окончания торговли — на открытии свечи за крайней
И будет полный комплект, то, что надо.
*good* 

***
ЗЫ Видимо, как не программист, подумал, что будет легче дополнить тот советник.
М.б. лучше было давать ТЗ «с чистого листа»,
типа, как в комменте выше: zakaz.opentraders.ru/38438.html#comment130002
*???* 
Редактирован: 20 апреля 2017, 09:53
avatar

  11  preasto Автор Сообщений: 445

  • 20 апреля 2017, 09:43
+
0
Андрей, благодарю. Вроде по логике всё работает.
Можно тут сделать и базовое открытие старт-ордера просто в заданное время, с указанием направления, так:
<code>extern int  Type = 1;  // 1-Buy,2-Sell
extern int  Try  = 5;  // количество попыток выставить ордер</code>

На открытии след. свечи после крайней по времени окончания торговли.
Или на той, что указана как время окончания.

И переключать выбор типа старта(цена, или время) отдельным параметром.

И, по-возможности, установку полного лока по времени окончания торговли.

Если, что, вот скрипт ScriptLocker, к-й вычисляет объём и направление совокупной позиции,
после чего открывает одну-единственную встречную позицию, локирующую все остальные.
Наверное, его функцию можно применить к сигналу по времени окончания торговли.

<code>//+------------------------------------------------------------------+
//|                                                 ScriptLocker.mq4 |
//|                                                           jonxxx |
//|                                             http://pitforex.com/ |
//+------------------------------------------------------------------+
#property copyright "jonxxx"
#property link      "http://pitforex.com/"

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start()
{
	double Lots=0;
	for(int i=0;i<OrdersTotal();i++)
	{
		if(!OrderSelect(i,SELECT_BY_POS))
			continue;
		if(OrderSymbol()!=Symbol())
			continue;
		if(OrderType()==OP_BUY)
			Lots+=OrderLots();
		if(OrderType()==OP_SELL)
			Lots-=OrderLots();
	}
	if(Lots>0)
		OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,NULL,Red);
	if(Lots<0)
		OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,0,0,NULL,Blue);
}
//+------------------------------------------------------------------+</code>

Редактирован: 20 апреля 2017, 22:52
avatar

  11  preasto Автор Сообщений: 445

  • 20 апреля 2017, 22:41

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