Ошибка 130?

 
Для USDJPY код:
   RefreshRates();
   if(StopLoss==true) SL=Bid-DistSL*Point; else SL=0;
   if(TakeProfit==true) TP=Ask+DistTP*Point; else TP=0;
   ticket=OrderSend(Symbol(),OP_BUY,Stake,
                    NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits), 
                    Slippage,
                    NormalizeDouble(SL,Digits),
                    NormalizeDouble(TP,Digits),
                    "",0,0,CLR_NONE);
   if(ticket<0) Alert("Open_BUY LastError: ",GetLastError());
дает ошибку 130 . Что не так? (DistSL=85 DistTP=100)
 

А чему равень уровень отступа стопов? MarketInfo(Symbol(),MODE_STOPLEVEL)

 
И на каком символе запущен советник в он-лайне ;)
И лучше вставить распринтовку всех параметров в случае неудачи.
 

Забавно:

Alert("Stops=",MarketInfo(Symbol(),MODE_STOPLEVEL));

дает Stops=0

 
Rosh писал (а):
И на каком символе запущен советник в он-лайне ;)
И лучше вставить распринтовку всех параметров в случае неудачи.

Впервые решил попробовать USDJPY :). С этим брокером, у них конкурс еженедельно (название будет сочтено как "недопустимо"?) решил попробовать тоже впервые.
Скрипт на "встать в позу".

