Ошибка заявки на FORTS (Market closed) - страница 4

 
Renat:

Давайте подведем итог: вы не предоставили доказательств открытия рынка по данному инструменту и показали локальный лог в локальном времени.

Очень неразумно продолжать повторять про открытие рынка и делать вид, что вы не понимаете.

Я не могу предоставить никаких доказательств по определению. Терминал не хранит ничего (вернее, все что он хранит, я уже выложил здесь), а все мои логи тоже в локальном времени

Я не делаю вид, я не понимаю что вы пытаетесь доказать. У вас на сервере неправильно идет время, а вы продолжаете утверждать что это тупые клиенты отвлекают вас от работы. Ну посмотрите по логам, Открытие Access Server 3 сегодня с 14:02:59 по 14:03:02 какие ордера отправлялись клиентами и что с ними стало. А еще лучше, проверьте время этого сервера.

 

turspb!

Вот код, который даст Вам все доказательства:

//+------------------------------------------------------------------+
//|                                                    Time_test.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
MqlTick my_tick[1];
//
ulong my_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    MarketBookAdd( _Symbol );
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
     MarketBookRelease( _Symbol ); 
  }
  //+------------------------------------------------------------------+
//| Expert set order function                                        |
//+------------------------------------------------------------------+
void SetOrder( const string aSymbol, const double price, const double volume,
               ulong &ticket, const bool buy_sell )
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  ticket = 0; 
//--- Fill structure
  request.magic        = 987456321;
  request.symbol       = aSymbol;
  request.volume       = volume; 
  request.type_filling = ORDER_FILLING_IOC;
  request.type_time    = ORDER_TIME_DAY;
    
  if ( price == 0 )
  {
    request.action     = TRADE_ACTION_DEAL;
    request.comment    = "Рыночный ордер...";
//---    
    if ( buy_sell )
    {
      request.type     = ORDER_TYPE_BUY;
    }
    else
    {
      request.type     = ORDER_TYPE_SELL;
    }
  }
  else
  { 
    request.action     = TRADE_ACTION_PENDING;
    request.price      = price;
    request.comment    = "Лимитный ордер...";
//---    
    if (buy_sell)
    {
      request.type     = ORDER_TYPE_BUY_LIMIT;
    }
    else
    {
      request.type     = ORDER_TYPE_SELL_LIMIT;
    }   
  }  
//--- Send order
  if ( OrderSend( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      ticket = result.order;
    }
  }
  else
  {
    Print( "Установка ордера не выполнена! ", aSymbol );
  }
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
    if ( symbol == _Symbol )
    {
      if ( CopyTicks( _Symbol, my_tick, COPY_TICKS_ALL, 0, 1 ) )
      {
        SetOrder( _Symbol, my_tick[0].ask, 1, my_ticket, true );
        
        if ( my_ticket > 0 )
        {
          Print( "Bingo! My order placed to Market!" );
        }
        else
        {
          Print( "ERROR! My order NOT placed to Market!" );
          Print( "Time = ", TimeToString( my_tick[0].time ) );
          Print( "Price = ", my_tick[0].ask );
        }
        ExpertRemove();  
      }
    }
  }
//+------------------------------------------------------------------+

 Приложите лог эксперта и лог терминала и всё :)

 
Mikalas:

turspb!

Вот код, который даст Вам все доказательства:

 Приложите лог эксперта и лог терминала и всё :)

Mikalas, большое спасибо!

Но что-то расхотелось что-либо доказывать. 

 

А ещё лучше проверить время котировки,

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

 

void OnBookEvent(const string &symbol)
  {
//---
    if ( symbol == _Symbol )
    {
      if ( CopyTicks( _Symbol, my_tick, COPY_TICKS_INFO, 0, 1 ) == 1 )
      {
        MqlDateTime my_time;
        TimeToStruct( my_tick[0].time, my_time );
//---        
        if ( ( my_time.hour == 19 ) && ( my_time.min == 0 ) && ( my_time.sec >= 0 ) )
        {
          SetOrder( _Symbol, my_tick[0].ask, 1, my_ticket, true );
        
          if ( my_ticket > 0 )
          {
            Print( "Bingo! My order placed to Market!" );
          }
          else
          {
            Print( "ERROR! My order NOT placed to Market!" );
            Print( "Time = ", TimeToString( my_tick[0].time ) );
            Print( "Price = ", my_tick[0].ask );
          }
          
         ExpertRemove();
        }   
      }
    }
  }
 
turspb:

Mikalas, большое спасибо!

Но что-то расхотелось что-либо доказывать. 

Да, порой бывает трудно....

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

До вечернего клиринга 45 мин.:) 

 
turspb:
Не понимаю про какой контроль идет речь. Данные пришли, после клиринга. Значит рынок открылся. По времени тоже должен открытся уже. Заявку в ответ на данные отправил и она отклонена. Каким образом я должен контролировать наличие рыночных данных?
При обработке какого события Вы получили данные? OnTimer? OnBookEvent? OnTick()?
 

Прикольно!

CopyTicks( _Symbol, my_tick, COPY_TICKS_INFO, 0, 1 );

 Возвращает "0" :)

 Не ошибку ( -1 ), а "0" 

 
turspb:

Mikalas, большое спасибо!

Но что-то расхотелось что-либо доказывать. 

В ближайшее время проверим описанное Вами поведение.
 

Очень часть сталкиваюсь с подобной ошибкой, которая была описана в данной теме форума.

При этом, в результате обработки нового тика функцией OnTick() возникает отклонение заявки, отправленной в функции OnTick по причине того, что рынок закрыт.

Привожу выписку из справки терминала MT5:

"Событие NewTick генерируется только для экспертов при поступлении нового тика по символу "

 

Новый тик по символу - это сделка, совершенная на бирже. 

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

 

Предположим, что сообщение терминала "MarketClosed" при отправке заявки моим роботом, выдается справедливо и рынок действительно закрыт.

Но тогда вопрос: почему срабатывает функция OnTick() , если рынок закрыт?

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