Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Скачай документацию одним файлом. Это просто!
Mikhail Filimonov
5919
Mikhail Filimonov 2013.05.08 01:10 

Добрый день!

Из справки MQL5:

Pending Order - Торговый приказ на установку отложенного ордера. Требуется указание 11 полей:

·1. action

·2. symbol

·3. volume

·4. price

·5. stoplimit

·6. sl

·7. tp

·8. type

·9. type_filling

·10. type_time

·11. expiration

Можно также задать значения полей 12. magic и 13. comment. 

 

Скриншот терминала на установку отложенного ордера:

 

 

 

Из моего кода:

1.  request.action       = TRADE_ACTION_PENDING;
2.  request.symbol       = _Symbol;
3.  request.volume       = volume;
4.  request.price        = price;
(5)
6.  request.sl           = 0;
7.  request.tp           = 0;
8.  request.type         = ORDER_TYPE_BUY_LIMIT;
9.  request.type_filling = ORDER_FILLING_FOK;
(10)
(11)
12. request.magic        = MagicNumber;
13. request.comment      = "Buy...";

Вопрос:

Почему, после отправки команды OrderSend()

result.retcode == TRADE_RETCODE_INVALID_EXPIRATION (10022 - Неверная дата истечения ордера в запросе ),

хотя на скриншоте ясно видно, что ни Истечение(10), ни Дата истечения(11) - не доступны?

Как же правильно заполнить структуру MqlTradeRequest ? 

 

 

MetaQuotes
Админ
24626
Renat Fatkhullin 2013.05.08 03:19  
Неиспользуемые поля должны быть занулены в обязательном порядке, чтобы ордер прошел жесткую проверку.

Мы специально не пропускаем небрежно заполненные транзакции.
Mikhail Filimonov
5919
Mikhail Filimonov 2013.05.08 05:54  

Renat:
Неиспользуемые поля должны быть занулены в обязательном порядке, чтобы ордер прошел жесткую проверку.

Мы специально не пропускаем небрежно заполненные транзакции.

 

Renat,

Если Вам не составит труда,

напишите пожалуйста, что должно быть в полях

(5)

(10)

(11)

Естественно, перед заполнением request я делаю

MqlTradeRequest   request = {0};
  MqlTradeResult    result  = {0};  

 

А вот результат постановки ордера с терминала "ручками"

 

 

Комментарий нужно было добавить? 

 

o_O
Модератор
23472
o_O 2013.05.08 07:28  

Mikalas:

А вот результат постановки ордера с терминала "ручками"

с этого обычно начинают. :)

пишите брокеру. у них некорректное поведение шлюза.

Mikhail Filimonov
5919
Mikhail Filimonov 2013.05.08 15:10  

Добрый день, Renat и sergeev!

Постановка ордера "ручками" не имеет отношения

к моему изначальному вопросу, убедительная просьба

ответить на него. Что должно быть в полях

(5) (10) (11), если перед заполнением Request

выполняется:

MqlTradeRequest   request = {0};
MqlTradeResult    result  = {0};   

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
A100
3632
A100 2013.05.08 15:22  
Mikalas:

MqlTradeRequest   request = {0};
   

Указав это Вы автоматически присвоили

(10) ORDER_TIME_GTC

это такое недоразумение MT5 

FinEngineer
40
FinEngineer 2013.05.08 17:09  
Mikalas:

Добрый день, Renat и sergeev!

Постановка ордера "ручками" не имеет отношения

к моему изначальному вопросу, убедительная просьба

ответить на него. 

Mikalas ! У меня такая же проблема! Вручную все выставляется, а советник не может выставить - ошибка "инвалид экспирэйшен", Вы разобрались с этой проблемой??? Я заполняю структуру таким образом...что я делаю не так?

ZeroMemory(mrequest);

   mrequest.action = TRADE_ACTION_PENDING;                               

   mrequest.magic = magic;                                              

   mrequest.symbol = _Symbol;                                            

   mrequest.type_filling = ORDER_FILLING_RETURN;                            

   mrequest.deviation=NormalizeDouble(Deviation*_Point,_Digits);                                                

   mrequest.type_time=ORDER_TIME_SPECIFIED;

   mrequest.expiration=TimeCurrent()+6000;                                    

   mrequest.volume = lot; 

   mrequest.sl = 0;  

   mrequest.tp = 0; 

   mrequest.price = prise;                                  

   mrequest.type = ORDER_TYPE_BUY_STOP;                              


Mikhail Filimonov
5919
Mikhail Filimonov 2013.05.08 17:19  

pako,

Зачем ВЫ написали своё сообщение(что бы было)?

 

Прочтите начало топика!

 

А100!

Большое спасибо, т.е в терминале автоматически подставляется ORDER_TIME_DAY :)

Вообще-то исходя из общепринятой логики заявка типа ORDER_FILLING_FOK

не должна иметь ВРЕМЕННОГО интервала ( ВСЁ ИЛИ НИЧЕГО ),

что кстати и отражается, когда ставишь заявку "ручками" в терминале поля (10) и (11) не доступны

на первом скриншоте! 

Mikhail Filimonov
5919
Mikhail Filimonov 2013.05.08 17:32  

FinEgineer!

У Вас не такая же проблема!

Дело в том, что заявка  ORDER_TYPE_BUY_STOP ИМЕЕТ временной интервал,

но не имеет type_filling (в терминале этого поля вовсе нет, если выбрать  ORDER_TYPE_BUY_STOP ).

Кстати, где-то на форуме разработчики писали, что лучше использовать mrequest = {0} , нежели ZeroMemory(mrequest); 

Mikhail Filimonov
5919
Mikhail Filimonov 2013.05.08 18:04  

Проверил (подставил request.type_time    = ORDER_TIME_DAY; ) и УРА!

ордер размещается, НО новый поворот!

bool GetStakanValues( const string aSymbol, const bool buy_sell, double &price, long &volume )
{
  MqlBookInfo a_price[];
 
//--- Get stakan
  bool getBook = MarketBookGet( aSymbol, a_price );
  
  if ( getBook )
  {
    int size = ArraySize( a_price );
    if ( size > 0 )
    { 
      for( int i = 0; i < size; i++ )
      {
        if ( buy_sell )
        {
          if ( a_price[i].type == BOOK_TYPE_BUY )
          {
            if ( a_price[i].price > price )
            {
              price = a_price[i].price;
              volume = a_price[i].volume;
            }
          }
        }
        else
        {
          if ( a_price[i].type == BOOK_TYPE_SELL )
          {
            if ( a_price[i].price < price )
            {
              price = a_price[i].price;
              volume = a_price[i].volume;
            }
          }
        }
      }
      return( true );
    }
  }
  return( false );
}

void OnBookEvent ( const string &aSymbol ) 
{
  double price = 0;
  long volume = 0;

  if ( GetStakanValues( _Symbol, true, price, volume ) )
  {
    if ( ( price != 0 ) && ( volume != 0 ) )
    {
      MqlTradeRequest   request = {0};
      MqlTradeResult    result  = {0};
      ulong             order_ticket;

      request.action       = TRADE_ACTION_PENDING;
      request.magic        = MagicNumber;
      request.symbol       = aSymbol;
      request.volume       = volume;
      request.price        = price;
      request.stoplimit    = 0;
      request.sl           = 0;
      request.tp           = 0;
      request.type         = ORDER_TYPE_SELL_LIMIT;
      request.type_filling = ORDER_FILLING_FOK;
      request.type_time    = ORDER_TIME_DAY;
      request.comment    = "Sell...";
      
      if SendOrder( request, result )
      {
        if ( ( result.retcode == TRADE_RETCODE_PLACED ) ||
         ( result.retcode == TRADE_RETCODE_DONE ) ||
         ( result.retcode == TRADE_RETCODE_DONE_PARTIAL ) ) 
        {
          order_ticket = result.order;
        }
      }
    }
  }
}

 order_ticket > 0  - принят сервером, а вот дальше, УВЫ!

Цена и объём, взятые из стакана цен по инструменту отклоняются сервером,

при этом выдаётся сообщение

 

 

Как видно из скриншота заявка выставлялась ДВА  РАЗА, 

это говорит о том, что ЦЕНА в стакане НЕ ИЗМЕНИЛАСЬ,

так почему же заявка не исполняется

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