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

 

Подскажите при загрузке советника и тестировании пишет ошибка, не понятно как поправить.

test on EURUSD,H1 (netting)

2020.04.14 00:24:42 failed instant buy 0.01 EURUSD at 1.09044 [Invalid volume]

2020.04.14 00:24:45 failed instant buy 0.01 EURUSD at 1.09044 [Invalid volume]

2020.04.14 00:24:48 failed instant buy 0.01 EURUSD at 1.09037 [Invalid volume]

2020.04.21 00:01:34 failed instant buy 0.01 EURUSD at 1.08626 [Invalid volume]

2020.04.21 00:01:37 failed instant buy 0.01 EURUSD at 1.08626 [Invalid volume]

2020.04.21 00:01:40 failed instant buy 0.01 EURUSD at 1.08626 [Invalid volume]

2020.04.27 16:08:24 failed instant sell 0.01 EURUSD at 1.08546 [Invalid volume]

2020.04.27 16:08:27 failed instant sell 0.01 EURUSD at 1.08548 [Invalid volume]

2020.04.27 16:08:30 failed instant sell 0.01 EURUSD at 1.08547 [Invalid volume]

2020.04.29 20:15:52 failed instant sell 0.01 EURUSD at 1.08565 [Invalid volume]

2020.04.29 20:15:55 failed instant sell 0.01 EURUSD at 1.08566 [Invalid volume]

2020.04.29 20:15:58 failed instant sell 0.01 EURUSD at 1.08566 [Invalid volume]

2020.05.18 00:12:09 failed instant buy 0.01 EURUSD at 1.08134 [Invalid volume]

2020.05.18 00:12:12 failed instant buy 0.01 EURUSD at 1.08134 [Invalid volume]

2020.05.18 00:12:15 failed instant buy 0.01 EURUSD at 1.08143 [Invalid volume]

2020.05.21 15:50:25 failed instant sell 0.01 EURUSD at 1.10031 [Invalid volume]

2020.05.21 15:50:28 failed instant sell 0.01 EURUSD at 1.10034 [Invalid volume]

2020.05.21 15:50:31 failed instant sell 0.01 EURUSD at 1.10036 [Invalid volume]

2020.05.25 19:00:05 failed instant buy 0.01 EURUSD at 1.08950 [Invalid volume]

2020.05.25 19:00:08 failed instant buy 0.01 EURUSD at 1.08951 [Invalid volume]

2020.05.25 19:00:11 failed instant buy 0.01 EURUSD at 1.08952 [Invalid volume]

there are no trading operations

 
Kirill Voytseshchuk #:

Подскажите при загрузке советника и тестировании пишет ошибка, не понятно как поправить.

test on EURUSD,H1 (netting)

2020.04.14 00:24:42 failed instant buy 0.01 EURUSD at 1.09044 [Invalid volume]

***

Читайте пожалуйста полное сообщение об ошибке - там будет ссылка на статью, "Какие проверки должен пройти ..."
 

Прочитал, вставил в код

Неправильные объемы в торговых операциях

Перед отправкой торговых приказов необходимо также проверять корректность объемов, указываемых в ордере. Количество лотов, которое собирается указать в ордере советник, нужно проверять перед тем как вызвать функцию OrderSend(). Для финансовых инструментов в Спецификации указываются минимальный и максимальный разрешенные объемы для торговли, а также градация объема. Получить эти значения в MQL5 можно из перечисления ENUM_SYMBOL_INFO_DOUBLE с помощью функции SymbolInfoDouble()

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }

Не помогло, может какой другой код поправить?

Подскажите, как доработать скрипт.

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

Прочитал, вставил в код

Неправильные объемы в торговых операциях

Перед отправкой торговых приказов необходимо также проверять корректность объемов, указываемых в ордере. Количество лотов, которое собирается указать в ордере советник, нужно проверять перед тем как вызвать функцию OrderSend(). Для финансовых инструментов в Спецификации указываются минимальный и максимальный разрешенные объемы для торговли, а также градация объема. Получить эти значения в MQL5 можно из перечисления ENUM_SYMBOL_INFO_DOUBLE с помощью функции SymbolInfoDouble()

Не помогло, может какой другой код поправить?

Подскажите, как доработать скрипт.

Читайте статью полностью, 'CheckVolumeValue' - это проверка корректности входных параметров.

А есть ещё проверка правильного округления лота ...

 

С учетом объема открытой позиции и объема в отложенных ордерах, окончательная проверка будет выглядеть так:

//+------------------------------------------------------------------+
//|  Возвращает максимально допустимый объем для ордера по символу   |
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- получим ограничение на максимальный объем в ордере
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- получим ограничение по символу на объем
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- получим объем открытой позиции по символу
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- если мы уже исчерпали объем
      if(max_volume-opened_volume<=0)
         return(0);

      //--- объем открытой позиции не превышает max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

добавить?

checkvolumevalue.mq5 как тут написано


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

//--- выясним сколько знаков после запятой содержится в градации объема
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- проверим  в цикле множество различных значений объема
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("Результат проверки ",volume,": ",descr);
        }
        else PrintFormat("Объем %G является корректным",volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                           |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk #:

С учетом объема открытой позиции и объема в отложенных ордерах, окончательная проверка будет выглядеть так:

добавить?

checkvolumevalue.mq5 как тут написано


Все нужные проверки есть в статье Почти конструктор для создания советника 

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

Про ранее код спросил подходит?

Могли бы написать нужные строчки из статьи.

 

Здравствуйте, не могу понять причину этих ошибок при публикации советника МТ5 на Маркете:

test on EURUSD,H1 (hedging)

2019.04.08 15:43:35 failed cancel order #26 buy stop 1.3 EURUSD at 1.12556 tp: 1.12671 [Invalid stops]

2019.04.30 11:28:39 failed instant sell 1.05 EURUSD at 1.11989, close #104 buy 1.05 EURUSD 1.11920 [Modification failed due to order or position being close to market]

2019.04.30 11:28:39 failed instant sell 0.65 EURUSD at 1.11989, close #103 buy 0.65 EURUSD 1.11862 [Modification failed due to order or position being close to market]

2019.04.30 11:28:39 failed instant sell 0.4 EURUSD at 1.11989, close #102 buy 0.4 EURUSD 1.11800 [Modification failed due to order or position being close to market]

2019.05.29 10:02:13 failed instant buy 1.05 EURUSD at 1.11548, close #199 sell 1.05 EURUSD 1.11617 [Modification failed due to order or position being close to market]

2019.05.29 10:02:13 failed instant buy 0.65 EURUSD at 1.11548, close #198 sell 0.65 EURUSD 1.11677 [Modification failed due to order or position being close to market]

2019.05.29 10:02:13 failed instant buy 0.4 EURUSD at 1.11548, close #197 sell 0.4 EURUSD 1.11737 [Modification failed due to order or position being close to market]

2019.06.20 04:03:41 failed instant sell 1.05 EURUSD at 1.12612, close #297 buy 1.05 EURUSD 1.12488 [Modification failed due to order or position being close to market]

2019.06.20 04:03:41 failed instant sell 0.65 EURUSD at 1.12612, close #296 buy 0.65 EURUSD 1.12428 [Modification failed due to order or position being close to market]

2019.06.20 04:03:41 failed instant sell 0.4 EURUSD at 1.12612, close #295 buy 0.4 EURUSD 1.12368 [Modification failed due to order or position being close to market]

strategy tester report 149 total trades

Например, получается что в 11:28:39 советник пытается закрыть серию ордеров BUY по курсу 1.11989, выставляя встречные ордера SELL

Значения 1.11920, 1,11862, 1.11800 по видимому цены открытия ордеров BUY, так в чем проблема?

Для закрытия позиции использую класс CTrade: m_trade.PositionClose(m_position.Ticket())

 
Добрый день. Не могу выложить обновление в маркете - на странице продукта во вкладке управление/версии при нажатии кнопочки "новая версия"  в браузере не появляется окно загрузки файла. При чем это касается только одной опубликованной в маркете программы, в остальных все работает. Пробовал много раз с разных компьютеров. В чем причина?
Причина обращения: