Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 740

 
evillive:
речь про шаг, а не мин. лот, но ладно, проехали.
а, ну да. конечно нужно учитывать, если пишешь не для себя.
 
evillive:

Спасибо, мне уже обьяснили :D

Понятно, что для себя я пишу со всеми проверками, как надо, там был просто набросок как лот к соотношению баланс/10 привести, но идея неудачная была...

Но у вас что-то много текста, можно и проще:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

Можно проще. Только, что будет, если MarketInfo() для lotstep вернёт значение 0? Великие последствия? Советник будет остановлен, а позиции брошены?

А если значение MINLOT установлено брокером в 0.03, а LOTSTEP - в 0.02, то есть, первые два разрешённых значения лота есть 0.03 и 0.05, и при этом текущий баланс равен 41, - каково будет значение вычисленного лота в вашем коде?

Почему, если лот получается меньше минимального, - например, при балансе, равном 1, он после полного вычисления выражения станет равным 0, - почему в этом случае в вашем коде лот принимается равным MINLOT, который может быть, например, 0.03, то есть, в 30 раз больше, чем "сырое" значение "AccountBalance()*0.001", равное, в данном случае, 0.001?

Не всегда можно выдать валидное значение лота, потому что условия могут быть такими, что НИКАКОЕ из валидных значений лота им не соответствует. Ошибочные ситуации должны быть все запрограммированы, и надо помнить, что это - не менее 90% работы.

Применяемая модель, установленная MetaQuotes, такова, что lot = MINLOT + N * LOTSTEP, где N = 0, 1, 2... M. А M - таково, что MINLOT + M * LOTSTEP <= MAXLOT и MINLOT + (M + 1) * LOTSTEP > MAXLOT. Соответственно, и вычислять следует в пределах установленной модели, то есть, lot = MINLOT + N * LOTSTEP. Тогда всякие неудобные сочетания MINLOT и LOTSTEP становятся неважны, потому что формула работает в общем виде. Один раз как следует написал, как следует отладил и сосредоточился на чём-то ещё интересном и с удовольствием. А с удовольствием - потому, что не надо постоянно возвращаться к плохо написанному коду по причине того, что опять этот код не работает, а только глючит...

 
simpleton:

Можно проще. Только, что будет, если MarketInfo() для lotstep вернёт значение 0? Великие последствия? Советник будет остановлен, а позиции брошены?

А если значение MINLOT установлено брокером в 0.03, а LOTSTEP - в 0.02, то есть, первые два разрешённых значения лота есть 0.03 и 0.05, и при этом текущий баланс равен 41, - каково будет значение вычисленного лота в вашем коде?

Почему, если лот получается меньше минимального, - например, при балансе, равном 1, он после полного вычисления выражения станет равным 0, - почему в этом случае в вашем коде лот принимается равным MINLOT, который может быть, например, 0.03, то есть, в 30 раз больше, чем "сырое" значение "AccountBalance()*0.001", равное, в данном случае, 0.001?

Не всегда можно выдать валидное значение лота, потому что условия могут быть такими, что НИКАКОЕ из валидных значений лота им не соответствует. Ошибочные ситуации должны быть все запрограммированы, и надо помнить, что это - не менее 90% работы.

Применяемая модель, установленная MetaQuotes, такова, что lot = MINLOT + N * LOTSTEP, где N = 0, 1, 2... M. А M - таково, что MINLOT + M * LOTSTEP <= MAXLOT и MINLOT + (M + 1) * LOTSTEP > MAXLOT. Соответственно, и вычислять следует в пределах установленной модели, то есть, lot = MINLOT + N * LOTSTEP. Тогда всякие неудобные сочетания MINLOT и LOTSTEP становятся неважны, потому что формула работает в общем виде. Один раз как следует написал, как следует отладил и сосредоточился на чём-то ещё интересном и с удовольствием. А с удовольствием - потому, что не надо постоянно возвращаться к плохо написанному коду по причине того, что опять этот код не работает, а только глючит...

Для таких ужасов есть ещё проверка на достаточность средств для открытия с таким лотом. Никто в здравом уме не пустит робота на депозит в 10 баксов, зная, что мин. лот 0,1 и шаг 0,1 к примеру.

А если такой умный найдётся, робот скажет ему "бабок дай, а пока давай досвиданья" :D