//+------------------------------------------------------------------+
//|                                                    Open_SELL.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|                   Скрипт открывает SELL в активном окне на сумму |
//|             залога, задаваемую как часть FreeMargin в процентах. |
//|                           При CreateGif=true активное окно после |
//|                       открытия позиции сохраняется как рисунок в |
//|                     ...<Терминал>exspertsfiles<FileName>.gif |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
//+------------------------------------------------------------------+
extern int  Interest   = 35;   // Выделить процент FreeMargin на позу
extern int  DistSL     = 85;   // StopLoss в пунктах
extern int  DistTP     = 100;  // TakeProfit в пунктах
extern int  Slippage   = 7;    // Проскальзывание в пунктах
extern bool StopLoss   = true; // Ставить или нет StopLoss
extern bool TakeProfit = true; // Ставить или нет TakeProfit
extern bool CreateGif  = true; // Создать или нет рисунок
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
double MarginCalculate(string symbol,double volume)
//+------------------------------------------------------------------+
//|                                     Взято из MarginCalculate.mq4 |
//|                                  'MarginCalculate' |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//+------------------------------------------------------------------+
{
   string first    = StringSubstr(symbol,0,3);
   string second   = StringSubstr(symbol,3,3);
   string currency = AccountCurrency();
   double leverage = AccountLeverage();
   double contract = MarketInfo(symbol,MODE_LOTSIZE);
   double bid      = MarketInfo(symbol,MODE_BID);
//---- допускаем только стандартные форексные символы XXXYYY
   if(StringLen(symbol)!=6)
   {
      Print("MarginCalculate: '",symbol,
            "' must be standard forex symbol XXXYYY");
      return(0.0);
   }
//---- проверка наличия данных
   if(bid<=0 || contract<=0) 
   {
      Print("MarginCalculate: no market information for '",
             symbol,"'");
      return(0.0);
   }
//---- проверяем самые простые варианты - без кроссов
   if(first==currency)   return(contract*volume/leverage);
   if(second==currency)  
      return(contract*MarketInfo(symbol,MODE_BID)*volume/leverage);
//---- проверяем обычные кроссы, ищем прямое преобразование
//---- через валюту депозита
   string base=currency+first;
   if(MarketInfo(base,MODE_BID)>0) 
      return(contract/MarketInfo(base,MODE_BID)*volume/leverage);
//---- попробуем наоборот
   base=first+currency; 
   if(MarketInfo(base,MODE_BID)>0) 
      return(contract*MarketInfo(base,MODE_BID)*volume/leverage);
//---- нет возможности прямого перерасчета
   Print("MarginCalculate: can not convert '",symbol,"'");
   return(0.0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void start() 
{
double SL=0, TP=0, Stake, Share, MarginLots;
int    ticket=0, MinLotDgts, i;
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);   
double MaxLot=MarketInfo(Symbol(),MODE_MAXLOT);   
double LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);   
//int    Dgts=MarketInfo(Symbol(),MODE_DIGITS);
string FileName, str;     
//----
   Share=0.01*Interest;
   if(Share>1.0) Share=1.0; // Часть не бывает больше целого
   if(Share<0) Share=0;    // (???)
   // Чему равен MinLot? 0.01, 0.1 или ...
   if(MinLot<0.1) MinLotDgts=2;
   else
   {
      if(MinLot<1.0) MinLotDgts=1;
      else MinLotDgts=0;
   }
   // Залог на 1 MinLot
   MarginLots=MarginCalculate(Symbol(),MinLot);
   if(MarginLots<0.01) return;
   if(AccountFreeMargin()<MarginLots)
   {
      Alert("Open_SELL: No maney...");
      return;
   }
   // Сколько MinLot'ов разрешили себе позволить на позу?
   Stake=NormalizeDouble(AccountFreeMargin()*Share/MarginLots,0);
   // Если выделенная часть депо будет меньше минимально допустимого
   // лота, поза будет открыта на минимальный лот
   if(Stake<1) Stake=MinLot;
   else 
   {
      Stake=NormalizeDouble(Stake*MinLot,MinLotDgts);
      // Если выделенная часть депо будет больше максимально
      // допустимого лота, поза будет открыта на максимальный лот
      if(Stake>MaxLot) Stake=MaxLot;
      else while(AccountFreeMargin()<MarginCalculate(Symbol(),Stake))
                 Stake=Stake-LotStep;
   }
   RefreshRates();
   if(StopLoss==true) SL=Ask+DistSL*Point; else SL=0;
   if(TakeProfit==true) TP=Bid-DistTP*Point; else TP=0;
   ticket=OrderSend(Symbol(),OP_SELL,Stake,
                    // Не смотря на рефреш вместо Bid ставим:
                    NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits), 
                    Slippage,
                    NormalizeDouble(SL,Digits),
                    NormalizeDouble(TP,Digits),
                    "",0,0,CLR_NONE);
   if(ticket<0) Alert("Open_SELL LastError: ",GetLastError()); 
   else
   { 
      if(CreateGif==true)
      {
         //    рисуем, если заказано
         datetime curdate=TimeCurrent();
         FileName=Symbol()+"_SELL_"+TimeYear(curdate);
         i=TimeMonth(curdate);
         if(i<10)
         {
            str="0"+i;
            FileName=FileName+str;
         }
         else FileName=FileName+i;
         i=TimeSeconds(curdate)+
           100*TimeMinute(curdate)+
           10000*TimeHour(curdate)+
           1000000*TimeDay(curdate);
         if(TimeDay(curdate)<10)
         {
            str="0"+i;
            FileName=FileName+str;
         }
         else FileName=FileName+i;
         FileName=FileName+".gif";
         WindowScreenShot(FileName,400,300); 
      }
   }
   return;
}
//+------------------------------------------------------------------+
 
У меня скрипт все корректно открыл на демо счете по ене и фунтене.
Ошибок в журнале не было.
 
Ну тогда звиздец. По четырех знаковым работает, а по Йене - нет :(.
 
Bookkeeper:
Ну тогда звиздец. По четырех знаковым работает, а по Йене - нет :(.
Откройте из МаркетВотча окно свойств символа и посмотрите там характеристики. Может у этого брокера на йене нет стоп уровней.
 
А ещё для инструментов, находящихся в режиме "исполнение по рынку" (Market Execution), нельзя сразу устанавливать стопы. Только функцией OrderModify после открытия ордера
 
Renat, Stringo - спасибо. Буду проверять.
Причина обращения: