MQL4 - automated forex trading   /  

Форум

Вопрос о функции MQL 'OrderSend'

К списку тем Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
33
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 станет намного проще ставить задачи и контролировать их выполнение.


avatar
391
Better 09.10.2006 20:20 
Из этого фрагмента ничего не видно. Возможно, Вы пытаетесь установить стоп-лосс для лонгов выше рынка, а для шортов - ниже. Функция CheckStopLoss в этом случае ошибки не обнаружит и стоп не изменит.

avatar
33
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).


НАШЕЛ ЖУКА, СПАСИБО ЗА УЧАСТИЕ!

avatar
1447
Itso 10.10.2006 12:11 
Слишком близкие стопы - есть
MarketInfo(Symbol(),MODE_TICKSIZE);

Разница м/у текущую цену (Bid или Ask в зависимости от типа ордера) и стоп должна быть хотя на 1 пункт больше чем TickSize.

avatar
33
vnn 10.10.2006 18:52 

Стопы конечно близкие, но допустимые. В первой функции к минимальному стопу добавляется пункт.

К списку тем  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий