Удалить отложенный ордер по времени! - страница 2

 
Alexey Volchanskiy:

Вы писали Aibek Mugiynovчто-то не пашет у меня (.. 

И где тут работа со временем отложенных ордеров?

//+------------------------------------------------------------------+
//|                                                      AibekuS.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Мугинов Айбек"
#property link      "aibekus92@gmail.com"
extern double   LotProc=0.1;
extern double Lot=0.1;
extern int    TP=0;
extern int    SL=0;
 input int LIFETIME=5; // Время жизни отложенного ордера (в барах)
extern int    Tral=1000;
input double  MA_high =50;
input double  MA_low =5;
extern int    step=3000;
extern int    Magic=123;
double MaxProfit,MaxPercentTotalProfit,DrawPointBuyMax,DrawPointSellMax;  // для индюка
string gs_140 = "lblfin_";
int D;
int init()
  {D=1;
  if (Digits==5 || Digits==4)D=10;
  return(0);}
 int      nOrderType     = OrderType();
   int      nOrderTicket   = OrderTicket();
   datetime dOrderOpenTime = OrderOpenTime();
   int      nLifeTime      = iBarShift(_Symbol, PERIOD_CURRENT, dOrderOpenTime);
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{double Lot=0;
  Trail();
   if(LotProc>0)Lot=NormalizeDouble(AccountBalance()/100*LotProc/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
   if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
double Lots=0;
double bsl,btp,ssl,stp;  
 if(SL!=0) {bsl=Ask-SL*Point-step*Point;ssl=Bid+SL*Point+step*Point;}
 if(TP!=0) {btp=Ask+TP*Point+step*Point;stp=Bid-TP*Point-step*Point;}
//----
double MA_L=iMA(NULL,0,MA_low,0,MODE_EMA,PRICE_CLOSE,0); 
double MA_H=iMA(NULL,0,MA_high,0,MODE_EMA,PRICE_CLOSE,0); 
if(Count()==0)
  {if(MA_L>MA_H )  OrderSend(Symbol(),4,Lot,Ask+step*Point,3,bsl,btp,"Aibek",Magic);
   if(MA_L<MA_H )  OrderSend(Symbol(),5,Lot,Bid-step*Point,3,ssl,stp,"Aibek",Magic);
    if(nOrderType==OP_BUYLIMIT || nOrderType==OP_SELLLIMIT ||
      nOrderType==OP_BUYSTOP  || nOrderType==OP_SELLSTOP) {
   // Проверить время жизни отложенного ордера в барах
      if (nLifeTime>=LIFETIME) {
         if (!OrderDelete(nOrderTicket)) { // удалить ордер
            int err=GetLastError();
            Print("*** Ошибка удаления ордера #", nOrderTicket, ", код ошибки #", err);
   }  }  }
}}
 //+--------------Определяем кол-во ордеров------------------------------+
int Count()
{int count=0;
 for(int i=OrdersTotal()-1;i>=0;i--)
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {if(Symbol()==OrderSymbol() && OrderMagicNumber()==Magic) count++;}
   return(count);}
 //+--------
 //--------------------------Трейлинг стоп------------------------------+
void Trail()
{for(int i=0; i<OrdersTotal(); i++)
if (OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(Tral!=0){
if (OrderType()==OP_BUY && Bid>MathMax(OrderOpenPrice(),OrderStopLoss())+Tral*Point)
if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Tral*Point,OrderTakeProfit(),0))
{}
if (OrderType()==OP_SELL && ((Ask<MathMin(OrderOpenPrice(),OrderStopLoss())-Tral*Point && 
OrderStopLoss()!=0)||(Ask<OrderOpenPrice()-Tral*Point && OrderStopLoss()==0)))
if (!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Tral*Point,OrderTakeProfit(),0))
{}}}}
Вот так я сделал... возможно, что-то делаю не так!
 
Да, уж, молодой человек, Вы сначала поясните зачем Вам вообще понадобилась проверка времени жизни отложенных ордеров, если советник их не выставляет?
 
Eugene Myzrov:
Да, уж, молодой человек, Вы сначала поясните зачем Вам вообще понадобилась проверка времени жизни отложенных ордеров, если советник их не выставляет?

как не выставляет??? Отложки работают, отлично! 

 

Мне надо, чтобы спустя 30 минут.. если ордер не сработает... должна удалиться отложка!

 
сорри, не заметил сразу Ваш необычный стиль использовать коды ордеров вместо текстовых констант:

OP_BUYSTOP

4

Отложенный ордер BUY STOP

OP_SELLSTOP

5

Отложенный ордер SELL STOP

 


тогда проверку на время жизни надо вставить сюда:

//--------------------------Трейлинг стоп------------------------------+
void Trail()
{for(int i=0; i<OrdersTotal(); i++)
if (OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
////////////////////////////////////////////////////////////////////////////////////
   int      nOrderType     = OrderType();
   int      nOrderTicket   = OrderTicket();
   datetime dOrderOpenTime = OrderOpenTime();
   int      nLifeTime      = iBarShift(_Symbol, PERIOD_CURRENT, dOrderOpenTime);

   if (nOrderType==OP_BUYSTOP  || nOrderType==OP_SELLSTOP) {
   // Проверить время жизни отложенного ордера в барах
      if (nLifeTime>=LIFETIME) {
         if (!OrderDelete(nOrderTicket)) { // удалить ордер
            int err=GetLastError();
            Print("*** Ошибка удаления ордера #", nOrderTicket, ", код ошибки #", err);
   }  }  }
////////////////////////////////////////////////////////////////////////////////////

if(Tral!=0){
if (OrderType()==OP_BUY && Bid>MathMax(OrderOpenPrice(),OrderStopLoss())+Tral*Point)
if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Tral*Point,OrderTakeProfit(),0))
{}
if (OrderType()==OP_SELL && ((Ask<MathMin(OrderOpenPrice(),OrderStopLoss())-Tral*Point && 
OrderStopLoss()!=0)||(Ask<OrderOpenPrice()-Tral*Point && OrderStopLoss()==0)))
if (!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Tral*Point,OrderTakeProfit(),0))
{}}}}
 
Eugene Myzrov:
сорри, не заметил сразу Ваш необычный стиль использовать коды ордеров вместо текстовых констант:

OP_BUYSTOP

4

Отложенный ордер BUY STOP

OP_SELLSTOP

5

Отложенный ордер SELL STOP

Всё норм) так поможете мне? Я раньше знал, полтора года как не работал и все шаблоны потерял... вот сижу и не могу найти что-то подобное, перепробовал массу вариантов( не идет, что-то.. думаю делаю что-то не так, хотя советник работает на все 100%
 
Eugene Myzrov:


тогда проверку на время жизни надо вставить сюда:

Спасибо большое)))! Заработало! 
 
/*
где то в настройках 
input int timeout=60; //время в минутах
input int order_magic=111;
*/

for(i=OrdersTotal()-1;i>=0;i--){
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==order_magic && OrderType()>=2){
         
         if(TimeCurrent()-OrderOpenTime()>=timeout*60) main.OrderClose(OrderTicket(),-1,clrNONE); 
         
      }
   }

/*
main.OrderClose(OrderTicket(),-1,clrNONE); 
вместо этой функции можете использовать стандартную функцию OrderDelete
*/
делаю обычно так для удаления отложек по истечении заданного времени, если нужна высокая точность то лучше сделать "эвент" из таймера с 1 секундой.
 
Alexandr Gavrilin:
делаю обычно так для удаления отложек по истечении заданного времени, если нужна высокая точность то лучше сделать "эвент" из таймера с 1 секундой.
Спасибо, но вопрос уже решен)) 
 

Них не понял.

А чем предпоследний параметр в Ordersend не нравится?

TimeCurrent()+minutes_delete*60 

Причина обращения: