Обсуждение статьи "Какие проверки должен пройти торговый робот перед публикацией в Маркете" - страница 4

 
Oleksii Chepurnyi:

Та если б не маркет, я бы сильно и не заморачивался :)

Я так понимаю, запас - это на проскальзывание?

Да, фактически для того, чтобы еще немного уменьшить вероятность нарваться на ошибку при резком движении цен

 
Oleksii Chepurnyi:

Та если б не маркет, я бы сильно и не заморачивался :)

Я так понимаю, запас - это на проскальзывание?

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

Рассчитали - проверили корректность, подкорректировали при необходимости и отправили запрос. Далее проверили результат запроса. Это - на стороне советника.

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

 

Добрый день.

Из документации:

SYMBOL_VOLUME_LIMIT

Максимально допустимый для данного символа совокупный объем открытой позиции и отложенных ордеров  в одном направлении (покупка или продажа). Например, при ограничении в 5 лотов можно иметь открытую позицию на покупку объемом 5 лотов и выставить отложенный ордер Sell Limit объемом 5 лотов. Но при этом нельзя выставить отложенный ордер Buy Limit (поскольку совокупный объем в одном направлении превысит ограничение) или выставить Sell Limit объемом более 5 лотов.


На сколько я понимаю, в вычислении нужно учитывать объем всех позиций и ордеров только в том направлении, в которое собираемся открыть сделку или выставить ордер.

Но тут Ограничение на количество лотов по одному символу направление вообще никак не учитывается...

Или я что-то не так понял?

 
Vladislav Andruschenko:

возможно лот нужно нормализовать в данной функции, чтоб не было Инвалида.

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

с недавних времен года 2 назад стал использовать такую инструкцию:

 

Собственно все работает.  

при открытии сделки - советник просто возвращает строку  Print("Not Enought Money Margin Required"+(string)margin); 

Советник проходит проверку в маркете, все довольны 

Спасибо Владислав!

Ваш вариант работает до сих пор в отличии от моего который ранее работал нормально и от этого, на который нас направляет валидатор:

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- если денег не хватает
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- проверка прошла успешно
   return(true);
  }
 
Ramiz Mavludov:
Спасибо Владислав!

Ваш вариант работает до сих пор в отличии от моего который ранее работал нормально и от этого, на который нас направляет валидатор:

А где такой код показывается?

PS Нашел в португальской и японской версиях статьи и исправил. Еще есть гд
 
Oleksii Chepurnyi:

Добрый день.

Из документации:

SYMBOL_VOLUME_LIMIT

Максимально допустимый для данного символа совокупный объем открытой позиции и отложенных ордеров  в одном направлении (покупка или продажа). Например, при ограничении в 5 лотов можно иметь открытую позицию на покупку объемом 5 лотов и выставить отложенный ордер Sell Limit объемом 5 лотов. Но при этом нельзя выставить отложенный ордер Buy Limit (поскольку совокупный объем в одном направлении превысит ограничение) или выставить Sell Limit объемом более 5 лотов.


На сколько я понимаю, в вычислении нужно учитывать объем всех позиций и ордеров только в том направлении, в которое собираемся открыть сделку или выставить ордер.

Но тут Ограничение на количество лотов по одному символу направление вообще никак не учитывается...

Или я что-то не так понял?

Вы правы, в этом примере направление не учитывается. Можно попробовать сделать через учет знака: Buy ордера берем положительно, Sell - отрицательно. Величина и знак на выходе дадут нам объем и направление.

Нужно поправить

 
Rashid Umarov:

А где такой код показывается?

PS Нашел в португальской и японской версиях статьи и исправил. Еще есть гд

Щас показать уже не смогу, когда отправлял на валидацию, в отчете нажимая на 148 ошибку я попадал на 

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- если денег не хватает
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- проверка прошла успешно
   return(true);
  }
версия сайта так же оставалассь русскоязычной. 
 
Rashid Umarov:

Вы правы, в этом примере направление не учитывается. Можно попробовать сделать через учет знака: Buy ордера берем положительно, Sell - отрицательно. Величина и знак на выходе дадут нам объем и направление.

Нужно поправить

Как-то не понятно по поводу знака...

Написал вот такое

//--- максимальный объем по всем позициям
   double max_volume = SymbolInfoDouble(CheckSymb,SYMBOL_VOLUME_LIMIT);
   if(ED(max_volume,0)) return(true);
//---
   double sum_volume = 0;
   int    oper = 0;
   if(CheckOperation==ORDER_TYPE_BUY  || CheckOperation==ORDER_TYPE_BUY_LIMIT  || CheckOperation==ORDER_TYPE_BUY_STOP  || CheckOperation==ORDER_TYPE_BUY_STOP_LIMIT)  oper = 1;
   if(CheckOperation==ORDER_TYPE_SELL || CheckOperation==ORDER_TYPE_SELL_LIMIT || CheckOperation==ORDER_TYPE_SELL_STOP || CheckOperation==ORDER_TYPE_SELL_STOP_LIMIT) oper = 2;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(!pst.SelectByIndex(i)) ShowError;
      if(pst.Symbol()==CheckSymb)
        {
         if(oper==1 && pst.PositionType()==POSITION_TYPE_BUY)  sum_volume += pst.Volume();
         if(oper==2 && pst.PositionType()==POSITION_TYPE_SELL) sum_volume += pst.Volume();
        }
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!ord.SelectByIndex(i)) ShowError;
      if(ord.Symbol()==CheckSymb)
        {
         if(oper==1 && (ord.OrderType()==ORDER_TYPE_BUY  || ord.OrderType()==ORDER_TYPE_BUY_LIMIT  || ord.OrderType()==ORDER_TYPE_BUY_STOP  || ord.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT))  sum_volume += ord.VolumeCurrent();
         if(oper==2 && (ord.OrderType()==ORDER_TYPE_SELL || ord.OrderType()==ORDER_TYPE_SELL_LIMIT || ord.OrderType()==ORDER_TYPE_SELL_STOP || ord.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)) sum_volume += ord.VolumeCurrent();
        }
     }
   if(sum_volume+CheckVolume > max_volume)
     {
      Alert(OrdersText(0010),DoubleToString(max_volume,VolumeDigits(CheckSymb)));
      return(false);
     }
//---
   return(true);
 
Andrey F. Zelinsky:
В статье не затронут вопрос, что делать, если стоплевел =0. На форуме вопрос неоднократно поднимался. Никаких рекомендаций в статье на этот счёт нет.
А в чем вопрос? Нету стоплевела - и хорошо...
 
Oleksii Chepurnyi:
А в чем вопрос? Нету стоплевела - и хорошо...

Нулевой - не значит отсутствующий. Нулевой означает плавающий.