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

 

Мой советник выдает ошибку при регистрации нового продукта:

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market].

Но мой советник предназначен для работы на WIN$, а не на форексе. Почему тестер не сообщает вам, на каком активе работать?

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

 
Adriano De Mello Moura #:

Мой советник возвращает ошибку при регистрации нового продукта:

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market]

Но мой советник предназначен для работы на WIN$, а не на форексе. Почему тестер не сообщает вам, на каком активе работать?

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

Робот должен быть готов работать на любом активе.....


Чтобы исправить вышеупомянутую ошибку, перед изменением позиции необходимо выполнить нижеприведенную проверку:

//+--------------------------------------------------------------------------------------------------------------------+
//| Проверяет, больше ли расстояние между TakeProfit/StopLoss и ценой закрытия, чем SYMBOL_TRADE_STOPS_LEVEL |
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- Локальные переменные
   bool SL_check = false, TP_check = false;

//--- Определяет последнюю цену для текущего символа
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- получить уровень SYMBOL_TRADE_STOPS_LEVEL
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- проверяйте только два типа заказов
   switch(type)
     {
      //--- Операция покупки
      case  ORDER_TYPE_BUY:
        {
         //--- проверьте StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- проверьте TakeProfit
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- верните результат проверки
         return(SL_check && TP_check);
        }
      //--- Операция продажи
      case  ORDER_TYPE_SELL:
        {
         //--- проверьте StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- проверьте TakeProfit
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- верните результат проверки
         return(TP_check && SL_check);
        }
      break;
     }

//--- Проверка прошла успешно
   return(false);
  }



О других проверках, которые должен пройти робот, читайте в статье ниже:

Какие проверки должен пройти торговый робот перед публикацией на рынке - Статьи MQL5

 

Здравствуйте, я не могу отредактировать описание продукта в одном из моих старых продуктов.

Я следовал инструкциям на различных форумах, включая написание описания заново, скрытие его с рынка и так далее, но описание все равно возвращается к первоначальной версии.

Теперь я больше не могу восстановить продукт на рынке и не могу его редактировать. Я просил помощи на форумах, связанных с этой проблемой, но пока никакой помощи нет.

Как мне решить проблему "Невозможность редактировать описание товара?". Пожалуйста, помогите

 

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

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
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

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

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