Krokus377
Андрей

 
Уровень 16

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


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

Рейтинг 2087



РЕКОМЕНДУЮ



Требуется доработка советника

Здравствуйте, Андрей!
Вы когда-то, писали для меня советник-помощник.
Работает он хорошо, но в нём, не хватает функции удаления отложенных ордеров. Изначально, в тех. задании, я прописывал данную функцию, но вы её, не осуществили…
В общем, нужно, чтобы удалялся отложенный ордер, после закрытия основного, для которого он был выставлен. Отложка должна удаляться, не зависимо от того, каким способом закрылся основной ордер: по профиту, лосю, или вручную.

Заранее, благодарен!
  • +1
  • Просмотров: 5229
  • 3 мая 2017, 22:05
  • Krokus377
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
РОБОТ – ПРОБОЙНИК УТРЕННЕГО ФЛЕТА "MorningFlet".
Следующая запись в группе  
Доработка индикатора
03 мая 2017
04 мая 2017

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

+
0
В порядке очереди буду смотреть.
avatar

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

  • 4 мая 2017, 17:58
+
0
Хорошо, подожду.
avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 4 мая 2017, 18:37
+
0
Бай закрылся, ордер удалился. Версия с базы, ничего не менял.

avatar

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

  • 5 мая 2017, 18:23
+
0
Андрей, ситуация следующая:
Удаляются, только при единичном ордере, либо, после закрытия всех ордеров.
Например:
Открыт, один ордер бай. После его закрытия, удалилась отложка.
Открыт, один ордер селл. После его закрытия, удалилась отложка.
Открыт ордер бай и селл, или два бая, и один селл. Закрываем один из ордеров, отложка не удаляется. После закрытия всех ордеров, удаляются все отложки.
Редактирован: 5 мая 2017, 22:00
avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 5 мая 2017, 21:59
+
0
Открыт ордер бай и селл, или два бая, и один селл. Закрываем один из ордеров, отложка не удаляется.


Каким образом у вас не удаляется если в советнике стоит контроль открытия только одной позиции? 2 или 3 он уже не выставляет. Здесь нужно всю логику переписывать.
avatar

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

  • 6 мая 2017, 09:28
+
0
Каким образом у вас не удаляется если в советнике стоит контроль открытия только одной позиции? 2 или 3 он уже не выставляет. Здесь нужно всю логику переписывать.


Я не знаю, какой там стоит контроль, но он открывает столько отложек, сколько будет открыто рыночных ордеров, т.е. на каждый открытый ордер, своя отложка.
avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 6 мая 2017, 23:24
+
0
Опишите все максимально подробно со скринами, как вы используете советник, что он делает неправильно и т.д.?
avatar

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

  • 6 мая 2017, 09:34
+
0
Опишите все максимально подробно со скринами, как вы используете советник, что он делает неправильно и т.д.?


Думаю, скрины здесь, ни к чему. Объясню подробно:

Советник я использую вместо стопа, при ручной торговле. Т.е., если цена резко «рванёт», не в мою пользу, то открывается отложка, которую выставил советник. Образуется лок, из которого, я потом выхожу. Если рабочий ордер будет закрыт, и отложка не сработала, то после его закрытия, эта отложка автоматически удаляется. Оно, всё так и происходит. Но суть в том, что при работе, я использую не один, а несколько ордеров, открываемых в разное время. На каждый из них, советник выставляет отложку противоположного направления. Вот здесь, начинается проблема. Когда я закрываю, один из рабочих ордеров, то отложка, выставленная для него советником, не удаляется. Но, после закрытия последнего рабочего ордера, все имеющиеся отложки удаляются вместе.
Надеюсь, объяснил доступно, если не всё понятно, спрашивайте — поясню. Попробуйте сами на демке, и всё станет ясно.
avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 6 мая 2017, 23:47
+
0
Сделал удаление отложек по следующему алгоритму: www.opentraders.ru/downloads/1272/

/*
1. Проверяем последнюю закрытую позицию
2. Смотрим цену открытия позиции
3. Смотрим направление позиции
4. Проверяем наличие отложки по цене ООП+-дельта
5. Если есть удаляем
*/





Редактирован: 7 мая 2017, 16:58
avatar

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

  • 7 мая 2017, 08:23
+
0
Теперь вообще, как-то странно. Иногда отложки удаляются, но чаще всего, нет. Раньше, после закрытия всех рыночных ордеров, все отложки удалялись вместе, а сейчас, рыночных может не быть, а отложки остаются.
avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 8 мая 2017, 12:57
+
0
Открыл 2 позы бай и селл, выставил отложки:



Закрыл продажу, удалился байстоп:



Закрыл покупку удалился селлстоп:



А где ваши скрины? :) 


//+------------------------------------------------------------------+
//|                                                      Poshnik.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 Delta         = 100;      // расстояние от цены
extern int BuySell       = 0;        // 1-buy 2-sell 0-off
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| 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,Lot(),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(OrderType()<2) count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MarketOOP()
  {
   double oop=0;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderType()<2) oop=OrderOpenPrice();
     }

   return(oop);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   double op=0;
   bool d=true;
/*
1. Проверяем последнюю закрытую позицию
2. Смотрим цену открытия позиции
3. Смотрим направление позиции
4. Проверяем наличие отложки по цене ООП+-дельта
5. Если есть удаляем
*/
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      op=OrderOpenPrice();
     }
     
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==4 && OrderOpenPrice()==NormalizeDouble((op+Delta*Point),Digits)) d=OrderDelete(OrderTicket());
         if(OrderType()==5 && OrderOpenPrice()==NormalizeDouble((op-Delta*Point),Digits)) d=OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MarketLot()
  {
   double lot=0;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderType()<2) lot=OrderLots();
     }

   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(Lots==0) lot=MarketLot();

   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastType()
  {
   int type=8;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderType()<2) type=OrderType();
     }

   return(type);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double StopOOP()
  {
   double oop=0;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderType()>1) oop=OrderOpenPrice();
     }

   return(oop);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   DelOrder();
   
   if(CountTrades()<1)
     {
      if(BuySell==1) PutOrder(0,Ask);
      if(BuySell==2) PutOrder(1,Bid);
     }

   if(MarketOOP()>0 && StopOOP()!=NormalizeDouble(MarketOOP()-Delta*Point,Digits) && LastType()==0) PutOrder(5,MarketOOP()-Delta*Point);
   if(MarketOOP()>0 && StopOOP()!=NormalizeDouble(MarketOOP()+Delta*Point,Digits) && LastType()==1) PutOrder(4,MarketOOP()+Delta*Point);
  }
//+------------------------------------------------------------------+

avatar

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

  • 8 мая 2017, 13:28
+
0
Открыл 2 позы бай и селл, выставил отложки:



Закрыл продажу, байстоп не удалился:



Закрыл покупку, селлстоп не удалился:

avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 8 мая 2017, 14:30
+
0
Последний вариант постом выше смотрели?
avatar

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

  • 8 мая 2017, 17:23
+
0
Последний вариант постом выше смотрели?


Именно с ним, результаты на скринах.
avatar

  16  Krokus377 Автор Сообщений: 226 - Андрей

  • 8 мая 2017, 18:41
+
0
Я протестировал, у меня все работает. Если у вас не работает, обратитесь к другому специалисту.
avatar

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

  • 9 мая 2017, 07:56

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