Всем привет.
Помощь нужна.
Ордера на продажу переводит в без убыток нормально, а тралить начинает с ошибки 4051. Выдает 130. Но если условие соответствует, модифицирует.
void OrdersModifiStopLoss(int type){ for(int omsl = OrdersTotal() - 1; omsl >= 0; omsl--){ if(OrderSelect(omsl, SELECT_BY_POS, MODE_TRADES)){ if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == type){ if(type == OP_SELL){ if(OrderStopLoss() <= 0){ if(OrderOpenPrice() - Bid >= SL){ stop = OrderOpenPrice(); if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток"); else{ Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток не удалось. Ошибка №", GetLastError()); } } } if(OrderStopLoss() <= OrderOpenPrice()){ if(OrderOpenPrice() - Bid >= SL){ stop = OrderStopLoss() - step; if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс"); else{ Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError()); } } } } if(type == OP_BUY){ if(OrderStopLoss() <= 0){ if(Bid - OrderOpenPrice() >= SL){ stop = OrderOpenPrice(); if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток"); else{ Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток не удалось. Ошибка №", GetLastError()); } } } if(OrderStopLoss() >= OrderOpenPrice()){ if(Bid - OrderStopLoss() >= SL){ stop = OrderStopLoss() + step; if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс"); else{ Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError()); } } } } } } } }
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13398 tp: 0.00000 ok
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13418 tp: 0.00000 ok
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №4051
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: OrderModify error 4051
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: invalid stoploss for OrderModify function
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс в безубыток
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13438 tp: 0.00000 ok
2021.04.15 21:18:45.233 2019.01.24 18:15:00 %WR EURUSD,M15: Ордер OP_SELL открыт!
А с ордерами на покупку все ОКей.
ПС. Нормализация не помогает. Да к тому же все нормализовано в OnInit…
What is MT4 error 4051?
The MT4 error 4051 is a MetaTrader OrderSend error suggesting the trading platform is denying an order due to an invalid trading lot amount.
Whenever an MT4 receives a trade request, it thoroughly examines the parameters of the order. When an EA sends an order request, the system automatically verifies the maximum and minimum limit of trading volumes allowed for the particular entry. At any point, the platform detects an order with a trading lot that you are not permitted to execute; it denies the order request showing ERR_INVALID_FUNCTION_PARAMETER_VALUE.
An OrderSend error 4051 doesn’t necessarily mean the system rejects all the trade requests or disables your trading bot permanently. The MT4 executes an order immediately when it comes with an appropriate amount of trading lot. On the other hand, the restriction over the trading volume prevents your account from suffering unexpected losses due to the wrong parameters of an EA.
Why does MT4 error 4051 happen?
You are exceeding your trading limit
The minimum order limit in MT4 is 0.01 lots, and the maximum limit is 200 lots. If your bot determines a trading lot less than 0.01 or greater than 200, the system will reject the order and show the OrderSend error 4051.
In some cases, your broker server might fail to read the lot amount correctly. For instance, you are trying to execute an order with 0.01 volume, but the minimum order limit of the broker is 0.1. So the server will define the volume as invalid since it turns lesser than the minimum order limit.
Conversely, if you ever try to place an order with more than 200 lots at a time, the MT4 will still refuse to activate the order because it exceeds the maximum trade volume limit.
Your EA is generating inappropriate order parameters
Such problems mainly occur due to an error in EA coding. A malfunction in the programming code may tempt your bot to produce unrealistic trading lot figures which are not recognized as valid parameters by MetaTrader or the broker server.
Apart from an invalid trading lot, your trade can be disallowed for the malfunction of other parameters. For instance, you cannot place a buy order with a stop-loss limit greater than your trade entry or take profit level. These types of problems may happen for two reasons:
- An error in the EA coding
- The EA is not compatible with the trading system
How to fix MT4 error 4051?
How to fix OrderSend error for invalid lot amount
- Use NormalizeDouble in your code
When the system confirms an invalid function parameters value, you may consider using the NormalizeDouble function:
Parameters:
value – determines a value with a floating point.
digits – determines the accuracy formate such as the number of digits after the decimal point.
Please note that you must normalize all the values calculated for stop-loss, take-profit, and pending order prices. - Adjust the value of NormalizeDouble
Sometimes a normalized number may become greater than the DoubleToString value like the following example:
- Make sure normalized figures are rounded
Here is an example showing how to keep the normalized values round figured:
- Broker trading limitations for lot size
f your system still shows the OrderSend error 4051, it might be an issue with your broker trading limitations. In that case, contact the broker and try to be more specific about their maximum and minimum limit of trading lots.
Всем привет.
Помощь нужна.
Ордера на продажу переводит в без убыток нормально, а тралить начинает с ошибки 4051. Выдает 130. Но если условие соответствует, модифицирует.
void OrdersModifiStopLoss(int type){ for(int omsl = OrdersTotal() - 1; omsl >= 0; omsl--){ if(OrderSelect(omsl, SELECT_BY_POS, MODE_TRADES)){ if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == type){ if(type == OP_SELL){ if(OrderStopLoss() <= 0){ if(OrderOpenPrice() - Bid >= SL){ stop = OrderOpenPrice(); if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток"); else{ Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток не удалось. Ошибка №", GetLastError()); } } } if(OrderStopLoss() <= OrderOpenPrice()){ if(OrderOpenPrice() - Bid >= SL){ stop = OrderStopLoss() - step; if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс"); else{ Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError()); } } } } if(type == OP_BUY){ if(OrderStopLoss() <= 0){ if(Bid - OrderOpenPrice() >= SL){ stop = OrderOpenPrice(); if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток"); else{ Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток не удалось. Ошибка №", GetLastError()); } } } if(OrderStopLoss() >= OrderOpenPrice()){ if(Bid - OrderStopLoss() >= SL){ stop = OrderStopLoss() + step; if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite)) Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс"); else{ Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError()); } } } } } } } }
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13398 tp: 0.00000 ok
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13418 tp: 0.00000 ok
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №4051
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: OrderModify error 4051
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: invalid stoploss for OrderModify function
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс в безубыток
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13438 tp: 0.00000 ok
2021.04.15 21:18:45.233 2019.01.24 18:15:00 %WR EURUSD,M15: Ордер OP_SELL открыт!
А с ордерами на покупку все ОКей.
ПС. Нормализация не помогает. Да к тому же все нормализовано в OnInit…
Содержание
- MT4 Error 4051: How to Fix Invalid Trading Lot Amount
- What is MT4 error 4051?
- Why does MT4 error 4051 happen?
- You are exceeding your trading limit
- Your EA is generating inappropriate order parameters
- How to fix MT4 error 4051?
- Ошибка 4051
- Функция OrderClose — Error 4051
- Error 4051 occurred deleting an object
- Error Code 4051 Incorrect Params only on Sell Orders
MT4 Error 4051: How to Fix Invalid Trading Lot Amount
What is MT4 error 4051?
The MT4 error 4051 is a MetaTrader OrderSend error suggesting the trading platform is denying an order due to an invalid trading lot amount.
Whenever an MT4 receives a trade request, it thoroughly examines the parameters of the order. When an EA sends an order request, the system automatically verifies the maximum and minimum limit of trading volumes allowed for the particular entry. At any point, the platform detects an order with a trading lot that you are not permitted to execute; it denies the order request showing ERR_INVALID_FUNCTION_PARAMETER_VALUE.
An OrderSend error 4051 doesn’t necessarily mean the system rejects all the trade requests or disables your trading bot permanently. The MT4 executes an order immediately when it comes with an appropriate amount of trading lot. On the other hand, the restriction over the trading volume prevents your account from suffering unexpected losses due to the wrong parameters of an EA.
Why does MT4 error 4051 happen?
You are exceeding your trading limit
The minimum order limit in MT4 is 0.01 lots, and the maximum limit is 200 lots. If your bot determines a trading lot less than 0.01 or greater than 200, the system will reject the order and show the OrderSend error 4051.
In some cases, your broker server might fail to read the lot amount correctly. For instance, you are trying to execute an order with 0.01 volume, but the minimum order limit of the broker is 0.1. So the server will define the volume as invalid since it turns lesser than the minimum order limit.
Conversely, if you ever try to place an order with more than 200 lots at a time, the MT4 will still refuse to activate the order because it exceeds the maximum trade volume limit.
Your EA is generating inappropriate order parameters
Such problems mainly occur due to an error in EA coding. A malfunction in the programming code may tempt your bot to produce unrealistic trading lot figures which are not recognized as valid parameters by MetaTrader or the broker server.
Apart from an invalid trading lot, your trade can be disallowed for the malfunction of other parameters. For instance, you cannot place a buy order with a stop-loss limit greater than your trade entry or take profit level. These types of problems may happen for two reasons:
- An error in the EA coding
- The EA is not compatible with the trading system
How to fix MT4 error 4051?
How to fix OrderSend error for invalid lot amount
- Use NormalizeDouble in your code
When the system confirms an invalid function parameters value, you may consider using the NormalizeDouble function:
Parameters:
value – determines a value with a floating point.
digits – determines the accuracy formate such as the number of digits after the decimal point.
Please note that you must normalize all the values calculated for stop-loss, take-profit, and pending order prices.
Adjust the value of NormalizeDouble
Sometimes a normalized number may become greater than the DoubleToString value like the following example:
Make sure normalized figures are rounded
Here is an example showing how to keep the normalized values round figured:
Broker trading limitations for lot size
f your system still shows the OrderSend error 4051, it might be an issue with your broker trading limitations. In that case, contact the broker and try to be more specific about their maximum and minimum limit of trading lots.
Источник
В истории есть закрытые ордера.
Выбирать ордер нужно в цикле (в общем случае)
Например так (МТ4) —
Дело не в том, какой цикл использовать (можно хоть for, хоть while), а в том, как он построен. В коде, который Вы привели, цикла нет вообще, выбирается ордер, которого заведомо нет в списке. Проверки успешности выбора ордера тоже нет.
Параметры в функции OrderSend вообще очень странные.
Дело не в том, какой цикл использовать (можно хоть for, хоть while), а в том, как он построен. В коде, который Вы привели, цикла нет вообще, выбирается ордер, которого заведомо нет в списке. Проверки успешности выбора ордера тоже нет.
Параметры в функции OrderSend вообще очень странные.
Не нужно рассчитывать на историю счета. В МТ4 пользователь может изменить глубину отображения истории, чем собьет с толку любой алгоритм, ориентирующийся на нее. Лучше отслеживать наличие ордеров, открытых советником, в списке рабочих ордеров. И только тогда, когда ордер исчез из этого списка (был закрыт), открывать следующий ордер.
Не нужно рассчитывать на историю счета. В МТ4 пользователь может изменить глубину отображения истории, чем собьет с толку любой алгоритм, ориентирующийся на нее. Лучше отслеживать наличие ордеров, открытых советником, в списке рабочих ордеров. И только тогда, когда ордер исчез из этого списка (был закрыт), открывать следующий ордер.
Эксперт работает не с одним ордером? Тогда все усложняется. При открытии каждого ордера нужно запомнить его тикет в собственном массиве. А потом на каждом тике проверять, существует ли этот ордер.
При открытии ордера:
Затем для проверки существования ордера:
Ну и кроме того нужно озаботиться сохранением накопленных данных (в файл, к примеру) для случаев прерывания работы советника.
Эксперт работает не с одним ордером? Тогда все усложняется. При открытии каждого ордера нужно запомнить его тикет в собственном массиве. А потом на каждом тике проверять, существует ли этот ордер.
При открытии ордера:
Затем для проверки существования ордера:
Ну и кроме того нужно озаботиться сохранением накопленных данных (в файл, к примеру) для случаев прерывания работы советника.
Это всего лишь пример кода. Писалось даже без проверки синтаксиса. Смысл — показать направление. Поэтому могут быть какие-то мелкие ошибки.
Это всего лишь пример кода. Писалось даже без проверки синтаксиса. Смысл — показать направление. Поэтому могут быть какие-то мелкие ошибки.
Источник
Функция OrderClose — Error 4051
Решил начать программировать на mql. Написал советник , проверяя как открываются и закрываются ордера. Открывается ордер при соответствующих условиях нормально, а при закррытии появляется Error 4051 — Invalid ticket to OrderClose Function. Помогите пожалуйста разобраться, что я делаю не так. Код советника ниже.
double MA;
MA=iMA(NULL,0,MA_Period,0,MODE_SMA,0,0);
int T;
T=OrdersTotal();
int ticket;
bool a;
После открытия позиции тикет у Вас не сохраняется. И при следующем запуске start переменная ticket инициализируется нулём. Нужно объявить ею как статическую или глобальную чтобы её значение сохранялось. Также полезно контролировать выполнение функции OrderSelect , например:
Что я не так зделал, подскажите плиз
выбираю ордер, узнаю тип, узнаю тиккет, пытаюсь удалить отложенный ордер — выдаёт ошибка 4051
Недопустимое значение параметра функции
if (a2>1)
OrderDelete(ticket2);
Alert (GetLastError()); // Сообщение об ошибке 4051
Ордера на продажу переводит в без убыток нормально, а тралить начинает с ошибки 4051. Выдает 130. Но если условие соответствует, модифицирует.
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263 2019.01.24 18:51:05 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13398 tp: 0.00000 ok
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263 2019.01.24 18:51:04 %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13418 tp: 0.00000 ok
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №4051
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: OrderModify error 4051
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: invalid stoploss for OrderModify function
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс в безубыток
2021.04.15 21:18:45.263 2019.01.24 18:51:03 %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13438 tp: 0.00000 ok
2021.04.15 21:18:45.233 2019.01.24 18:15:00 %WR EURUSD,M15: Ордер OP_SELL открыт!
А с ордерами на покупку все ОКей.
ПС. Нормализация не помогает. Да к тому же все нормализовано в OnInit.
Источник
Error 4051 occurred deleting an object
I use a routine to create an entire table as a summary of all my active trades and each object has a name created by using its x and y positions.
The table maybe 10 columns by 10 lines — i.e. 100 objects created in the same routine — but all very similar
I noticed the following error 4051 and created some additional ‘FileWrite’ statements to try and track the error.
It is only COD330_130 that appears to generate this problem.
The next line would be — say — COD345_130 and no problem
There don’t appear to be any other problems and the EA continues to work
The ‘FileWrite’ generated the following
1 ObjName = COD330_130, Object_label = EURCHF colour = clrMidnightBlue xd = 330 yd = 130, 4051 invalid function parameter value
Any ideas appreciated.
[. ] Any ideas appreciated.
Are you sure that the error 4051 is generated during the code which you have posted, rather than before it?
It seems far more likely that the sequence of events, and the issue, is as follows:
- Block of code earlier to that which you have posted, which does something leading to error 4051
- Then the code which you have posted, which doesn’t generate an error
- Checking GetLastError() then gives you the earlier error, which happened before the block of code which you are querying here.
Источник
Error Code 4051 Incorrect Params only on Sell Orders
This is my first posting on this forum, so please excuse any formatting/procedural errors. I am having difficulty with the Order Modify function. I use an ECN, so I must send the order with 0’s in the SL and TP fields and then use the Order Modify function.
The stop loss and take profit values are inserted perfectly with the buy order code, but fail when a sell order is input, resulting in the 4051 error code. This refers to invalid parameters on the take profit field, but I am using the same approach (not the calcs) on my buy order.
There is obviously something pretty basic that I am missing. I would really appreciate some help/insight on the extent of my error.
Thanks very much
- Always check your return codes. What are Function return values ? How do I use them ? — MQL4 forum
- What is the value of OpenPrice ?
RaptorUK :
Open price for a Buy is Ask, for a Sell it is Bid, how far has price moved between placing your Buy and your Sell ? Don’t use OpenPrice use Ask if you must or use OrderOpenPrice(). Why don’t you print OpenPrice when your OrdrModify() fails ? why don’t you Print Ask, Bid, etc ? don’t you think they are relevant to finding thee cause of your issue ?
I always print values to my journal, but the answer was not obvious until I read the thread on function return values and trapped them. Result was a mod to my code that corrected the problem.
Not sure about your reference to using Ask and Bid. My Order Send uses Ask and Bid as you suggest, and OrderOpenPrice() was used to set the TP and SL. Anyway, the mod to my code was successful.
Thank you both for your time.
This is my first posting on this forum, so please excuse any formatting/procedural errors. I am having difficulty with the Order Modify function. I use an ECN, so I must send the order with 0’s in the SL and TP fields and then use the Order Modify function.
The stop loss and take profit values are inserted perfectly with the buy order code, but fail when a sell order is input, resulting in the 4051 error code. This refers to invalid parameters on the take profit field, but I am using the same approach (not the calcs) on my buy order.
There is obviously something pretty basic that I am missing. I would really appreciate some help/insight on the extent of my error.
Thanks very much
For anyone reading this thread, here is the change I made to make the Stop Loss and Take Profit modification. My problem was based on the value of 0 being returned as the Ticket No. Code replaced in pink and code deleted in yellow .
Источник
What is MT4 error 4051?
The MT4 error 4051 is a MetaTrader OrderSend error suggesting the trading platform is denying an order due to an invalid trading lot amount.
Whenever an MT4 receives a trade request, it thoroughly examines the parameters of the order. When an EA sends an order request, the system automatically verifies the maximum and minimum limit of trading volumes allowed for the particular entry. At any point, the platform detects an order with a trading lot that you are not permitted to execute; it denies the order request showing ERR_INVALID_FUNCTION_PARAMETER_VALUE.
An OrderSend error 4051 doesn’t necessarily mean the system rejects all the trade requests or disables your trading bot permanently. The MT4 executes an order immediately when it comes with an appropriate amount of trading lot. On the other hand, the restriction over the trading volume prevents your account from suffering unexpected losses due to the wrong parameters of an EA.
Why does MT4 error 4051 happen?
You are exceeding your trading limit
The minimum order limit in MT4 is 0.01 lots, and the maximum limit is 200 lots. If your bot determines a trading lot less than 0.01 or greater than 200, the system will reject the order and show the OrderSend error 4051.
In some cases, your broker server might fail to read the lot amount correctly. For instance, you are trying to execute an order with 0.01 volume, but the minimum order limit of the broker is 0.1. So the server will define the volume as invalid since it turns lesser than the minimum order limit.
Conversely, if you ever try to place an order with more than 200 lots at a time, the MT4 will still refuse to activate the order because it exceeds the maximum trade volume limit.
Your EA is generating inappropriate order parameters
Such problems mainly occur due to an error in EA coding. A malfunction in the programming code may tempt your bot to produce unrealistic trading lot figures which are not recognized as valid parameters by MetaTrader or the broker server.
Apart from an invalid trading lot, your trade can be disallowed for the malfunction of other parameters. For instance, you cannot place a buy order with a stop-loss limit greater than your trade entry or take profit level. These types of problems may happen for two reasons:
- An error in the EA coding
- The EA is not compatible with the trading system
How to fix MT4 error 4051?
How to fix OrderSend error for invalid lot amount
- Use NormalizeDouble in your code
When the system confirms an invalid function parameters value, you may consider using the NormalizeDouble function:
Parameters:
value – determines a value with a floating point.
digits – determines the accuracy formate such as the number of digits after the decimal point.
Please note that you must normalize all the values calculated for stop-loss, take-profit, and pending order prices. - Adjust the value of NormalizeDouble
Sometimes a normalized number may become greater than the DoubleToString value like the following example:
- Make sure normalized figures are rounded
Here is an example showing how to keep the normalized values round figured:
- Broker trading limitations for lot size
f your system still shows the OrderSend error 4051, it might be an issue with your broker trading limitations. In that case, contact the broker and try to be more specific about their maximum and minimum limit of trading lots.
GetLastError() — функция, возвращающая коды ошибок. Кодовые константы ошибок определены
в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию
ErrorDescription(), определенную в файле stdlib.mqh.
Константа | Значение | Описание |
---|---|---|
ERR_NO_ERROR | 0 | Нет ошибки |
ERR_NO_RESULT | 1 | Нет ошибки, но результат неизвестен |
ERR_COMMON_ERROR | 2 | Общая ошибка |
ERR_INVALID_TRADE_PARAMETERS | 3 | Неправильные параметры |
ERR_SERVER_BUSY | 4 | Торговый сервер занят |
ERR_OLD_VERSION | 5 | Старая версия клиентского терминала |
ERR_NO_CONNECTION | 6 | Нет связи с торговым сервером |
ERR_NOT_ENOUGH_RIGHTS | 7 | Недостаточно прав |
ERR_TOO_FREQUENT_REQUESTS | 8 | Слишком частые запросы |
ERR_MALFUNCTIONAL_TRADE | 9 | Недопустимая операция нарушающая функционирование сервера |
ERR_ACCOUNT_DISABLED | 64 | Счет заблокирован |
ERR_INVALID_ACCOUNT | 65 | Неправильный номер счета |
ERR_TRADE_TIMEOUT | 128 | Истек срок ожидания совершения сделки |
ERR_INVALID_PRICE | 129 | Неправильная цена |
ERR_INVALID_STOPS | 130 | Неправильные стопы |
ERR_INVALID_TRADE_VOLUME | 131 | Неправильный объем |
ERR_MARKET_CLOSED | 132 | Рынок закрыт |
ERR_TRADE_DISABLED | 133 | Торговля запрещена |
ERR_NOT_ENOUGH_MONEY | 134 | Недостаточно денег для совершения операции |
ERR_PRICE_CHANGED | 135 | Цена изменилась |
ERR_OFF_QUOTES | 136 | Нет цен |
ERR_BROKER_BUSY | 137 | Брокер занят |
ERR_REQUOTE | 138 | Новые цены |
ERR_ORDER_LOCKED | 139 | Ордер заблокирован и уже обрабатывается |
ERR_LONG_POSITIONS_ONLY_ALLOWED | 140 | Разрешена только покупка |
ERR_TOO_MANY_REQUESTS | 141 | Слишком много запросов |
ERR_TRADE_MODIFY_DENIED | 145 | Модификация запрещена, так как ордер слишком близок к рынку |
ERR_TRADE_CONTEXT_BUSY | 146 | Подсистема торговли занята |
ERR_TRADE_EXPIRATION_DENIED | 147 | Использование даты истечения ордера запрещено брокером |
ERR_TRADE_TOO_MANY_ORDERS | 148 | Количество открытых и отложенных ордеров достигло предела, установленного брокером. |
Константа | Значение | Описание |
---|---|---|
ERR_NO_MQLERROR | 4000 | Нет ошибки |
ERR_WRONG_FUNCTION_POINTER | 4001 | Неправильный указатель функции |
ERR_ARRAY_INDEX_OUT_OF_RANGE | 4002 | Индекс массива — вне диапазона |
ERR_NO_MEMORY_FOR_FUNCTION_CALL_STACK | 4003 | Нет памяти для стека функций |
ERR_RECURSIVE_STACK_OVERFLOW | 4004 | Переполнение стека после рекурсивного вызова |
ERR_NOT_ENOUGH_STACK_FOR_PARAMETER | 4005 | На стеке нет памяти для передачи параметров |
ERR_NO_MEMORY_FOR_PARAMETER_STRING | 4006 | Нет памяти для строкового параметра |
ERR_NO_MEMORY_FOR_TEMP_STRING | 4007 | Нет памяти для временной строки |
ERR_NOT_INITIALIZED_STRING | 4008 | Неинициализированная строка |
ERR_NOT_INITIALIZED_ARRAYSTRING | 4009 | Неинициализированная строка в массиве |
ERR_NO_MEMORY_FOR_ARRAYSTRING | 4010 | Нет памяти для строкового массива |
ERR_TOO_LONG_STRING | 4011 | Слишком длинная строка |
ERR_REMAINDER_FROM_ZERO_DIVIDE | 4012 | Остаток от деления на ноль |
ERR_ZERO_DIVIDE | 4013 | Деление на ноль |
ERR_UNKNOWN_COMMAND | 4014 | Неизвестная команда |
ERR_WRONG_JUMP | 4015 | Неправильный переход |
ERR_NOT_INITIALIZED_ARRAY | 4016 | Неинициализированный массив |
ERR_DLL_CALLS_NOT_ALLOWED | 4017 | Вызовы DLL не разрешены |
ERR_CANNOT_LOAD_LIBRARY | 4018 | Невозможно загрузить библиотеку |
ERR_CANNOT_CALL_FUNCTION | 4019 | Невозможно вызвать функцию |
ERR_EXTERNAL_EXPERT_CALLS_NOT_ALLOWED | 4020 | Вызовы внешних библиотечных функций не разрешены |
ERR_NOT_ENOUGH_MEMORY_FOR_RETURNED_STRING | 4021 | Недостаточно памяти для строки, возвращаемой из функции |
ERR_SYSTEM_BUSY | 4022 | Система занята |
ERR_INVALID_FUNCTION_PARAMETERS_COUNT | 4050 | Неправильное количество параметров функции |
ERR_INVALID_FUNCTION_PARAMETER_VALUE | 4051 | Недопустимое значение параметра функции |
ERR_STRING_FUNCTION_INTERNAL_ERROR | 4052 | Внутренняя ошибка строковой функции |
ERR_SOME_ARRAY_ERROR | 4053 | Ошибка массива |
ERR_INCORRECT_SERIES_ARRAY_USING | 4054 | Неправильное использование массива-таймсерии |
ERR_CUSTOM_INDICATOR_ERROR | 4055 | Ошибка пользовательского индикатора |
ERR_INCOMPATIBLE_ARRAYS | 4056 | Массивы несовместимы |
ERR_GLOBAL_VARIABLES_PROCESSING_ERROR | 4057 | Ошибка обработки глобальныех переменных |
ERR_GLOBAL_VARIABLE_NOT_FOUND | 4058 | Глобальная переменная не обнаружена |
ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE | 4059 | Функция не разрешена в тестовом режиме |
ERR_FUNCTION_NOT_CONFIRMED | 4060 | Функция не подтверждена |
ERR_SEND_MAIL_ERROR | 4061 | Ошибка отправки почты |
ERR_STRING_PARAMETER_EXPECTED | 4062 | Ожидается параметр типа string |
ERR_INTEGER_PARAMETER_EXPECTED | 4063 | Ожидается параметр типа integer |
ERR_DOUBLE_PARAMETER_EXPECTED | 4064 | Ожидается параметр типа double |
ERR_ARRAY_AS_PARAMETER_EXPECTED | 4065 | В качестве параметра ожидается массив |
ERR_HISTORY_WILL_UPDATED | 4066 | Запрошенные исторические данные в состоянии обновления |
ERR_TRADE_ERROR | 4067 | Ошибка при выполнении торговой операции |
ERR_END_OF_FILE | 4099 | Конец файла |
ERR_SOME_FILE_ERROR | 4100 | Ошибка при работе с файлом |
ERR_WRONG_FILE_NAME | 4101 | Неправильное имя файла |
ERR_TOO_MANY_OPENED_FILES | 4102 | Слишком много открытых файлов |
ERR_CANNOT_OPEN_FILE | 4103 | Невозможно открыть файл |
ERR_INCOMPATIBLE_ACCESS_TO_FILE | 4104 | Несовместимый режим доступа к файлу |
ERR_NO_ORDER_SELECTED | 4105 | Ни один ордер не выбран |
ERR_UNKNOWN_SYMBOL | 4106 | Неизвестный символ |
ERR_INVALID_PRICE_PARAM | 4107 | Неправильный параметр цены для торговой функции |
ERR_INVALID_TICKET | 4108 | Неверный номер тикета |
ERR_TRADE_NOT_ALLOWED | 4109 | Торговля не разрешена |
ERR_LONGS_NOT_ALLOWED | 4110 | Длинные позиции не разрешены |
ERR_SHORTS_NOT_ALLOWED | 4111 | Короткие позиции не разрешены |
ERR_OBJECT_ALREADY_EXISTS | 4200 | Объект уже существует |
ERR_UNKNOWN_OBJECT_PROPERTY | 4201 | Запрошено неизвестное свойство объекта |
ERR_OBJECT_DOES_NOT_EXIST | 4202 | Объект не существует |
ERR_UNKNOWN_OBJECT_TYPE | 4203 | Неизвестный тип объекта |
ERR_NO_OBJECT_NAME | 4204 | Нет имени объекта |
ERR_OBJECT_COORDINATES_ERROR | 4205 | Ошибка координат объекта |
ERR_NO_SPECIFIED_SUBWINDOW | 4206 | Не найдено указанное подокно |
ERR_SOME_OBJECT_ERROR | 4207 | Ошибка при работе с объектом |
Обнулил СЛ и ТП, и установил их модификацией.
//+------------------------------------------------------------------+ //| ccc.mq4 | //| Copyright © 2011, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "VAGEYEV" #include <stdlib.mqh> //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ extern double StopLoss = 30; extern double TakeProfit = 300; extern double LotSize = 0.1; extern int Slippage = 5; int SellTicket,UseSlippage; double PointDigits; int init() { //---- PointDigits=Point*IncreasePoint(); //Нормализация поинта UseSlippage = GetSlippage(Symbol(),Slippage); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- // Calculate open price, stop loss and take profit double OpenPrice = NormalizeDouble(Bid,Digits); double tp = NormalizeDouble(Bid-TakeProfit*PointDigits,Digits); double sl = NormalizeDouble(Bid+StopLoss*PointDigits,Digits); Print(OpenPrice," ",tp," ",sl); // Open Sell Order if (SellTicket==0) { SellTicket = OrderSend(Symbol(),OP_SELL,3*LotSize,OpenPrice,UseSlippage,0,0,"Sell Order",0,0,Green); if (SellTicket==-1) { int ErrorCode = GetLastError(); string ErrDesc = ErrorDescription(ErrorCode); Print(ErrorCode," ",ErrDesc); string ErrAlert = StringConcatenate(ErrorCode,": ",ErrDesc); Alert(ErrAlert); }else{ Alert("Ура Ордер открылся!!!"); if (OrderModify(SellTicket,NormalizeDouble(OpenPrice,Digits),sl,tp,0)) { Alert("Установка СЛ и ТП тоже прошла успешно!"); return; }Alert("Но установка стопов, провалилась. , OpenPrice= ",OpenPrice," sl= ",sl," tp= ",tp,", err= ",GetLastError()); } }return(0); } // Get Slippage Function int GetSlippage(string Currency, int SlippagePips) { int CalcDigits = MarketInfo(Currency,MODE_DIGITS); if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips; else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10; return(CalcSlippage); } //+------------------------------------------------------------------+ int IncreasePoint() { int d=Digits; if(d==3 || d==5)return(10); return(1); }И добавил правильный расчёт поинта… Ф-ию расчёта поинта, взял на этом форуме.
Наконец-то Вы сняли проклятие пятизнака.
При работе торгового терминала MetaTrader 4 возникают различные ошибки при обмене информацией с торговым сервером, который в ответ на ошибочные запросы отсылает программе MetaTrader 4 не описание ошибки, а цифровой код ошибки — специальную комбинацию цифр, которая отображается во вкладках Эксперты
и Журнал
(примеры этих вкладок и описание типичной ситуации при возникновении ошибок можно найти в статье «Обзор торгового терминала MetaTrader 4»). Не все торговые терминалы MetaTrader 4 различных дилинговых центров дают расшифровку цифрового кода, а если она и есть, то — на английском языке. Чтобы понять, почему программа МетаТрейдер 4 работает неправильно, полезно знать расшифровку цифрового кода — какой комбинации цифр соответствует определенное описание ошибки. В некоторых случаях эта информация может сильно облегчить «жизнь» трейдеру и помочь быстрее справиться с возникшей проблемой.
Итак, предлагаем Вашему вниманию расшифровку кодов ошибок, которые можно встретить при работе с торговым терминалом MetaTrader 4:
Коды ошибок, возвращаемые торговым сервером терминалу MetaTrader 4.
- Error: 0 — Нет ошибки.
- Error: 1 — Нет ошибки, но результат неизвестен.
- Error: 2 — Общая ошибка.
- Error: 3 — Неправильные параметры.
- Error: 4 — Торговый сервер занят.
- Error: 5 — Старая версия клиентского терминала.
- Error: 6 — Нет связи с торговым сервером.
- Error: 7 — Недостаточно прав.
- Error: 8 — Слишком частые запросы.
- Error: 9 — Недопустимая операция, нарушающая функционирование сервера.
- Error: 64 — Счёт заблокирован.
- Error: 65 — Неправильный номер счета.
- Error: 128 — Истек срок ожидания совершения сделки.
- Error: 129 — Неправильная цена.
- Error: 130 — Неправильные стопы.
- Error: 131 — Неправильный объём.
- Error: 132 — Рынок закрыт.
- Error: 133 — Торговля запрещена.
- Error: 134 — Недостаточно денег для совершения операции.
- Error: 135 — Цена изменилась.
- Error: 136 — Нет цен.
- Error: 137 — Брокер занят.
- Error: 138 — Новые цены.
- Error: 139 — Ордер заблокирован и уже обрабатывается.
- Error: 140 — Разрешена только покупка.
- Error: 145 — Модификация запрещена, так как ордер слишком близок к рынку.
- Error: 146 — Подсистема торговли занята.
- Error: 147 — Использование даты истечения ордера запрещено брокером.
- Error: 148 — Количество открытых и отложенных ордеров достигло предела, установленного брокером.
- Error: 149 — Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.
- Error: 150 — Попытка закрыть позицию по инструменту в противоречии с правилом FIFO.
Коды ошибок выполнения MQL4-программы (советника):
- Error: 4000 — Нет ошибки.
- Error: 4001 — Неправильный указатель функции.
- Error: 4002 — Индекс массива — вне диапазона.
- Error: 4003 — Нет памяти для стека функций.
- Error: 4004 — Переполнение стека после рекурсивного вызова.
- Error: 4005 — На стеке нет памяти для передачи параметров.
- Error: 4006 — Нет памяти для строкового параметра.
- Error: 4007 — Нет памяти для временной строки.
- Error: 4008 — Неинициализированная строка.
- Error: 4009 — Неинициализированная строка в массиве.
- Error: 4010 — Нет памяти для строкового массива.
- Error: 4011 — Слишком длинная строка.
- Error: 4012 — Остаток от деления на ноль.
- Error: 4013 — Деление на ноль.
- Error: 4014 — Неизвестная команда.
- Error: 4015 — Неправильный переход.
- Error: 4016 — Неинициализированный массив.
- Error: 4017 — Вызовы DLL не разрешены.
- Error: 4018 — Невозможно загрузить библиотеку.
- Error: 4019 — Невозможно вызвать функцию.
- Error: 4020 — Вызовы внешних библиотечных функций не разрешены.
- Error: 4021 — Недостаточно памяти для строки, возвращаемой из функции.
- Error: 4022 — Система занята.
- Error: 4050 — Неправильное количество параметров функции.
- Error: 4051 — Недопустимое значение параметра функции.
- Error: 4052 — Внутренняя ошибка строковой функции.
- Error: 4053 — Ошибка массива.
- Error: 4054 — Неправильное использование массива-таймсерии.
- Error: 4055 — Ошибка пользовательского индикатора.
- Error: 4056 — Массивы несовместимы.
- Error: 4057 — Ошибка обработки глобальныех переменных.
- Error: 4058 — Глобальная переменная не обнаружена.
- Error: 4059 — Функция не разрешена в тестовом режиме.
- Error: 4060 — Функция не разрешена.
- Error: 4061 — Ошибка отправки почты.
- Error: 4062 — Ожидается параметр типа string.
- Error: 4063 — Ожидается параметр типа integer.
- Error: 4064 — Ожидается параметр типа double.
- Error: 4065 — В качестве параметра ожидается массив.
- Error: 4066 — Запрошенные исторические данные в состоянии обновления.
- Error: 4067 — Ошибка при выполнении торговой операции.
- Error: 4099 — Конец файла.
- Error: 4100 — Ошибка при работе с файлом.
- Error: 4101 — Неправильное имя файла.
- Error: 4102 — Слишком много открытых файлов.
- Error: 4103 — Невозможно открыть файл.
- Error: 4104 — Несовместимый режим доступа к файлу.
- Error: 4105 — Ни один ордер не выбран.
- Error: 4106 — Неизвестный символ.
- Error: 4107 — Неправильный параметр цены для торговой функции.
- Error: 4108 — Неверный номер тикета.
- Error: 4109 — Торговля не разрешена. Необходимо включить опцию
Разрешить советнику торговать
в свойствах эксперта. - Error: 4110 — Длинные позиции не разрешены — необходимо проверить свойства эксперта.
- Error: 4111 — Короткие позиции не разрешены — необходимо проверить свойства эксперта.
- Error: 4200 — Объект уже существует.
- Error: 4201 — Запрошено неизвестное свойство объекта.
- Error: 4202 — Объект не существует.
- Error: 4203 — Неизвестный тип объекта.
- Error: 4204 — Нет имени объекта.
- Error: 4205 — Ошибка координат объекта.
- Error: 4206 — Не найдено указанное подокно.
- Error: 4207 — Ошибка при работе с объектом.
2 replies
Hello
Been running strategyquant created ea on live account but notice sometimes get error message on metatrader terminal. (running ea on 2 different brokers live accounts). Both accounts get this message at the same time and on the same currency pair : Order failed error : 4051 Invalid lots amount for order send function.
The ea is programmed to open a set lot amount of 0.01 lots.
Does anyone know why this error message comes up sometimes and does not open position?
Regards
Fritz
hm, this error means incorrect parameter was used. Can you check in the journal what is the order size it is trying to open?
Does it happen only sometimes and other times the orders are opened correctly?
I cannot say what could cause this now, without knowing more details.
Mark
StrategyQuant architect
Hi Mark
Yes, it only happens sometimes. Most of the time it’s fine. I have the ea programmed to only open orders with the minimum lot size of 0.01 lots for any order. I could not see any details in the journal where it provides any information about the lot size it is trying to open. It seems that when 4 or 5 orders are already opened it does not want to open any more? But I have not programmed this into the ea. I have not included a maximum number of orders allowed but it seems this may be the problem? I also open 2 orders at the same time (using different trailing stops) but I don’t think this could be the problem? or maybe it could be??
Regards
Fritz
You must be logged in to reply to this topic.
Sign in
Разбор полетов! Коды ошибок, их значения и способы устранения.
Разбор полетов! Коды ошибок, их значения и способы устранения.
Ввиду частых обращений ко мне, как специалисту в области программирования советников на мт4, с вопросами об ошибках, я попытаюсь Вам рассказать наиболее частые ошибки трейдера, и ошибки советников, способы их устранения и причины их возникновения.
Каждый советник имеет свой функциональный режим, но будем исходить из стандартного набора проблем и распространенных ошибок советников.
Итак начнем.
Краткая справка по ошибкам изложена в Коды Ошибок, а также в самом терминале MetaTrader4
Исходя из них — мы попробуем в стиле Руководства по ошибкам электронной техники описать проблему и способ ее решения.
Если Вашей ошибки нет в данной таблице, или способы решения не помогли, обратитесь к автору Вашего советника, но перед этим воспользуйтесь статьей Log файлы для детального рассмотрения проблемы с роботами* (Expforex Прибыльные советники — — Стратегии Форекс —)
ошибка 4, 146
Торговый сервер занят
1. Советник подал слишком много приказов одновременно
2. Не дождавшись ответа от сервера, при выполнении операции — советник пытается отправить новый приказ, Сервер перегружен
1. Перезагрузка терминала
2. Оптимизация кода советника с помощью функций обработки ошибок.
ошибка8, 141
Слишком частые запросы
1. Предыдущие причины ошибки, в сильно частом запросе.
ошибка129
Неправильная цена
1. Цена по которой Вы пытаетесь открыть позицию (BUY SELL)- неправильная
1. Золотое правило: BUY нужно открывать по Ask а закрывать по BID
SELL нужно открывать по BID а закрывать по ASK
ошибка130,145
Неправильные стопы
1. Стопы= Стоплосс, тейкпрофит или уровень открытия отложенника или лимитника.
2. Стопы расположены слишком близко к цене
3. Ваш счет открыт в группе ECN (ЕЦН) или NDD (НДД)
4. Ваш брокер использует Рыночное исполнение позиций
1. Проверьте значения Ваших стоплосс, тейпрофитов
2. Уточните минимальный стоп уровень по Вашему инструменту у брокера, при выставлении стопов — соблюдайте уровень минимальной дистанции
3. В хорошо написанном советнике должны быть функции работы на счетах ECN и NDD
ошибка131
Неправильный объем
1. Неправильный лот при открытии сделки
2. Лот, который вы пытаетесь открыть, меньше минимального
3. Лот, который вы пытаетесь открыть больше максимального
4. Разрядность лота отличается от разрядности брокера.
1. Проверьте правильность открытия лота, изучите спецификацию контракта и прочтите условия торговли в Вашем ДЦ
2.3. Проверьте, Минимальный и Максимальный лот в Вашем ДЦ и на Вашем счете. На некоторых типах счетов, минимальный лот может быть 0.01 а также 0.1 и даже 3. Максимальный лот может быть 5 лотов и 999 лотов и другие.
4. Уточните разрядность лотов на Вашем сервере. Если например разрядность лотов=1, то можно открыть лот 0.1 или 0.5 или 1.2 и так далее, с 1 знаком после запятой, если разрядность лота 2 знака, то исходя из минимального лота, лот может быть 0.01, 0.06, 0.17, 1.48. Также в некоторых ДЦ существует порядок степени лотов, например можно открыть 0.5 и 1 и 1.5 и так далее, а например 0.6 открыть нельзя. Уточните у своего брокера порядок установки лотов.
ошибка132
Рынок закрыт
1. Рынок закрыт в Выходные дни
1.Пробуйтесвязаться с рынком после выходных
ошибка133
Торговля запрещена
1. В данный момент торговля запрещена
2. По данной валютной паре запрещено торговать
1. Попробуйте торговать после выходных
ошибка134
Недостаточно денег для совершения операции
1. Лот, который Вы пытаетесь открыть, слишком большой, на него не хватает маржи
1. Проверьте уровень свободных средств, ирассчитайтесредства, которые Вам нужны, для открытия лота
2. Следите за уровнем Ваших свободных средств
ошибка135..138
Цена изменилась
1. Реквот
2. Слишком быстрый рынок
3. Брокер или ДЦ не дает Вам поставить позицию по заявленной цене
1. Не торгуйте в такие моменты
2. Увеличьте уровеньпроскальзывания, но помните что это влечет за собой открытие позиций не по заявленной Вами цене.
3. Сделайте в советнике функцию обработки ошибок и количество попыток открытия позиций
ошибка 147
Использование даты истечения ордера запрещено брокером
1. Ваш советник или Вы пытаетесь установить срок истечения отложенного ордера
1. В советнике, в функции OrderSend в параметре срок истечения поставьте=0
2. Не устанавливайте срок истечения ордера.
ошибка 148
Количество открытых и отложенных ордеров достигло предела, установленного брокером.
1. Максимальноеколичествооткрытых ордеров и позиций достигнут предела, установленного брокером.
1. Удалите или закройте часть позиций
2. Остановите процесс открытия новых позиций
3. Соблюдайте иерархию сделок, лучше открыть 1 позицию лото 0.1 одновременно, чем 10 позиций лотом 0.01 с потерей спреда.
ошибка 4012, 4013
zero devide
Остаток от деления на ноль
- Вы пытаетесь поделить число на 0.
- Проверьте Весь код советника на наличие такой грубой ошибки, или же проверьте все значения из MarketInfo функций на момент возвращения 0, иногда при MarketInfo(Symbol(),MODE_SPREAD) возвращается не спред а 0 (у брокеров с плавающим спредом)
ошибка 4017
Вызовы DLL не разрешены
- В Вашем терминале запрещен вызов DLL
- Разрешите вызов DLL через Меню – сервис – Настройки – Советник – Разрешить вызов DLL, но помните, разрешайте данную опцию только для советников, в которых Вы уверены, и уверены что в ДЛЛ не сидит какой-нибудь троян. Проверьте ДЛЛ на наличие троянов с помощью антивируса.
Ошибка 4018 , 4019
Невозможно загрузить библиотеку
- Библиотека повреждена
- Вызов библиотеки осуществляется с ошибкой
- Проверьте библиотеку DLL
- Обратитесь к разработчику данной библиотеки
Ошибка 4020
Вызовы внешних библиотечных функций не разрешены
- В Вашем терминале запрещен вызов функций из внешних экспертов
- Разрешите вызов функций через Меню – сервис – Настройки – Советник – Разрешить вызов внешних экспертов,
Ошибка 4103
Невозможно открыть файл
- Данный файл не существует
- Данный файл заблокирован
- Проверьте наличие указанного файла в папке experts – files
Tester – files
- Проверьте не заблокирован ли файл системой антивируса. Разрешен ли режим записичтения файла
Ошибка 4106
Неизвестный символ
- Символа нет в обзоре рынка
- В обзоре рынка – правой кнопкой мыши – показать все символы
- Проверить названия символа в советнике и наличие его в обзоре рынка
- Некоторые советники используют четкие названия без суфиксов, а брокеры намеренно ставят суфиксы, например EURUSDx где х – суфикс.
Ошибка 4108
Неверный номер тикета
- Тикет ордера, который выбирает эксперт – не существует
- Эксперт пытается выбрать тикет, но данный ордер был закрыт другим советником или руками.
- При попытке осуществления приказа над ордером, тикет был исполнен и закрыт брокером.
- Если данная ошибка появляется очень часто, 100-1000 раз за минуту, проверьте функции Вашего советника
- Отключите другие советники, или настройте их так, чтобы они не конфликтовали, не закрывайте ордер руками, когда эксперт выполняет операцию
Ошибка 4109
Торговля не разрешена
- Советнику запрещено торговать, на графике грустный смайл или крестик
- Включите галочку «Разрешить советнику торговать» в вкладе при установке советника, либо в меню- сервис – настройки – советники.
Ошибка 4110, 4111
Длинные позиции не разрешены
Короткие позиции не разрешены
- В настройках советника, в вкладке Общие не разрешен тип позиций
- В Вкладке Общие, при установке советника есть выбор позиций:
Long Short – Разрешены BUY SELL
Only Long– Разрешен BUY
Only Short – Разрешен SELL
НЕ ЗАБЫВАЕМ ГОВОРИТЬ СПАСИБО И НАЖИМАТЬ КНОПКУ
Я забил код в скрипт, и нормально открывает по рынку, без ошибок…
Кстати, это условие:
if (SellTicket==0)
{
}
Если это скрипт, то условие совершенно бесполезное, так как ограничивать количество ордеров в скрипте не имеющем циклов, без смысленно.
Но если этот код из експерта, то так вы тоже не ограничите количество ордеров, так как переменная int SellTicket; инициализируется(обнуляется) в функции int start(){} на каждом тике.
Нужно вынести int SellTicket; за пределы Старта, то- есть вверх!
И тогда это условие будет физически ограничивать количество устанавливаемых ордеров, так как при установке ордера переменная получит не нулевое значение.
Мэкс, спасибо за комментарии. Я внёс некоторые изменения. Сразу уточню — это часть советника. Но, ошибка 130 может возникать только в строке где OrderSend.
Почему-то в 4-хзнаке всё работает, а в пятизнаке — выдаёт по-прежнему ошибку 130.
Возможно, как опытный программист вы сможете найти неточность или роковую ошибку пятизнака.
Заранее благодарен, если подскажите.
//+——————————————————————+
//| ccc.mq4 |
//| Copyright © 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+——————————————————————+
#property copyright «VAGEYEV»
#include <stdlib.mqh>
//+——————————————————————+
//| expert initialization function |
//+——————————————————————+
int UseSlippage;
double UsePoint;
extern int Slippage = 5;
extern double StopLoss = 30;
extern double T_P=300;
extern int MagicNumber = 0;
int init()
{
//—-
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(),Slippage);
//—-
return(0);
}
//+——————————————————————+
//| expert deinitialization function |
//+——————————————————————+
int deinit()
{
//—-
//—-
return(0);
}
//+——————————————————————+
//| expert start function |
//+——————————————————————+
int start()
{
//—-
double LotSize = 0.01;
// Open buy order
while(IsTradeContextBusy()) Sleep(10);
RefreshRates();
// Calculate stop loss and take profit
double OpenPrice = Ask;
double StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL) * Point;
double UpperStopLevel = Ask + StopLevel;
double LowerStopLevel = Bid — StopLevel;
double MinStop = 5 * UsePoint;
// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice — (StopLoss * UsePoint);
if(T_P > 0) double BuyTakeProfit = OpenPrice + (T_P * UsePoint);
//Verify stop loss and take profit
if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel)
{
BuyStopLoss = LowerStopLevel — MinStop;
}
if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel)
{
BuyTakeProfit = UpperStopLevel + MinStop;
}
int BuyTicket = OrderSend(Symbol(),OP_BUY,3*LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,»Buy Order»,MagicNumber,0,Green);
if (BuyTicket==-1)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
Print(ErrorCode,» «,ErrDesc);
string ErrAlert = StringConcatenate(ErrorCode,»: «,ErrDesc);
Alert(ErrAlert);
}
//—-
return(0);
}
// Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return(CalcSlippage);
}
// Pip Point Function
double PipPoint(string Currency)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return(CalcPoint);
}
//+——————————————————————+
Thank you for the reply. I got it working by performing Risk_Percent*0.01 rather than Risk_Percent/100. Dont understand why one works and the other doesn’t, they both give the exact same answer. If I left the Risk_Percent a double I wouldn’t be able to alter it in the input box ? It would always be a value?
I want to implement a particular trailing stop but im having a small amount of difficulties with it also. I would like it to start a trailing stop once it gets to Xpercent between OpenOrderPrice and Take_Profit. Can you have a look at it please. The elements in bold are the only ones I shifted from a normal trailing stop.
Factors:
Inserted Code extern int Start_Trailing_Stop_Percent = 70; extern int Trailing_Stop = 100; double LowestShift = iLowest(Symbol(), PERIOD_H1, MODE_LOW, 50, 1); double HighestShift = iHighest(Symbol(), PERIOD_H1, MODE_HIGH, 50, 1); double Lowest = iLow(Symbol(), PERIOD_H1, LowestShift); double Maximum = iHigh(Symbol(), PERIOD_H1, HighestShift); double Buy_Take_Profit = ((Bid-Lowest) Ask); double Sell_Take_Profit = (Bid-(Highest-Ask));
Trailing Stop:
Inserted Code for(int I=0;ilt;OrdersTotal();I ) { //Select Open trades if(OrderSelect(I,SELECT_BY_POS,MODE_TRADES) == false) {} //Perform monitoring stop on buy trade if (OrderType() == OP_BUY OrderSymbol() == Symbol()) { if(Trailing_Stopgt;0) { #91;b#93;if(Bidgt;-LRB-(((Start_Trailing_Stop_Percent*0.01)*(Buy_Take_Pro fit-OrderOpenPrice())))) OrderOpenPrice()) {#91;/b#93; if(OrderStopLoss()lt;Bid-Point*Trailing_Stop) { if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*Trailing_Stop,OrderTakeProfit(),0,clrGreen)) return; else {} } } } } //Perform monitoring stop on Sell trade if(OrderType() == OP_SELL OrderSymbol() == Symbol()){ if(Trailing_Stopgt;0) { #91;b#93;if(Asklt;(OrderOpenPrice()-((((Start_Trailing_Stop_Percent*0.01)*(OrderOpenPr ice()-Sell_Take_Profit)))))) {#91;/b#93; if((OrderStopLoss()gt;(Ask Point*Trailing_Stop)) || (OrderStopLoss()==0)) { if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask Point*Trailing_Stop,OrderTakeProfit(),0,clrRed)) return; else {} } } } } }