И ещё нигде не видел и не читал, чтобы шаг лота нулевой был, это фантазии...

 
evillive:

Для таких ужасов есть ещё проверка на достаточность средств для открытия с таким лотом. Никто в здравом уме не пустит робота на депозит в 10 баксов, зная, что мин. лот 0,1 и шаг 0,1 к примеру.

А если такой умный найдётся, робот скажет ему "бабок дай, а пока давай досвиданья" :D

Чтоб не было нулей с МаркетИнфо в тестере, делаю так:  

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

Для таких ужасов есть ещё проверка на достаточность средств для открытия с таким лотом. Никто в здравом уме не пустит робота на депозит в 10 баксов, зная, что мин. лот 0,1 и шаг 0,1 к примеру.

А если такой умный найдётся, робот скажет ему "бабок дай, а пока давай досвиданья" :D

И ещё нигде не видел и не читал, чтобы шаг лота нулевой был, это фантазии...

Почему ужас-то? Потому что в упрощённую модель не вписывается?

Я имел ввиду, что при MINLOT = 0.03 и LOTSTEP = 0.02 первые два разрешённых значения лота - это 0.03 и 0.05. При этом, если баланс равен, скажем, 41, то ваш код:

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

даст значение лота 0.04, которое недопустимо. Робот скажет что-то типа "сервак сказал, что у меня неправильный размер лота".

А нулевой шаг лота может получиться при возникновении ошибки при запросе его значения через MarketInfo(). Как ошибку вызвать искусственно, - код я приводил:

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

Замечательно возвращает 0. Какие же фантазии?

 
simpleton:

Почему ужас-то? Потому что в упрощённую модель не вписывается?

Я имел ввиду, что при MINLOT = 0.03 и LOTSTEP = 0.02 первые два разрешённых значения лота - это 0.03 и 0.05. При этом, если баланс равен, скажем, 41, то ваш код:

даст значение лота 0.04, которое недопустимо. Робот скажет что-то типа "сервак сказал, что у меня неправильный размер лота".

А нулевой шаг лота может получиться при возникновении ошибки при запросе его значения через MarketInfo(). Как ошибку вызвать искусственно, - код я приводил:

Замечательно возвращает 0. Какие же фантазии?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Эту формулу довольно легко исправить под требования. Необходимо просто учитывать минимальный лот

Выглядеть будет немного по другому

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

Где Х - Баланс для открытия минимального лота,

Но проверка на минимальный лот все равно нужна будет.

 

Добрый день!

Помогите неучу ) В тестере не открываются ордера ошибка 10013 Неправильный запрос, посмотрите код, где ошибка.

Все цифры в журнал отображает по ордеру, а ордер не открывается.

2014.10.19 12:14:34.984 2014.02.03 00:06:00   failed request buy 0.10  at 102.31100  sl: 102.27200 tp: 102.33600 [Invalid request]

2014.10.19 12:22:17.928 2014.02.03 00:06:00   ticket =0   retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
Барабашка подправил Ваше сообщение
 

А где это видано?!

if(OrderSend(Req,Res))

См. Документацию! И кнопку SRC используйте для вставки кода!

Если лень см., 1-й и последний раз:

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Учиться никому не вредно!

 

Уважаемые господа!

Подскажите пожалуйста.....

Вот есть функция     

OrderProfit( )

 Эта функция возвращает значение чистой прибыли  для выбранного ордера.

ВОПРОС

Какая функция, аналогично вышеуказанной функции возвращает значение не прибыли а убытка  для выбранного  о.

То есть если ордер закрылся по СЛ с убытком в  150 $ , мне нужно что бы функция вернула  убыток 150 $

Спасибо. 

 
solnce600:

Уважаемые господа!

Подскажите пожалуйста.....

Вот есть функция     

OrderProfit( )

 Эта функция возвращает значение чистой прибыли  для выбранногоордера.

ВОПРОС

Какая функция, аналогично вышеуказанной функции возвращает значение не прибыли а убытка  для выбранного  о.

То есть если ордер закрылся по СЛ с убытком в  150 $ , мне нужно что бы функция вернула  убыток 150 $

Спасибо. 

Та же самая! Только сумма выйдет с минусом.
Причина обращения: