Мой советник выдает ошибку при регистрации нового продукта:
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$, а не на форексе. Почему тестер не сообщает вам, на каком активе работать?
Как я могу исправить то, что не имеет ошибки, потому что советник работает отлично, я просто не могу зарегистрировать продукт для продажи.
Мой советник возвращает ошибку при регистрации нового продукта:
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_LEVELint 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)
{
//--- Операция покупкиcaseORDER_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);
}
//--- Операция продажиcaseORDER_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);
}
О других проверках, которые должен пройти робот, читайте в статье ниже:
Здравствуйте, я не могу отредактировать описание продукта в одном из моих старых продуктов.
Я следовал инструкциям на различных форумах, включая написание описания заново, скрытие его с рынка и так далее, но описание все равно возвращается к первоначальной версии.
Теперь я больше не могу восстановить продукт на рынке и не могу его редактировать. Я просил помощи на форумах, связанных с этой проблемой, но пока никакой помощи нет.
Как мне решить проблему "Невозможность редактировать описание товара?". Пожалуйста, помогите
Перед отправкой торговых приказов необходимо также проверять корректность объемов, указываемых в ордере. Количество лотов, которое собирается указать в ордере советник, нужно проверять перед тем как вызвать функцию 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);
}
Перед отправкой торговых приказов необходимо также проверять корректность объемов, указываемых в ордере. Количество лотов, которое собирается указать в ордере советник, нужно проверять перед тем как вызвать функцию 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_volumedouble 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);
}
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
Мой советник выдает ошибку при регистрации нового продукта:
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$, а не на форексе. Почему тестер не сообщает вам, на каком активе работать?
Как я могу исправить то, что не имеет ошибки, потому что советник работает отлично, я просто не могу зарегистрировать продукт для продажи.
Мой советник возвращает ошибку при регистрации нового продукта:
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$, а не на форексе. Почему тестер не сообщает вам, на каком активе работать?
Как я могу исправить то, что не имеет ошибки, потому что советник работает отлично, я просто не могу зарегистрировать продукт для продажи.
Робот должен быть готов работать на любом активе.....
Чтобы исправить вышеупомянутую ошибку, перед изменением позиции необходимо выполнить нижеприведенную проверку:
О других проверках, которые должен пройти робот, читайте в статье ниже:
Какие проверки должен пройти торговый робот перед публикацией на рынке - Статьи 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
Подскажите при загрузке советника и тестировании пишет ошибка, не понятно как поправить.
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()
Не помогло, может какой другой код поправить?
Подскажите, как доработать скрипт.
Прочитал, вставил в код
Неправильные объемы в торговых операциях
Перед отправкой торговых приказов необходимо также проверять корректность объемов, указываемых в ордере. Количество лотов, которое собирается указать в ордере советник, нужно проверять перед тем как вызвать функцию OrderSend(). Для финансовых инструментов в Спецификации указываются минимальный и максимальный разрешенные объемы для торговли, а также градация объема. Получить эти значения в MQL5 можно из перечисления ENUM_SYMBOL_INFO_DOUBLE с помощью функции SymbolInfoDouble()
Не помогло, может какой другой код поправить?
Подскажите, как доработать скрипт.
Читайте статью полностью, 'CheckVolumeValue' - это проверка корректности входных параметров.
А есть ещё проверка правильного округления лота ...
С учетом объема открытой позиции и объема в отложенных ордерах, окончательная проверка будет выглядеть так:
добавить?
checkvolumevalue.mq5 как тут написано
С учетом объема открытой позиции и объема в отложенных ордерах, окончательная проверка будет выглядеть так:
добавить?
checkvolumevalue.mq5 как тут написано
Все нужные проверки есть в статье Почти конструктор для создания советника
Про ранее код спросил подходит?
Могли бы написать нужные строчки из статьи.