TRADE_RETCODE_FROZEN - страница 2

 
prostotrader:

Ваша версия имела бы под собой здравый смысл, я если бы пытался выставить отложенный ордер, но я (советник) пытался МОДИФИЦИРОВАТЬ уже выставленный отложенный ордер.

А другие ошибки сыпались в журнал?

 
Vladimir Karputov:

А другие ошибки сыпались в журнал?

Сейчас именно этим и занимаюсь.

2018.02.12 10:00:02.156 Trades  'xxxxx': sell limit 1.00 MOEX-6.18 at 11858
2018.02.12 10:00:02.703 Trades  'xxxxx': accepted sell limit 1.00 MOEX-6.18 at 11858
2018.02.12 10:00:02.786 Trades  'xxxxx': sell limit 1.00 MOEX-6.18 at 11858 placed for execution in 628.149 ms
2018.02.12 10:00:03.189 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11858 sl: 0 tp: 0 -> 11856, sl: 0 tp: 0
2018.02.12 10:00:03.195 Trades  'xxxxx': accepted modify order #84129891 sell limit 1.00 MOEX-6.18 at 11858 sl: 0 tp: 0 -> 11856, sl: 0 tp: 0
2018.02.12 10:00:03.196 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11858 sl: 0 tp: 0 -> 11856, sl: 0 tp: 0 placed for execution in 7.114 ms
2018.02.12 10:00:04.178 Trades  'xxxxx': buy limit 2.00 MOEX-6.18 at 10582
2018.02.12 10:00:04.185 Trades  'xxxxx': accepted buy limit 2.00 MOEX-6.18 at 10582
2018.02.12 10:00:04.191 Trades  'xxxxx': buy limit 2.00 MOEX-6.18 at 10582 placed for execution in 12.494 ms
2018.02.12 10:00:06.126 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0
2018.02.12 10:00:07.841 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0
2018.02.12 10:00:08.137 Trades  'xxxxx': accepted modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0
2018.02.12 10:00:08.145 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0 placed for execution in 2019.560 ms
2018.02.12 10:00:08.162 Trades  'xxxxx': failed modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0 [Modification failed due to order or position being close to market]

Пока не разобрался, но видно, что была огромная задержка 2019,560 мс

Добавлено

Вот причина ошибки

2018.02.12 10:00:06.126 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0
2018.02.12 10:00:07.841 Trades  'xxxxx': modify order #84129891 sell limit 1.00 MOEX-6.18 at 11856 sl: 0 tp: 0 -> 11457, sl: 0 tp: 0

Это очень странно, советник не предпринимает никаких действий, пока не выяснит состояние ТЕКУЩЕЙ операции.

 
prostotrader:

Сейчас именно этим и занимаюсь.

Пока не разобрался, но видно, что была огромная задержка 2019,560 мс

Добавлено

Вот причина ошибки

Это очень странно, советник не предпринимает никаких действий, пока не выяснит состояние ТЕКУЩЕЙ операции.

Выходит имеет смысл проверять ORDER_STATE перед модификацией.

 
Vladimir Karputov:

Выходит имеет смысл проверять ORDER_STATE перед модификацией.

Именно это, каждый раз и делается.

Видимо, это какой-то сбой сервера, потому что ранее таких ошибок небыло.

 
prostotrader:

Это очень странно, советник не предпринимает никаких действий, пока не выяснит состояние ТЕКУЩЕЙ операции.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2018.02.06 07:41

OnTradeTransaction позволяет написать неторговый советник (Сервис), отслеживающий наличие запущенного на счете торгового "клона"-советника. Такие ситуации иногда случаются по невнимательности.
 
prostotrader:

Именно это, каждый раз и делается.

Видимо, это какой-то сбой сервера, потому что ранее таких ошибок небыло.

Кусок кода?

 
fxsaber:

Кусок кода?

void OnBookEvent(const string &symbol)
{
if(CheckMarketTime() && is_connected && (main_request_id == 0) && is_trade &&
    ((BuyOrder.state == ORD_NO_STATE) || (BuyOrder.state == ORD_WORK)) &&
    ((SellOrder.state == ORD_NO_STATE) || (SellOrder.state == ORD_WORK)))
{
  
}
}

Ничего не делается, если состояние ордера отлично от ORD_NO_STATE или ORD_WORK

Состояние отложенного ордера (BuyOrder,SellOrder - только отложенные ордера )

enum ENUM_ORD_STATE
{
  ORD_NO_STATE   = 0,
  ORD_DO_SET     = 1,
  ORD_DO_MODIFY  = 2,
  ORD_WORK       = 3,
  ORD_DO_CANCEL  = 4
};

Добавлено

void COrder::Modify(const double price)
{
  req_id = 0;
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  request.action    = TRADE_ACTION_MODIFY;
  request.magic     = mem_magic;
  request.symbol    = a_symbol;
  request.order     = ticket;
  request.price     = price;
  request.type_time = ORDER_TIME_DAY;
  if(OrderSendAsync(request, result))
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) 
    {
      req_id = result.request_id;
      modify_price = price;
      state = ORD_DO_MODIFY;
      mem_time = GetMicrosecondCount();
      mem_start_time = TimeCurrent();
      SetTransCount();
    }
    else
    {
      mem_magic = 0;
      mem_time = 0;
      mem_start_time = 0;
      CheckError(result.retcode, "Modify: Ордер не модифицирован! Причина: ", order_status, ticket);
    }
  }
  else
  {
    mem_magic = 0;
    mem_time = 0;
    mem_start_time = 0;
    CheckError(result.retcode, "Modify: Ордер не отослан! Причина: ", order_status, ticket);
  }
}

Соответстенно в OnTardeTransaction

Состояние ордера изменяется

case TRADE_TRANSACTION_ORDER_UPDATE:
      switch(trans.order_state)
      {
        case ORDER_STATE_PLACED:
          if((BuyOrder.ticket > 0) && (trans.order == BuyOrder.ticket))
          {
            switch(BuyOrder.state)
            {
              case ORD_DO_SET:
                BuyOrder.ses_ord_count++;
                BuyOrder.CalcZalog();
                BuyOrder.state = ORD_WORK;
                BuyOrder.mem_time = GetMicrosecondCount();
                if(stop_trading)
                {
                  if(OrderRealSelect(BuyOrder.ticket, order_data, false) == SELECT_TRUE)
                  {
                    BuyOrder.Remove();
                  }  
                }  
              break; 
              case ORD_DO_MODIFY:
                BuyOrder.modify_price = 0;
                BuyOrder.modify_count++;
                BuyOrder.state = ORD_WORK;
                BuyOrder.mem_time = GetMicrosecondCount();
              break;
            }
          }
          else
          if((SellOrder.ticket > 0) && (trans.order == SellOrder.ticket))
          {
            switch(SellOrder.state)
            {
              case ORD_DO_SET:
                SellOrder.ses_ord_count++;   
                SellOrder.CalcZalog();
                SellOrder.state = ORD_WORK;
                SellOrder.mem_time = GetMicrosecondCount();
                if(stop_trading)
                {
                  if(OrderRealSelect(SellOrder.ticket, order_data, false) == SELECT_TRUE)
                  {
                    SellOrder.Remove();
                  }  
                }
              break; 
              case ORD_DO_MODIFY:
                SellOrder.modify_price = 0;
                SellOrder.modify_count++;
                SellOrder.state = ORD_WORK;
                SellOrder.mem_time = GetMicrosecondCount();
              break;        
            }
          }
        break;
Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
prostotrader:

Ничего не делается, если состояние ордера отлично от ORD_NO_STATE или ORD_WORK

Состояние отложенного ордера (BuyOrder,SellOrder - только отложенные ордера )

Добавлено

Соответстенно в OnTardeTransaction

Состояние ордера изменяется

Ничего же непонятно!

 
fxsaber:

Ничего же непонятно!

Что не понятно?

Вам прислать все 8000 строк кода?

Добавлено

1. Отложенный ордер уже стоит в системе.

2. При его модификации ему прсваивается состояние state = ORD_DO_MODIFY;

3. Только в OnBookEvent просходмт анализ и дальнейшая работа советника, при

состоянии ордеров ORD_WORK или ORD_NO_STATE

3. Состояние ордера изменяется в OnTradeTransaction

case ORD_DO_MODIFY:
                SellOrder.modify_price = 0;
                SellOrder.modify_count++;
                SellOrder.state = ORD_WORK;
                SellOrder.mem_time = GetMicrosecondCount();
              break; 
 
prostotrader:

Что не понятно?

Буквально все! Лучше бы ничего не выкладывали, чем так.

prostotrader:

Вам прислать все 8000 строк кода?

Если другого пути не видите, да.
Причина обращения: