[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 244

 
MaxZ:

Здравствуйте.

Вопрос: может ли функция OrderSend() после исполнения вернуть значение "0", или меньше "-1"?? Кто-нибудь встречался с подобным? Или информация, приведённая в "документации" достоверна:

P.S.: работаю Телепатом, ищу ошибку в чужом коде...

Хай!

Ну а почему нет? Если например по реквоте ордер не открыт...

Для этого существует цикл для реала открытия ордеров, например, типа этого - кол-во попыток открытия с обработкой ошибок:

int NumberOfTry = 25;
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+

void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0)
{
   color clr;
   datetime opentime;
   int ticket;
   int error;
  
   comment = WindowExpertName() + " " + GetNameTF(Period()) + " " + comment;
   int msl = MarketInfo(symbol, MODE_STOPLEVEL);
   clr = CLR_NONE;
   if (cmd == OP_BUY)  clr = ColorBuy;
   else if (cmd == OP_SELL)  clr = ColorSell;   
   if ((expiration > 0) && (expiration < TimeCurrent()))   expiration = 0;
  
   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) while (IsTradeContextBusy()) Sleep(1000*11);
      
      if (error == ERR_TRADE_EXPIRATION_DENIED )  {expiration = 0; continue;}      
      if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE))  Sleep(1000*7.7);
   }      
}
 
Roman.:

Хай!

Ну а почему нет? Если например по реквоте ордер не открыт...

Привет, Роман.

Потому что обычно функция OrderSend() при ошибке возвращает значение "-1"... А не "0" и уж точно не меньше "-1". Но всё же может были у Кого-то прецеденты?

 
MaxZ:

Привет, Роман.

Потому что обычно функция OrderSend() при ошибке возвращает значение "-1"... А не "0" и уж точно не меньше "-1". Но всё же может были у Кого-то прецеденты?

Кстати интересная тема на счёт ошибок. Я научился, что если возвращается 0 (ноль) то нет ошибки и ордер принят брокером. Если не принял, то возвращается ошибка, но которая больше нуля. В описании оператора OrderSend() есть запись "...или -1 в случае неудачи". Но какого типа должна быть ошибка чтобы брокер вернул -1? Может кто знает?
 
MaxZ:

Привет, Роман.

Потому что обычно функция OrderSend() при ошибке возвращает значение "-1"... А не "0" и уж точно не меньше "-1". Но всё же может были у Кого-то прецеденты?


Это уж наверно надо торговать на КОНКРЕТНОЙ кухне, если ордерсенд() возвращает "0", а тем более < -1. :-)
 
paladin80:
Кстати интересная тема на счёт ошибок. Я научился, что если возвращается 0 (ноль) то нет ошибки и ордер принят брокером. Если не принял, то возвращается ошибка, но которая больше нуля.
Функция GetLastError() возвращает 0? Или Вы всё же пишете про функцию OrderSend()?


paladin80:
В описании оператора OrderSend() есть запись "...или -1 в случае неудачи". Но какого типа должна быть ошибка чтобы брокер вернул -1? Может кто знает?

OrderSend() возвращает "-1". А тип ошибки надо смотреть с помощью функции GetLastError()!! Не путайте это... Есть код ошибки "1", что значит "Нет ошибки, но результат неизвестен"... А вот ошибку с кодом "-1" Я не встречал и думаю такой и нет! :D

 
MaxZ:
Функция GetLastError() возвращает 0? Или Вы всё же пишете про функцию OrderSend()?


OrderSend() возвращает "-1". А тип ошибки надо смотреть с помощью функции GetLastError()!! Не путайте это... Есть код ошибки "1", что значит "Нет ошибки, но результат неизвестен"... А вот ошибку с кодом "-1" Я не встречал и думаю такой и нет! :D


Может действительно я мог напутать. Ещё раз внимательно почитал про OrderSend и ошибки. Наверно дело в том, что если брокер принял ордер то возвращает номет тикета, а GetLastError этой операции покажет 0. Если не принял, то -1 и при этом GetLasError покажет номер ошибки больше нуля.
 

Доброго времени суток. Подскажите пожалуйста где можно достать period_converter с функцией которая позволяет задавать точку отсчёта. Например мне нужно сделать график D2 из D1, задаю при запуске YYY.MMM.DDD HH.MM и с этой даты он начинает конвертить свечи.

Давно как-то нашёл что-то подобное(по моему даже на этом форуме), но почему-то не хочет начинать конвертить с чётных чисел(начинает с нечётного и всё) Может подскжите что в коде изменить или сами измените. Буду очень признателен. Вот то что нашёл.

Файлы:
 
Добрий день! А можно ли из индикатора переключать таймфрейм? Что б на платформе в окне таймфрейм переключался?
 

Уважаемые все

Я новичок, и с форекс работаю недавно, хочу попросить совета у местных гуру.

Работаю с терминалом под МТ4

При работе с графиком для валютной пары удобно пользоваться переключением масштаба: "М1", "М5",....

Так вот в масштабе М1 выводится история за последние 38 часов, в виде приблизительно 2000 свечей, в М5 270 часов но тоже около 2000 свечей.

При этом в первом случае таймфрейм для свечи будет 60сек, а во втором уже 470сек. А можно ли как то вытащить историю за 270 часов (или больше) с разбиением на 60сек свечи?

заранее благодарен

 
paladin80:
Может действительно я мог напутать. Ещё раз внимательно почитал про OrderSend и ошибки. Наверно дело в том, что если брокер принял ордер то возвращает номет тикета, а GetLastError этой операции покажет 0. Если не принял, то -1 и при этом GetLasError покажет номер ошибки больше нуля.

Вот сейчас всё как надо... А то Я немного растерялся от Вашего ответа! :)))


А вот вопрос Мой остаётся в силе. Может ли функция OrderSend() вернуть "0" или значение меньше "-1"??


Я попросил выслать лог-файл... А Мне не высылают. Так бы уже давно понял в чём загвоздка. А пока продолжаю телепатствовать! ;))) Но всё же вдруг функция OrderSend() чудит? :DD