133?

 

Здравствуйте. У меня конструкции такого типа  по некоторым инструментам иногда начинают выдавать ошибку: 133 Trade is disabled, хотя MarketInfo(TName,MODE_TRADEALLOWED)==true. Т.е. true не соответствует действительности. Другие инструменты данного счета продолжают нормально открываться/закрываться. 

   if(MarketInfo(TName,MODE_TRADEALLOWED))
   {
      GetLastError();
      n=OrderSend(TName,opType,V,Price,slip,0,0,IntegerToString(DsT[i][j]));
      if(n==-1)
      {
         err=GetLastError();
         Comment("Error = "+IntegerToString(err));
      }         
   }
Можно ли еще как-то определить, что трейдинг разрешен/ не разрешен кроме как через MODE_TRADEALLOWED?

Спасибо 

 

я перед работой с рынком проверяю так (если вернет не ноль значит торговля запрещена):

/// Ждём разрешения торговать


int Error=0;
string symb=Symbol();

void TradeAllowed()
{


if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT)) 
   {Print("Automated trading is forbidden at the trade server side");Error=133;return;}
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) 
   {Print("Trading is forbidden!");Error=64;return;}
if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))  
   {Print("Check if automated trading is allowed in the terminal settings!");Error=4109;return;}
if(!IsTradeAllowed(symb,TimeLocal()))
   {Error=132; Print("Trading on the symbol "+symb+" is forbidden!");return;}

while(IsTradeContextBusy())
   {
   if(IsStopped()) {Error=4;Print("Forced shutdown ");break;}
   Print("Trading is occupied. Wait.");
   Sleep(1000);
   RefreshRates(); 
   }  
}
 
Tecuciztecatl:

я перед работой с рынком проверяю так (если вернет не ноль значит торговля запрещена):

 Нет, не то. Считайте ноль вернет. Советник мультивалютный, по некоторым валютам торговля может быть и закрыта. Это нормально, Но почему по ним MODE_TRADEALLOWED== true?

 

Переменная symb отвечает за проверку конкретного инструмента, инициализируйте ее перед вызовом функции, для проверки нужного символа.

evnt: Но почему по ним MODE_TRADEALLOWED== true?

Может быть выходной день, а вы делаете проверку по времени последней котировки — будет true. Для этого ставим  TimeLocal (см. выше)

Поток может быть занят другим советником, для этого проверяем IsTradeContextBusy (см. выше). 

Могут быть ограниченя на торговлю советником, при разрешенной ручной торговле (см. выше).

 
Tecuciztecatl:

Переменная symb отвечает за проверку конкретного инструмента, инициализируйте ее перед вызовом функции, для проверки нужного символа.

Может быть выходной день, а вы делаете проверку по времени последней котировки — будет true. Для этого ставим  TimeLocal (см. выше)

Поток может быть занят другим советником, для этого проверяем IsTradeContextBusy (см. выше). 

Могут быть ограниченя на торговлю советником, при разрешенной ручной торговле (см. выше).

 

23.03. Повторю вопрос. Мультивалютный советник не в выходной день торгует прямо сейчас, автоматически, НЕ вручную, торгует один, другие советники поток не занимают, совершает сделки по разным инструментам, каждый инициируется перед сделкой, все торгуются, кроме одного инструмента, который показывает ошибку 133 хотя его MODE_TRADEALLOWED== true означает, что торговля разрешена. В другой день, возможно, будет торговать. Код типа Вашего передаст 0

Как определить, что трейдинг разрешен/ не разрешен кроме как через MODE_TRADEALLOWED?

 
evnt:23.03. Повторю вопрос. Мультивалютный советник не в выходной день торгует прямо сейчас, автоматически, НЕ вручную, торгует один, другие советники поток не занимают, совершает сделки по разным инструментам, каждый инициируется перед сделкой, все торгуются, кроме одного инструмента, который показывает ошибку 133 хотя его MODE_TRADEALLOWED== true означает, что торговля разрешена. В другой день, возможно, будет торговать. Код типа Вашего передаст 0

Как определить, что трейдинг разрешен/ не разрешен кроме как через MODE_TRADEALLOWED?

24.03. А  сегодня у другого брокера в той же ситуации возникает ошибка 166 Off quotes при  MODE_TRADEALLOWED==true. Затем торговля пошла. Как, не получая ошибку, заранее узнать, что торговли нет?
 
evnt:

Как определить, что трейдинг разрешен/ не разрешен кроме как через MODE_TRADEALLOWED?

24.03. А  сегодня у другого брокера в той же ситуации возникает ошибка 166 Off quotes при  MODE_TRADEALLOWED==true. Затем торговля пошла. Как, не получая ошибку, заранее узнать, что торговли нет?
Выше ведь уже указали, чем пользоваться - IsTradeAllowed, передавая в нее интересующее время.  А 166-ая ошибка - это совершенно другая опера. Заранее о ней узнать невозможно. 
 
evnt:

Как определить, что трейдинг разрешен/ не разрешен кроме как через MODE_TRADEALLOWED?

24.03. А  сегодня у другого брокера в той же ситуации возникает ошибка 166 Off quotes при  MODE_TRADEALLOWED==true. Затем торговля пошла. Как, не получая ошибку, заранее узнать, что торговли нет?

Off quotes нужно ловить во время установки/модификации ордера, примерно так (на базе вашего кода):

ResetLastError();

err=0;
TradeAllowed(); if (err>0) return; /// Ждём разрешения торговать

n=-1;
while (n<0)
   {
      n=OrderSend(TName,opType,V,Price,slip,0,0,IntegerToString(DsT[i][j]));
      if (n>0) {break;}
      
      if (IsStopped()) {break;}

      err=GetLastError();
         if (err==136)
            {
            Comment("Off quotes. Waiting..");
            Sleep(1000);
            RefreshRates();
           }         
   }
 

Scriptong:
Выше ведь уже указали, чем пользоваться - IsTradeAllowed, передавая в нее интересующее время.  А 166-ая ошибка - это совершенно другая опера. Заранее о ней узнать невозможно.

Еще раз поясню, IsTradeAllowed возвращает true:

               if
               (
                  (TName!="")
                  &&
                  MarketInfo(TName,MODE_TRADEALLOWED)
                  &&
                  IsTradeAllowed(TName,TimeCurrent())
               )
               {OrderSend(...)}

После Ордер сэнд возвращается 133

 
evnt:
Чуток внимательнее - не TimeCurrent(), а TimeLocal() с поправкой на серверное время. Ведь TimeCurrent() не обновляется в выходные.
 
Scriptong:
Чуток внимательнее - не TimeCurrent(), а TimeLocal() с поправкой на серверное время. Ведь TimeCurrent() не обновляется в выходные.

ИМХО, сегодня, не выходной. Также, с локальным временем сегодня та же 133-ю ошибка шла (см. в коде). Конечно, цепляет довольно экзотические пары, например, сегодня  CadSgd. Из-за временного  лага между Канадой и Сингапуром все возможно. Но я ведь потому и проверяю перед тем как претендента на сделку отфильтровать, а потом сделку совершить. 

 

               if
               (
                  (TName!="")
                  &&
                  MarketInfo(TName,MODE_TRADEALLOWED)
                  &&
                  IsTradeAllowed(TName,TimeCurrent())
                  &&
                  IsTradeAllowed(TName,TimeLocal())
               )
               {OrderSend(...)}