Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2282

 
Roman Shiredchenko #:

Коллеги вопрос сам разобрал и решил, кому надо сумма лотов ордеров по направлениям: считаю лоты ордеров по направлениям бай и селл

 


если задействовать OO и сначала подумать над вариантами use-case,
то можно было сделать элегантную конструкцию, чтобы потом многократно использовать.

в стиле :

// сумма лотов в направлении вверх
double lots=AggregateOrders(OrderLots, DirectionIs(DIRECTION_LONG));
// потом может понадобится например посчитать профит ордеров с комментом "hello"
double lots=AggregateOrders(OrderProfit,CommentContain("hello"));

// а всего-то 
typedef double (*getOrderValueProc)();
double *AggregateOrders(getOrderValueProc proc, FilterSelected &filter); // FilterSelected - класс фильтра ордеров выбранных по Select, c методом bool Test() и конструкторами копирования
 
Tretyakov Rostyslav #:
Здесь
спс. Ее тоже - ф-ию заюзаю....



 
Maxim Kuznetsov #:

если задействовать OO и сначала подумать над вариантами use-case,
то можно было сделать элегантную конструкцию, чтобы потом многократно использовать.

в стиле :

спс. Разберу....
 

проверьте пожалуйста элемент кода

{     

      ticket = OrderSend(Symbol(),OP_SELL, Lot, Bid, slippage, 0, 0,NULL, Magic,0, Red);

 

  if (TimeCurrent()>OrderOpenTime()+15*60) OrderClose(ticket,Lot,Bid,slippage,Green);


      if (ticket>0)

      {

      SL = NormalizeDouble(Ask + stoploss*Point, Digits);

      TP = NormalizeDouble(Bid - takeprofit*Point, Digits);

      if (OrderSelect(ticket,SELECT_BY_TICKET))

      if (OrderModify(ticket, OrderOpenPrice(),SL, TP,0))

         Print ("Ошибка модификации ордера");

    должен закрывать ордер через 15 минут, а закрывает сразу и не всегда


      }

 
hp0007 #:

Перед использованием OrderOpenTime() нужно выбрать ордер OrderSelect

 
Aleksei Stepanenko #:

Перед использованием OrderOpenTime() нужно выбрать ордер OrderSelect

      OrderSelect(ticket,SELECT_BY_TICKET);

  if (TimeCurrent()>OrderOpenTime()+15*60) OrderClose(ticket,Lot,Ask,slippage,Green);

Так?

 

Да, а то получается, что Вы запрашиваете время открытия ордера, который выбирали в прошлый раз по коду ниже, или вообще не выбирали

if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
   if (TimeCurrent()>OrderOpenTime()+15*60) OrderClose(ticket,Lot,Bid,slippage,Green);
   }
 
Aleksei Stepanenko #:

Да, а то получается, что вы запрашиваете время открытия ордера, который выбирали в прошлый раз по коду ниже, или вообще не выбирали

{     

      ticket = OrderSend(Symbol(),OP_SELL, Lot, Bid, slippage, 0, 0,NULL, Magic,0, Red);

         if (ticket>0)

      {

      SL = NormalizeDouble(Ask + stoploss*Point, Digits);

      TP = NormalizeDouble(Bid - takeprofit*Point, Digits);

      if (OrderSelect(ticket,SELECT_BY_TICKET))

      if (OrderModify(ticket, OrderOpenPrice(),SL, TP,0))

         Print ("Ошибка модификации ордера");

         }

if(OrderSelect(ticket,SELECT_BY_TICKET))

   {

   if (TimeCurrent()>OrderOpenTime()+15*60) OrderClose(ticket,Lot,Bid,slippage,Green);

   }

      }

//---------------------

на тестере не закрывает через 15 минут, а вышебает по S/L

 

Используйте printf() для поиска ошибок. Проверьте, доступна ли переменная ticket перед вызовом OrderSelect

{     

      ticket = OrderSend(Symbol(),OP_SELL, Lot, Bid, slippage, 0, 0,NULL, Magic,0, Red);
printf("При открытии: "+(string)ticket);
         if (ticket>0)

      {

      SL = NormalizeDouble(Ask + stoploss*Point, Digits);

      TP = NormalizeDouble(Bid - takeprofit*Point, Digits);

      if (OrderSelect(ticket,SELECT_BY_TICKET))

      if (OrderModify(ticket, OrderOpenPrice(),SL, TP,0))

         Print ("Ошибка модификации ордера");

         }
printf("перед выбором: "+(string)ticket);
if(OrderSelect(ticket,SELECT_BY_TICKET))

   {
printf("текущее время: "+TimeToString(TimeCurrent())+", время закрытия: "+TimeToString(OrderOpenTime()+15*60));
   if (TimeCurrent()>OrderOpenTime()+15*60) OrderClose(ticket,Lot,Bid,slippage,Green);

   }

      }

И сравнивайте ожидаемое с результатом

 
Aleksei Stepanenko #:
"перед выбором: "

А где 

"перед выбором: "
"текущее время: "
", время закрытия: "

там что должно быть?

и как сравнивать  ожидаемое с результатом?

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