| / | Форум |
|
vnn
09.10.2006 19:55
Будьте любезны, господа продвинутые пользователи MQL4, помогите
разобраться! Посылаю запрос на открытие позиции - цена из очереди,
стопы проверены функцией NormalizeDouble и не меньше допустимых, однако
возвращается код 130. Повторяю попытку несколько раз, через минуту
и тот-же результат даже после того, как цена становится явно
неактуальной и разница превышает допустимую (аргументом функции).
Вот так проверяю стоп:
double CheckStopLoss(string strSymbol, double dOrderPrice, double dStopPrice, int iAct) { double dStopSpread = MathAbs(dOrderPrice - dStopPrice); double dMinStopSpread = MarketInfo(strSymbol, MODE_POINT) * (MarketInfo(strSymbol, MODE_STOPLEVEL) + 1); if(dStopSpread < dMinStopSpread) { if(iAct == OP_SELL) dStopPrice = dOrderPrice + dMinStopSpread; else dStopPrice = dOrderPrice - dMinStopSpread; } return(NormalizeDouble(dStopPrice, MarketInfo(strSymbol, MODE_DIGITS))); }Цель - просто функцией NirmalizeDouble, цену беру из MarketInfo. Заранее благодарен. |
|
Бесплатная Groupware для групп разработчиков Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение. |
|
Better
09.10.2006 20:20
Из этого фрагмента ничего не видно. Возможно, Вы пытаетесь установить
стоп-лосс для лонгов выше рынка, а для шортов - ниже. Функция
CheckStopLoss в этом случае ошибки не обнаружит и стоп не изменит.
|
|
vnn
09.10.2006 20:49
Better писал (а): Вот функция, которая вызывает ранее упомянутую:Из этого фрагмента ничего не видно. Возможно, Вы пытаетесь установить стоп-лосс для лонгов выше рынка, а для шортов - ниже. Функция CheckStopLoss в этом случае ошибки не обнаружит и стоп не изменит. int Deel(int iAct) { if(iAct != OP_SELL && iAct != OP_BUY) { Print("u_turn_breader \'Deel\' function: Error! Wrong param ", iAct, "."); return(FEED_ERROR); } RefreshRates(); string strSymbol = TextSymbol(utOrderInstrIndex()); double dPrice = CheckOrderPrice(utOrderPrice(), strSymbol, iAct); double dStop = CheckStopLoss(strSymbol, dPrice, utOrderStop(), iAct); double dProfit = NormalizeDouble(utOrderPrft(), MarketInfo(strSymbol, MODE_DIGITS)); int iMagic = utOrderMagic(); int iResult = OrderSend(strSymbol, iAct, DEEL_LOTS, dPrice, DEEL_SLIPPAGE, dStop, dProfit, "u-turn order #" + DoubleToStr(iMagic, 0), iMagic, 0, Yellow); if(iResult == -1) { int iError = GetLastError(); utSetOrderId(iResult, iError); Print("\'Deel\': Error! OrderSend(", strSymbol, ", ", TextOrderAction(iAct), ", ", DEEL_LOTS, ", ", dPrice, ", ", DEEL_SLIPPAGE ,", ", dStop, " , ", dProfit, ", u-turn order #", iMagic, ", 0 , Yellow) function fail! - ", TextMqlOrderError(iError), " (", iError, ")."); } else { utSetOrderId(iResult, 0); iResult = THREAD_SUCCESS; } return(iResult); } Работает она далеко не всегда. Не могу привести здесь весь код, но точно уверен, что в контексте не может возникнуть такой путаницы, да и вывод сообщения об ошибке подтверждает правильность выбранных цен. По-вашему функция OrderSend всегда работает корректно? Сейчас только получил сообщение об ошибке: OrderSend(EURUSD, Sell, 1, 1.2602, 3, 1.262, 1.258, String, 0, Colour) function fail - INVALID STOPS (130). НАШЕЛ ЖУКА, СПАСИБО ЗА УЧАСТИЕ! |
|
Itso
10.10.2006 12:11
Слишком близкие стопы - есть
MarketInfo(Symbol(),MODE_TICKSIZE); Разница м/у текущую цену (Bid или Ask в зависимости от типа ордера) и стоп должна быть хотя на 1 пункт больше чем TickSize. |
|
vnn
10.10.2006 18:52
Стопы конечно близкие, но допустимые. В первой функции к минимальному стопу добавляется пункт. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий