[Архив]учитесь зарабатывать селяне![Архив] - страница 721

 
Slovyn:

Кто подскажет, что за ошибка???



Торговый поток занят.

Также можете вбить такую конструкцию в начало инит сОва:

int init()
{     
   IsExpertStopped = false;
   if (!IsTradeAllowed())  {Comment("Необходимо разрешить советнику торговать");IsExpertStopped = true; return (0);}      
   if (!IsTesting()) 
      { 
        if (IsExpertEnabled()) {  Comment("Советник запустится следующим тиком"); }
        else   { Comment("Отжата кнопка \"Разрешить запуск советников\""); }
      }

Лечится обработкой этой ошибки при не выставлении ордера, например, так:

if (error == ERR_TRADE_CONTEXT_BUSY) 
      {
         while (IsTradeContextBusy()) 
         {
            Sleep(1000*11);
         }
      }
 
Roman.:


Торговый поток занят.

Лечится обработкой этой ошибки при не выставлении ордера, например, так:


а не многовато ли 11 секунд ждать? это же не серверная фишка, а сугубо от наличия толпы экспертов в одном терминале
 
sergeev:

а не многовато ли 11 секунд ждать? это же не серверная фишка, а сугубо от наличия толпы экспертов в одном терминале


Скорее да, многовато, у меня так забито в моей ф-ии открытия...

Поправьте, плиз... я у себя также внесу правки...

вообще у меня в другом сОве такая цифра стоит:

пример:

 case 0:
      if (BuySell==1)// || LongTrade)
      {
      for (c = 0; c < NumberOfTries; c++) {
         RefreshRates();
         ticket = OrderSend(Symbol(), OP_BUY, pLots, Ask, sp, StopLong(Bid, sl), TakeLong(Ask, tp), pComment, pMagic, pDatetime, pColor);
         err = GetLastError();
         if (err == 0/* NO_ERROR */) break;
         if (!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
      }
      }
      break;
 
Roman.:


Скорее да, многовато, у меня так забито в моей ф-ии открытия...

Поправьте, плиз... я у себя также внесу правки...


у вас неправильная конструкция по сути

if (error == ERR_TRADE_CONTEXT_BUSY) 
      {
         while (IsTradeContextBusy()) 

необходимо перевернуть

if (IsTradeContextBusy()) 
{
 // здесь выдать предупреждение и не делать торговых операций


а идеология в стиле

i<NumberOfTries

считаю непрофессиональной

 
sergeev:

у вас неправильная конструкция по сути

необходимо перевернуть


Ясно - внесу правки. Благодарю.
 
Roman.:


Торговый поток занят.

Также можете вбить такую конструкцию в начало инит сОва:

Лечится обработкой этой ошибки при не выставлении ордера, например, так:

Секунды вполне хватает, лишь бы запросы не шли подряд.
 
Slovyn:

Кто подскажет, что за ошибка???

Торговый поток занят. Это может означать, что:

1) торговый поток на самом деле занят

2) поток не занят нифига и "кто то" прикидывается, что он занят.

3) технические проблемы, решаемые, если обратится в СТП.


И, кстати, такая ошибка может возникнуть при одиночной отправке торгового приказа. Часто возникает даже тогда, когда стоп тралится терминалом.

 

У меня к примеру так... 100% совершит операцию)

while(IsTradeContextBusy()) Sleep(100);

while(!error)
{
   error=OrderCloseBy(pos1,pos2);
   Sleep(1000);
}
 
OnGoing:
Секунды вполне хватает, лишь бы запросы не шли подряд.


понятно, сделал так - участок кода из Лавины для открытия ордеров - торговал на реале - вопросов не было.

for (int try = 1; try <= NumberOfTry; try++)
   {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped()))
      {
         break;
      }
   
      while (!IsTradeAllowed()) 
      {
         Sleep(5000);
      }
    
      RefreshRates();
      opentime = TimeCurrent();
      ticket = OrderSend(symbol, cmd, volume, price, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr);
      if (ticket > 0)
      {
         if (UseSound) 
         {
            PlaySound("ok.wav"); 
            break;
         }
      } 
      else
      {
         error = GetLastError();
         if (error == ERR_TRADE_TIMEOUT)
         {
            Sleep(1000*66);
            if (ExistOrders(symbol, cmd, magic, opentime))
            {
               if (UseSound) 
               {
                  PlaySound("ok.wav"); 
                  break;
               }
            }
         }
        
         Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
         continue;
      }
      
      Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
      Print("Ask=", Ask, "  Bid=", Bid, "  symbol=", symbol, "  volume=", volume, "  cmd=", GetNameOP(cmd), "  price=", price, "  stoploss=", stoploss, "  takeprofit=", stoploss, "  magic=", magic);
      if ((error == ERR_COMMON_ERROR) || (error == ERR_ACCOUNT_DISABLED) || (error == ERR_INVALID_ACCOUNT) || (error == ERR_TRADE_DISABLED))
      {
         IsExpertFailed = true;
         break;
      }
      
      if ((error == ERR_SERVER_BUSY) || (ERR_INVALID_TRADE_VOLUME) || (error == ERR_MARKET_CLOSED))
      {
         Sleep(1000*300); 
         break;
      }
      
      if ((error == ERR_TOO_FREQUENT_REQUESTS) || (error == ERR_TOO_MANY_REQUESTS)) 
      {
         Sleep(1000*100);
      }
      
      if ((error == ERR_ORDER_LOCKED) || (error == ERR_LONG_POSITIONS_ONLY_ALLOWED) || (error == ERR_TRADE_TOO_MANY_ORDERS)) 
      {
         break;
      }
      
      if (error == ERR_TRADE_CONTEXT_BUSY) 
      {
         if (IsTradeContextBusy()) 
         {
            Sleep(1000*1);
         }
      }
      
      if (error == ERR_TRADE_EXPIRATION_DENIED )
      {
         expiration = 0; 
         continue;
      }
      
      if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE)) 
      {
         Sleep(1000*7.7);
      }
   }      
}
 

так пишет в тестере при микро реале! (центовом счёте)