Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
RefreshRates
sleep(10000)
:-/ я так понимаю через 10 секунд запрошенные цены будут совершенно не актуальны
надо бы
RefreshRates
SendOrder
или я где-то не прав?
Если 2 подряд - он !по идее! сначала закончит с первым, потом возьмётся за второй. Но не факт. И паузы никакой не будет.
Если одновременно несколько экспертов, надо городить семафоры, паузы, и т.д. - обсуждалось в теме "Ошибка №6".
В принципе, у меня есть готовое решение - могу поделиться. А скоро я выложу его (решение, библиотеку, т.е.) на mql4.com
//--------------------------------------------------------------------- // wait for trade context //--------------------------------------------------------------------- bool WaitForTradeContext() { int i; // wait for trade to be allowed if trade context is busy for 30 seconds i = 0; while ((i < 300) && !(IsTradeAllowed())) { Sleep(100); i++; } if (i == 300) { OrderError = "Trade is not allowed"; return(false); } // refresh rates if (i > 10) if (!RefreshRates()) { OrderError = ErrorDescription(GetLastError()); return(false); } return(true); } //--------------------------------------------------------------------- // send sell order //--------------------------------------------------------------------- int _Sell(double LotSize, int StopLoss, int TakeProfit) { double sl, tp; if (StopLoss == 0) sl = 0; else sl = NormalizeDouble(Bid + StopLoss*Point, Digits); if (TakeProfit == 0) tp = 0; else tp = NormalizeDouble(Bid - TakeProfit*Point, Digits); return(OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "", 0, 0, Red)); } //--------------------------------------------------------------------- // send buy order //--------------------------------------------------------------------- int _Buy(double LotSize, int StopLoss, int TakeProfit) { double sl, tp; if (StopLoss == 0) sl = 0; else sl = NormalizeDouble(Ask - StopLoss*Point, Digits); if (TakeProfit == 0) tp = 0; else tp = NormalizeDouble(Ask + TakeProfit*Point, Digits); return(OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "", 0, 0, Yellow)); } //--------------------------------------------------------------------- // send sell order with checking //--------------------------------------------------------------------- int Sell(double LotSize, int StopLoss, int TakeProfit) { int err, OrderHandle; // wait for trade context if (!WaitForTradeContext()) return(-1); // trying to sell OrderHandle = _Sell(LotSize, StopLoss, TakeProfit); if (OrderHandle < 0) { // have error err = GetLastError(); if ((err == ERR_REQUOTE) || (err == ERR_PRICE_CHANGED) || (err == ERR_INVALID_PRICE)) { // trying to refresh rates Sleep(5000); if (!RefreshRates()) { OrderError = ErrorDescription(GetLastError()); return(-1); } else { // trying to sell again OrderHandle = _Sell(LotSize, StopLoss, TakeProfit); if (OrderHandle < 0) OrderError = ErrorDescription(GetLastError()); } } } return(OrderHandle); } //--------------------------------------------------------------------- // send buy order with checking //--------------------------------------------------------------------- int Buy(double LotSize, int StopLoss, int TakeProfit) { int err, OrderHandle; // wait for trade context if (!WaitForTradeContext()) return(-1); // trying to buy OrderHandle = _Buy(LotSize, StopLoss, TakeProfit); if (OrderHandle < 0) { // have error err = GetLastError(); if ((err == ERR_REQUOTE) || (err == ERR_PRICE_CHANGED) || (err == ERR_INVALID_PRICE)) { // trying to refresh rates Sleep(5000); if (!RefreshRates()) { OrderError = ErrorDescription(GetLastError()); return(-1); } else { // trying to buy again OrderHandle = _Buy(LotSize, StopLoss, TakeProfit); if (OrderHandle < 0) OrderError = ErrorDescription(GetLastError()); } } } return(OrderHandle); }Сейчас нету, уже достаточно давно.
BuyWithMsg(0.1, 0, 0);
BuyWithMsg(0.2, 0, 0);
SellWithMsg(0.1, 0, 0);
BuyWithMsg(0.1, 0, 0);
все 4 ордера подряд отрабатывают без вопросов.
Не только.
Если 2 подряд - он !по идее! сначала закончит с первым, потом возьмётся за второй. Но не факт. И паузы никакой не будет.
Сначала положит первый запрос на ордер в трейдовый поток, потом второй. Если повезет, конечно. Что поток с ними будет делать - тайна. Паузы не будет, это точно.
В принципе, у меня есть готовое решение - могу поделиться. А скоро я выложу его (решение, библиотеку, т.е.) на mql4.com
При всем уважении, это не решение. Это огород.