пишет такое
test on EURUSD,H1
2016.04.04 16:00:00 Tester: not enough money for buy 100.00 EURUSD at 1.13992 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
2016.04.04 16:00:00 Tester: PrevBalance: 10000.00, PrevPL: 0.00, PrevEquity 10000.00, PrevMargin: 0.00, NewMargin: 113983, FreeMargin: -103983.00
2016.04.04 16:00:00 2222 EURUSD,H1: OrderSend error 134
2016.04.04 16:00:00 Tester: not enough money for buy 100.00 EURUSD at 1.13992 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
2016.04.04 16:00:00 Tester: PrevBalance: 10000.00, PrevPL: 0.00, PrevEquity 10000.00, PrevMargin: 0.00, NewMargin: 113983, FreeMargin: -103983.00
2016.04.04 16:00:00 2222 EURUSD,H1: OrderSend error 134
2016.04.04 16:00:00 Tester: not enough money for buy 100.00 EURUSD at 1.13992 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
2016.04.04 16:00:00 Tester: PrevBalance: 10000.00, PrevPL: 0.00, PrevEquity 10000.00, PrevMargin: 0.00, NewMargin: 113983, FreeMargin: -103983.00
2016.04.04 16:00:00 2222 EURUSD,H1: OrderSend error 134
0 11:52:38.864 2016.04.04 16:00:00 2222 EURUSD,H1: Alert: Ошибка открытия: Недостаточно денег для совершения операции
2016.04.04 16:00:00 Tester: not enough money for buy 100.00 EURUSD at 1.13991 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
2016.04.04 16:00:00 Tester: PrevBalance: 10000.00, PrevPL: 0.00, PrevEquity 10000.00, PrevMargin: 0.00, NewMargin: 113982, FreeMargin: -103982.00
2016.04.04 16:00:00 2222 EURUSD,H1: OrderSend error 134
2016.04.04 16:00:00 Tester: not enough money for buy 100.00 EURUSD at 1.13991 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
2016.04.04 16:00:00 Tester: PrevBalance: 10000.00, PrevPL: 0.00, PrevEquity 10000.00, PrevMargin: 0.00, NewMargin: 113982, FreeMargin: -103982.00
2016.04.04 16:00:00 2222 EURUSD,H1: OrderSend error 134
2016.04.04 16:00:00 Tester: not enough money for buy 100.00 EURUSD at 1.13991 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
2016.04.04 16:00:00 Tester: PrevBalance: 10000.00, PrevPL: 0.00, PrevEquity 10000.00, PrevMargin: 0.00, NewMargin: 113982, FreeMargin: -103982.00
2016.04.04 16:00:00 2222 EURUSD,H1: OrderSend error 134
0 11:52:38.864 2016.04.04 16:00:00 2222 EURUSD,H1: Alert: Ошибка открытия: Недостаточно денег для совершения операции
2016.04.04 16:00:01 Tester: not enough money for buy 100.00 EURUSD at 1.13992 sl: 0.00000 tp: 0.00000 [2016.04.04 16:00]
there are no trading operations
Добавил код
bool CheckMoneyForTrade(string symb, double lots,int type)
{
double free_margin=AccountFreeMarginCheck(symb,type,lots);
//-- если денег не хватает
if(free_margin<0)
{
string oper=(type==OP_BUY)? "Buy":"Sell";
Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
return(false);
}
//-- проверка прошла успешно
return(true);
}
и та же проблема.
Что еще может быть?
Содержание
- 134 Ошибка OrderSend () — Как от нее избавиться?
- MT4 Error 134: How to fix ERR_NOT_ENOUGH_MONEY
- What is MT4 Error 134
- Why does MT4 error 134 happen?
- A badly designed EA
- A change in the trading leverage and account types
- How to fix MT4 OrderSend error 134?
- OrderSend Error 134 (Not Enough Money) in MT4 and Error 10019 in MT5
- Fixing Error 134 (ERR_NOT_ENOUGH_MONEY) in MT4
- Fixing Error 10019 (TRADE_RETCODE_NO_MONEY) in MT5
- Советник не всегда открывает ордера, и не всегда их модифицирует. OrderSend error 134 и OrderModify error 4108.
- Tester incorrectly generates error 134
134 Ошибка OrderSend () — Как от нее избавиться?
Я пытаюсь открыть сделку, используя определенный лот, рассчитанный по моей формуле.
Когда я пытался купить, он говорит, что я не могу из-за ошибки 134 = Недостаточно денег.
Пожалуйста, дайте мне знать, как я могу рассчитать деньги, необходимые для покупки много. Если этот предмет можно купить за те деньги, которые у меня есть.
Это на MQL4. Пожалуйста, примите это к сведению.
Я пытаюсь открыть сделку, используя определенный лот, рассчитанный по моей формуле.
Когда я пытался купить, он говорит, что я не могу из-за ошибки 134 = Недостаточно денег.
Пожалуйста, дайте мне знать, как я могу рассчитать деньги, необходимые для покупки много. Если этот предмет можно купить за те деньги, которые у меня есть.
Можно перед открытием ордера рассчитать максимальный лот
и если значение по собственной формуле превышает максимальный лот, то присвоить не своё значение а возможно допустимый лот.
Можно перед открытием ордера рассчитать максимальный лот
и если значение по собственной формуле превышает максимальный лот, то присвоить не своё значение а возможно допустимый лот.
Источник
MT4 Error 134: How to fix ERR_NOT_ENOUGH_MONEY
What is MT4 Error 134
The MT4 error 134 mainly occurs due to a poorly programmed Expert Advisor (EA) in MQL4 that shows OrderSend error message ERR_NOT_ENOUGH_MONEY. Most often this error takes place while backtesting an EA.
Generally, it means the system has canceled your order request due to insufficient funds in your account. However, this is not the only reason you are receiving the error code. Even though you have enough cash in your account, the system may still show you the same message. So, in most cases, pouring more money into account doesn’t help you solve this ghostly error.
In this guide, we’ve explained the possible reasons for causing MT4 error 134. Also, we’ve discussed how to tackle this annoying problem and get back to live trading through a few simple steps.
Why does MT4 error 134 happen?
A badly designed EA
An error in the money management of an expert advisor is the most common reason behind error 134 trouble. A poorly designed money management can bring an absolute disaster in both automated and manual trading.
When an EA miscalculates the risks, it starts sending orders with unrealistic trading lots. For instance, many traders prefer trading bots that follow the Martingale strategy because it gradually increases trading lot sizes based on the account’s growth.
In terms of a profitable trading strategy, the Martingale style is not a bad idea at all. But the problem arises when the bot raises the lot size based on the number of trades, not the profit/loss of the account.
So, it keeps gradually increasing the trading lot even in a drawdown period of the performance. At a point, the lot turns bigger than it affords to trade. So, the system stops accepting further orders sending a “not enough money” message.
A change in the trading leverage and account types
In forex, leverage enables you to go for big trades with a smaller amount of cash. That is cool, but the way a broker offers the leverage is not the same for every exchange. Some brokers change the leverage ratio based on trading account types and balances.
Therefore, a major drawdown in your account or a switch to another account may affect your leverage ratio. Eventually, it may affect your trading credibility as well. For example, you need a margin of $100 to place a one standard lot trade of an asset while you are enjoying a 1:1000 leverage ratio. In that case, you certainly couldn’t be able to trade the same amount if the leverage was down to 1:200.
An MT4 will always show error 134 whenever it detects the current account balance doesn’t meet the minimum margin requirement for activating an order.
How to fix MT4 OrderSend error 134?
Time needed: 8 minutes.
How to fix MQL4 error 134
- Check your trading balance
Make sure you have a sufficient balance in your account, and there is no change in your base currency.
Check your trading leverage
Check if your broker has applied any change in your account leverage.
Verify free margin after executing an order
Use the following code to check the available free margin after executing an order:
Verify free margin requirements on stop-out positions
Next, apply the following code to reveal how your broker determines the stop-out positions so that you can assess your free margin requirements:
Источник
OrderSend Error 134 (Not Enough Money) in MT4 and Error 10019 in MT5
Sometimes, especially during backtesting or in case of a badly designed expert advisor, the OrderSend Error 134 (or ERR_NOT_ENOUGH_MONEY ) appears in the Journal log of your MetaTrader 4 platform. In MT5, this error is called TRADE_RETCODE_NO_MONEY and has a code 10019. The reason for this error is the same for both versions of the platform — the lack of free margin to execute the OrderSend() function for the given position volume. The methods to solve this error are quite different (we won’t discuss the obvious non-coding solution, which is to deposit more funds to your trading account).
Fixing Error 134 (ERR_NOT_ENOUGH_MONEY) in MT4
In MetaTrader 4, you have to code your EA to perform the following check before executing OrderSend() :
It will check how much free margin will be available after opening a position with the volume = Volume in a given direction = Direction. But comparing it with 0 isn’t a very good solution. One should pay attention to the broker’s stop-out level to consider the margin requirements:
This will check the way your broker applies (an absolute or relative level) and then will check if there is enough free margin after in the account after the next trade gets executed.
Fixing Error 10019 (TRADE_RETCODE_NO_MONEY) in MT5
For MetaTrader 5, this condition would look like this (replace SYMBOL_MARGIN_LONG with SYMBOL_MARGIN_SHORT if you want to check margin before opening a short position):
It looks quite complex compared to the MT4 version but it checks the same condition.
Registering with a Forex broker that offers a lower level is also a good option to avoid this kind of errors.
If you have any thoughts, comments, or questions regarding MetaTrader OrderSend Error 134 or Return Code 10019 in MT5 and the ways to fix it, feel free to join our Forex forum for a discussion.
If you want to get news of the most recent updates to our guides or anything else related to Forex trading, you can subscribe to our monthly newsletter.
Источник
Советник не всегда открывает ордера, и не всегда их модифицирует. OrderSend error 134 и OrderModify error 4108.
Здравствуйте. Не могу понять, в каком месте я допустил ошибку. Условия, связанные с индикаторами, написаны правильно, и все функции тоже. Проблема описана в шапке, стоит добавить что и манименеджмент работает неправильно.
За помощь буду искринне благодарен.
Собственно, код самого эксперта:
ну и бабла побольше надо, во избежание 134.
evillive :
ну и бабла побольше надо, во избежание 134.
134 походу возникает из-за неработающего манименеджмента. Просто размер стоплосса это разница между ценой и индикатором. Насчет модификации:
Тут разве выбирается ордер ? Просто в других моих советниках написано именно так. Я попробовал и в этом, но возникает такая-же ошибка.
134 походу возникает из-за неработающего манименеджмента. Просто размер стоплосса это разница между ценой и индикатором. Насчет модификации:
Тут разве выбирается ордер? Просто в других моих советниках написано именно так. Я попробовал и в этом, но возникает такая-же ошибка.
134 возникает из-за нехватки средств на открытие, причём тут стоплосс?
А ордер в данном коде не выбирается, но надо бы.
evillive :
134 возникает из-за нехватки средств на открытие, причём тут стоплосс?
А ордер не выбирается, но надо бы.
Я имею ввиду что лот зависит от размера стоп-лосса, стоп-лосс определяется разницей положения цены и индикатора. Т.е. когда возникает ошибка 134, это значит что советник пытается влупить гигантский лот. Размер стопа определяется здесь.
то есть при гигантском стоплоссе — чудовищный лот )))
советую пересмотреть стратегию ММ, а лучше бросить форекс, разорение одно 😉
З.Ы.: в коде лот делится на стоплосс, значит расчётный стоплосс очень мелкий получается и в результате лот максимальный. запринтуйте все результаты расчётов, не ленитесь, тогда увидите где ошибочка.
evillive :
то есть при гигантском стоплоссе — чудовищный лот )))
советую пересмотреть стратегию ММ, а лучше бросить форекс, разорение одно 😉
З.Ы.: в коде лот делится на стоплосс, значит расчётный стоплосс очень мелкий получается и в результате лот максимальный. запринтуйте все результаты расчётов, не ленитесь, тогда увидите где ошибочка.
Спасибо, попробую! =) Я сам как-то не догадался принтовать результаты, всегда без этого обходился.
По поводу выбора ордера вы были правы, исправил, осталась только одна ошибка.
Насчет «бросить форекс». Уже два года здесь, назад пути нет — без прибыли не уйду! =)
evillive :
то есть при гигантском стоплоссе — чудовищный лот )))
советую пересмотреть стратегию ММ, а лучше бросить форекс, разорение одно 😉
З.Ы.: в коде лот делится на стоплосс, значит расчётный стоплосс очень мелкий получается и в результате лот максимальный. запринтуйте все результаты расчётов, не ленитесь, тогда увидите где ошибочка.
Я понял в чём ошибка. Я не могу правильно расчитать разницу цен в пунктах. А как же это сделать?
Не являются правильными вариантами, хотя в другом советнике первый работает безотказно.
Я понял в чём ошибка. Я не могу правильно расчитать разницу цен в пунктах. А как же это сделать?
Не являются правильными вариантами, хотя в другом советнике первый работает безотказно.
evillive :
приведите пример значений индикаторов
Да, забыл. Вы сможете помочь, если не сложно? Или материала на эту тему подкиньте, я был бы вам очень признателен. А то я не могу найти инфу в интернете. Индикаторы показывают цены, на которых находятся, например: 1.3055
если значения обоих индикаторов близки к цене, тогда разницу в пунктах вычислить можно так:
Источник
Tester incorrectly generates error 134
EURUSD,M1: OrderSend error 134
Tester: PrevBalance: 9455.32, PrevPL: 2958.73, PrevEquity 12414.05, PrevMargin: 12015.81, NewMargin: 12417, FreeMargin: -3.41
Tester: not enough money for buy 0.30 EURUSD at 1.23443
EURUSD,M1: mf=378.3239 mpl=1234.34 lm=0.3065 ls=0.3065 min=0.01
The output from the Print shows free margin was $378 and generated a maximum lot size of 0.30. But the tester doesn’t agree with MarketInfo.
At the end of the routine, I added:
and AFMC matches the tester’s FreeMargin output.
I am having the same problem as well. It seems that my code is being trigged and buying massive amounts of units over and over again on the same candle stick instead of being triggered by the trend happening within the candle stick. Since I am new to this there must be something I am missing. If I only want 1 indication of a buy/sell within a candle stick how do I properly exit out of the code once a signal has been triggered in the evaluation candle stick? I am currently using the Bars() as my counter which from my understand is counting the bars within a graph and not the ticks? But when I test this I dont think this is the case. Am I on the right track here?
Use a mutex around your logic so that you get the lotsize calculation through opened order result. When you calculated the lotsize for the second order, you were using stale values because you were already in the process of opening the first order.
Server is busy only occurs when you send the orders to the server at the same time.
Источник
-
#1
Надо добавить условие в советнике, чтобы перед отправкой торгового приказа всегда проверял, достаточно ли на счете свободной маржи для открытия позиции, ошибку выдаёт ordersend error 134 недостаточно средств для открытия ордера. Дело в том что при работе советника по принципу мартингейл бывает что баланс и эквити с положительным показателем, а маржи не достаточно для открытия ордера с определённым лотом и в итоге заваливает брокера приказами на открытие ордера пока присутствует сигнал для открытия. В голове крутится, но не могу понять как правильно сформулировать чтобы всё учесть и при этом не намусорить.
AccountFreeMargin()>0 — этого не достаточно. Надо учитывать так же лот 1-ого ордера и последующих с увеличением объёма.
Закипел уже мозг и темы в поисковике похожих нет.
Вроде нашёл что то похожее на то что мне надо: Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED)>AccountFreeMargin()
но теперь лот постоянно 0.1 и мартин не используется.
В советнике 1-ый лот 0.1 если откат цены и ордер в минусе то последующие ордера +0.16 лот
-
#2
Всё сделал, нашёл нужную формулу ))
double GetLot(int Risk){
double Free = AccountFreeMargin();
double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double minLot = MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
double Step = MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot = MathFloor(Free*Risk/100/margin/Step)*Step;
if(Lot<minLot) Lot = minLot;
if(Lot>Max_Lot) Lot = Max_Lot;
if(Lot*margin>Free) return(0);
return(Lot);
}
What is MT4 Error 134
The MT4 error 134 mainly occurs due to a poorly programmed Expert Advisor (EA) in MQL4 that shows OrderSend error message ERR_NOT_ENOUGH_MONEY. Most often this error takes place while backtesting an EA.
Generally, it means the system has canceled your order request due to insufficient funds in your account. However, this is not the only reason you are receiving the error code. Even though you have enough cash in your account, the system may still show you the same message. So, in most cases, pouring more money into account doesn’t help you solve this ghostly error.
In this guide, we’ve explained the possible reasons for causing MT4 error 134. Also, we’ve discussed how to tackle this annoying problem and get back to live trading through a few simple steps.
Why does MT4 error 134 happen?
A badly designed EA
An error in the money management of an expert advisor is the most common reason behind error 134 trouble. A poorly designed money management can bring an absolute disaster in both automated and manual trading.
When an EA miscalculates the risks, it starts sending orders with unrealistic trading lots. For instance, many traders prefer trading bots that follow the Martingale strategy because it gradually increases trading lot sizes based on the account’s growth.
In terms of a profitable trading strategy, the Martingale style is not a bad idea at all. But the problem arises when the bot raises the lot size based on the number of trades, not the profit/loss of the account.
So, it keeps gradually increasing the trading lot even in a drawdown period of the performance. At a point, the lot turns bigger than it affords to trade. So, the system stops accepting further orders sending a “not enough money” message.
A change in the trading leverage and account types
In forex, leverage enables you to go for big trades with a smaller amount of cash. That is cool, but the way a broker offers the leverage is not the same for every exchange. Some brokers change the leverage ratio based on trading account types and balances.
Therefore, a major drawdown in your account or a switch to another account may affect your leverage ratio. Eventually, it may affect your trading credibility as well. For example, you need a margin of $100 to place a one standard lot trade of an asset while you are enjoying a 1:1000 leverage ratio. In that case, you certainly couldn’t be able to trade the same amount if the leverage was down to 1:200.
An MT4 will always show error 134 whenever it detects the current account balance doesn’t meet the minimum margin requirement for activating an order.
How to fix MT4 OrderSend error 134?
Time needed: 8 minutes.
How to fix MQL4 error 134
- Check your trading balance
Make sure you have a sufficient balance in your account, and there is no change in your base currency.
- Check your trading leverage
Check if your broker has applied any change in your account leverage.
- Verify free margin after executing an order
Use the following code to check the available free margin after executing an order:
- Verify free margin requirements on stop-out positions
Next, apply the following code to reveal how your broker determines the stop-out positions so that you can assess your free margin requirements:
Sometimes, especially during backtesting or in case of a badly designed expert advisor, the OrderSend Error 134 (or ERR_NOT_ENOUGH_MONEY) appears in the Journal log of your MetaTrader 4 platform. In MT5, this error is called TRADE_RETCODE_NO_MONEY and has a code 10019. The reason for this error is the same for both versions of the platform — the lack of free margin to execute the OrderSend() function for the given position volume. The methods to solve this error are quite different (we won’t discuss the obvious non-coding solution, which is to deposit more funds to your trading account).
Fixing Error 134 (ERR_NOT_ENOUGH_MONEY) in MT4
In MetaTrader 4, you have to code your EA to perform the following check before executing OrderSend():
It will check how much free margin will be available after opening a position with the volume = Volume in a given direction = Direction. But comparing it with 0 isn’t a very good solution. One should pay attention to the broker’s stop-out level to consider the margin requirements:
This will check the way your broker applies stop-out (an absolute or relative level) and then will check if there is enough free margin after in the account after the next trade gets executed.
Fixing Error 10019 (TRADE_RETCODE_NO_MONEY) in MT5
For MetaTrader 5, this condition would look like this (replace SYMBOL_MARGIN_LONG with SYMBOL_MARGIN_SHORT if you want to check margin before opening a short position):
It looks quite complex compared to the MT4 version but it checks the same condition.
Registering with a Forex broker that offers a lower stop-out level is also a good option to avoid this kind of errors.
If you have any thoughts, comments, or questions regarding MetaTrader OrderSend Error 134 or Return Code 10019 in MT5 and the ways to fix it, feel free to join our Forex forum for a discussion.
Содержание
- Как разобраться в непонятных сообщениях об ошибках MT4 (лог-файлах)
- Вкладка Experts
- Вкладка Journal
- Лог-файлы
- Заключение
Как разобраться в непонятных сообщениях об ошибках MT4 (лог-файлах)
Если вы когда-либо пользовались платформой MetaTrader 4, наверняка в какие-то моменты вы сталкивались с некоторыми проблемами.
Программисты хорошо знают, что любое программное обеспечение может время от времени выходить из строя, но большинство компьютерных программ спроектировано таким образом, что в них сохраняются все ошибки, предупреждения или любые другие информационные сообщения, чтобы пользователи могли понять, что происходит.
Ранее мы писали об устранении неполадок советников на MetaTrader 4, но не менее важно знать, как правильно читать лог-файлы, чтобы найти причину проблемы.
Если вы один из тех пользователей, которые начинают пинать свой компьютер каждый раз, когда сталкиваются с проблемами в каком-нибудь из советников, индикаторов или скриптов на платформе MetaTrader 4, мы уверены, что вы найдёте эту статью очень полезной.
Мы занимаемся программированием на MQL4 уже 7 лет и довольно хорошо знаем, как определить, что не так с тем или иным приложением MT4, но также знаем и о том, что многие люди не умеют это сделать.
Мы получаем на электронную почту в буквальном смысле получаем сотни сообщений каждый месяц, когда люди сталкиваются с проблемами с какими-то советниками MT4 и не могут понять это.
Не поймите нас неправильно, но, похоже, большинство пользователей даже не пытается найти, в чем причина проблемы.
Надо сказать, что это вполне понятно, потому что в интернете не так уж много информации о том, как это делается.
Так что давайте копнём глубже! Мы будем неправы, если заявим, что MT4 записывает всю вашу деятельность, и позже вы сможете отследить, что именно пошло не так в определённый момент.
Но абсолютно точно, что MT4 регистрирует самые важные действия. В большинстве случаев этого более чем достаточно для понимания, что происходит.
В платформе MetaTrader 4 есть три типа логов, которые разделены по разным вкладкам в нижней части терминала: вкладка Experts, вкладка Journal, а также ещё одна вкладка Journal в «Тестере стратегий» MT4.
Но в этой статье мы расскажем о сообщениях на вкладках Experts и Journal. Бэктестинг оставим для другой статьи.
Вкладки Experts и Journal в нижней части клиентского терминала МТ4. Именно в них MetaTrader регистрирует все сообщения, чтобы сообщить пользователю о том, что происходит.
Все эти сообщения также записываются в специальные лог-файлы. Позже мы к этому ещё вернёмся.
Но сначала позвольте показать вам, что можно найти на вкладках Experts и Journal, которые в большинстве случаев помогают определить причину любой проблемы советника без необходимости особо углубляться в лог-файлы.
Вкладка Experts
На вкладке Experts находятся сообщения, связанные с советниками, индикаторами и скриптами, которые вы запускаете в терминале MT4.
Например, когда советник отправляет запрос на открытие сделки, это всегда отображается на вкладке Experts.
То же самое относится и к любым другим торговым действиям, выполняемым советниками или скриптами.
Индикаторы не имеют права совершать торговые операции, например, открывать, изменять или закрывать сделки, но всё, что связано с индикаторами, также регистрируется в этой вкладке.
Естественно, любой советник, индикатор или скрипт можно запрограммировать на вывод пользовательских сообщений.
Эти сообщения всегда будут отображаться в той же самой вкладке Experts.
Тем не менее, вы сразу увидите, какие сообщения отправлены советником, а какие напечатаны самим терминалом MT4, чтобы сообщить о чём-то, связанном с советником.
Два различных типа сообщений на вкладке Experts в MT4.
На рисунке выше видно, что слева возле двух сообщений находится изображение «жёлтого треугольника«, а возле других изображение «серого круга«. Те, что с серым кругом, печатаются советниками.
Другими словами, советник был запрограммирован на их отправку, чтобы дать пользователю больше информации о том, что происходит в данный момент или что уже произошло.
Можно считать, что это советник рассказывает вам о своих действиях.
Представьте себе охранника, который проходит по всем этажам здания и заполняет специальный журнал о своей деятельности.
Этаж 1, проверено в 10:02. Этаж 2, проверено в 10:04. Этаж 3, проверено в 10:06 и так далее. Любой, кто позже прочтет этот журнал, будет знать, какие этажи он проверил и в какое время.
Изображение жёлтого треугольника указывает на то, что это сообщение связано с какой-то торговой операцией, и оно было отправлено самим клиентским терминалом MT4, но оно также связано с советником.
Другими словами, советник не может избежать печати этих сообщений.
Таким образом, каждый раз, когда советник выполняет успешную торговую операцию (например, открытие, закрытие или модификацию сделки), эта операция будет регистрироваться MT4 с “жёлтым треугольником” слева от сообщения.
Представьте себе, что на каждом этаже сидят дополнительные охранники, которые заполняют свои журналы, где также отмечают факт посещения этажа главным охранником.
Охранник на 1-м этаже пишет в своём журнале «Главный охранник посетил 1-й этаж в 10:02 утра«. Охранник на 2-м этаже пишет в своём журнале «Главный охранник посетил 2-й этаж в 10:04 утра«.
В приведённом выше примере одно «жёлтое» сообщение об открытии сделки, а другое – о её изменении. Советник не может избежать печати этих сообщений.
Теперь давайте посмотрим, как узнать, какой именно советник напечатал сообщение.
На этой иллюстрации показано, что сообщения на вкладке Experts были отправлены двумя плагинами MT4.
Как вы видите, вкладка Experts разделена на два столбца. Первая – это «Time«, и объяснять что-то здесь вряд ли нужно.
Надо только упомянуть, что в ней указывается время вашего компьютера. Поэтому, если часы вашего брокерского сервера (в окне Market Watch) находятся в другом часовом поясе, его время не будет совпадать со временем, напечатанным на вкладке Experts.
Вторая колонка называется “Message“, но представляет собой нечто большее. Вы можете заметить, что сообщение начинается с названия советника (индикатора или скрипта) и в нашем примере мы видим сообщения от двух разных советников.
“LTC Client VIP v2.6” – это название первого советника, и “Myfxbook” – имя второго советника (вверху находятся самые свежие сообщения).
Таким образом, вы можете легко определить, какой советник отправил сообщение, что говорит о том, какой советник выполнил ту или иную операцию.
Например, из приведённого выше примера видно, что советник LTC Client открыл сделку на продажу #18662944 с размером лота 0,85 по валютной паре EURAUD по цене 1,38578.
В этом нет никаких сомнений, и сообщения во вкладке «Experts» никогда не лгут, независимо от того, что вам могут сказать другие люди. Данная сделка была открыта советником LTC Client.
Вкладка Experts в MT4 показывает, на графике какой валютной пары или другого инструмента работал тот или иной советник.
Далее, после названия советника, идет название инструмента, на котором работает данный советник. На иллюстрации выше хорошо видно, что советник LTC Client прикреплен к часовому графику EURUSD.
Советники обычно программируются так, чтобы торговать только по той валютной паре, к которой они прикреплены, однако в этом случае советник Local Trade Copier предназначен для открытия, изменения и закрытия сделок по любой паре.
А что касается советника Myfxbook, работающего на том же самом типе графика, он все равно будет выполнять свою работу, и неважно, к какой валютной паре он привязан.
Важно отметить, что терминал MetaTrader 4 не позволяет подключать к одному графику более одного советника, поэтому, если вы хотите запустить несколько советников на одном терминале MT4, вам придётся открыть отдельное окно графика для каждого советника.
Понятно, что это могут быть окна графиков любой валютной пары или торгового инструмента.
В нашем примере оба советника работают на часовом графике EURUSD, но на самом деле это разные окна с одинаковой валютной парой и таймфреймом.
Тот факт, что пользователь может запускать один и тот же советник на нескольких графиках одного и того же торгового инструмента, затрудняет определение того, какой именно советник отправил сообщение, потому что они оба имеют одно и то же обозначение типа “EURUSD H1” на вкладке Experts.
Поэтому для решения данной проблемы советник LTC был улучшен, и теперь он печатает специальный уникальный идентификатор окна графика, на котором работает.
Когда советник Local Trade Copier печатает сообщения на вкладке Experts терминала MT4, в их название добавляется специальный идентификатор окна графика, который помогает клиенту определить, какой именно экземпляр советника напечатал сообщение.
Это помогает в случае, если вы используете несколько советников.
Данному экземпляру советника присвоен идентификатор 73588-6000-1. В случае, если на одной и той же валютной паре будут работать другие советники, определить, какой именно советник напечатал сообщение, будет невозможно.
Но в нашем случае у обоих советников будут разные идентификаторы, и это поможет определить, каким из них было отправлено сообщение.
Этот идентификатор состоит из специального уникального номера (73588), присвоенного советнику «магического числа» (60000) и идентификатора поставщика сигналов (1).
Если вы являетесь пользователем программы Local Trade Copier, вы поймёте, что это означает.
Вы можете видеть, что сообщения с «жёлтым треугольником» не имеют этого идентификатора, а причина в том, что советник не печатает эти сообщения сам по себе, как объяснялось выше.
Поэтому мы не можем добавить в них такой идентификатор сообщения, хотя он помогает идентифицировать другие сообщения.
Сообщения от двух разных советников на вкладке Experts клиентского терминала MT4.
Оба приложения используют уникальный идентификатор сообщения, который помогает определить, каким именно советником было отправлено сообщение, даже если они работают в окнах графика одного и того же инструмента.
На изображении выше вы можете увидеть два советника, загруженные в разных окнах графика одной и той же валютной пары с одним таймфреймом (GBPUSD, M5), и оба этих советника отправили сообщения на вкладку Experts.
Обычно вы не можете определить, какой именно советник напечатал сообщение, потому что они оба работают на одном и том же типе графика.
Однако благодаря уникальному идентификатору сообщения, который используется в наших приложениях, вы с лёгкостью вычислите, какой именно советник отправил конкретное сообщение.
Один советник использует идентификатор сообщения [84073-222-1], в то время как другой советник использует [30815-111-1].
Если вы сами занимаетесь программированием на MQL4, можете рассмотреть возможность добавления такой функции в свои советники. Это очень сильно помогает при чтении лог-файлов.
Если вы спросите, как мы генерируем уникальный идентификатор для каждого окна графика, в ответ вы услышите: «Никак«. Мы используем специальную функцию MQL4, которая называется ChartID.
Чтение сообщений от советника
Как правило, всё, что идёт после инструмента графика и таймфрейма (на иллюстрации ниже это EURUSD, H1), является сообщением, которое сгенерировано советником.
Это может быть в буквальном смысле всё, что угодно, но не пугайтесь, если увидите много сообщений.
Если вы хотите узнать, что происходит на вашем счёте MT4, и что делает советник, просто прочтите эти сообщения, чтобы лучше понять ситуацию.
Сообщения от двух разных советников на вкладке Experts терминала MT4.
На изображении выше мы видим, что Myfxbook напечатал сообщение «Отчёт успешно загружен«.
Так что же это значит? Предположительно, советник хочет сообщить нам, что отчёт был успешно загружен в базу данных Myfxbook. Да, всё вот так просто. )
Вы заметите, что на вкладке Experts новые сообщения находятся вверху, а старые – внизу. Другими словами, вам нужно просматривать сообщения снизу вверх, чтобы сохранять правильный порядок.
Однако в логах, как вы заметите позже, сообщения сортируются по времени. Это означает, что более старые сообщения находятся наверху, и читать их нужно сверху вниз.
Если присмотреться к клиентскому приложению советника LTC на изображении выше, то мы увидим, что он открыл сделку на продажу, изменил её, а затем выдал серию информационных сообщений о задержке соединения, отклонении цены, а также номер главной сделки и номер скопированной сделки, чтобы при необходимости было легче их идентифицировать.
На вкладке Experts в MT4 показан код сообщения об ошибке 134: недостаточно средств.
Что насчёт ошибок? С использованием одного из своих советников мы попытались открыть сделку на 800 лотов. Давайте посмотрим, что произошло.
На изображении выше мы видим, что советник Trader on Chart выдал ошибку 134, которая означает «Недостаточно денег«, или, другими словами, размер лота слишком велик для текущего баланса счёта.
Приложение ToC также воспроизводит звуковое оповещение, которое позволяет пользователю узнать, что что-то пошло не так. А при взгляде на вкладку Experts, мы можем легко определить фактическую причину проблемы.
Кроме того, советник также покажет ярлык на ценовом графике, где будет указан код ошибки, чтобы более опытные пользователи смогли быстро определить, почему сделка не была открыта.
Советник MT4 выводит на график ярлык с кодом ошибки.
Очевидно, что эти ярлыки с кодами ошибки доступны не со всеми советниками, мы сами добавили эту функцию в код своих приложений, поэтому не ожидайте, что другие советники напечатают то же самое.
Код ошибки oe134 означает «Open Error 134» (открытая ошибка 134). Это означает, что при открытии сделки произошла ошибка 134.
В основном все эксперты в наше время показывают как минимум код ошибки на вкладке Experts, который вы можете использовать для определения возможной причины проблемы.
Нажмите здесь, чтобы получить полный список возможных кодов ошибок.
Вот ещё один пример сообщения об ошибке.
Советник MT4 выводит сообщение об ошибке, связанное с неправильно указанной ценой входа для отложенного ордера BUY STOP.
Мы настроили приложение Trader on Chart для размещения отложенного ордера BUY STOP по паре NZDUSD на уровне 0,70000.
Однако этот отложенный ордер не был размещён, так как на тот момент текущая цена Ask для NZDUSD составляла 0,75207.
Цена входа для отложенных ордеров Buy Stop всегда должна быть выше цены Ask, и ее невозможно разместить ниже этой цены (нужно использовать BUY LIMIT, если вы хотите разместить ордер ниже цены Ask).
По этой простой причине советник напечатал сообщение об ошибке «Неверная цена входа для BUY STOP 0.70000», а также внёс в запись цены Ask и Bid.
Вкладка Journal
Остальные типы сообщений, которые не генерируются плагинами MT4, хранятся на вкладке Journal.
Это сообщения об обновлениях платформы МТ4, о подключении к серверу, о любых попытках совершить торговые действия вручную или автоматически и ответы со стороны сервера брокера, которые во многих случаях помогают понять, с какой проблемой вы столкнулись.
На вкладке Journal в MT4 регистрируются сообщения об ошибках, полученные от сервера брокера.
Помните сделку на 800 лотов? Когда сервер брокера отказался открыть такую сделку, советнику было отправлено сообщение об этом и мы увидели запись об ошибке в логах.
Но также мы видим, что на вкладке Journal появилось ещё одно сообщение об ошибке.
Оно приходит непосредственно с сервера брокера, и печатается независимо от того, какой торговлей вызвана эта ошибка: ручной или автоматической.
Это сообщение об ошибке также чётко указывает на то, что вам не хватило денег для открытия ордера на покупку 800 лотов по паре NZDUSD по рыночной цене.
Вкладка Journal также разделена на два столбца: Time и Message. Для этих пунктов не требуется никаких объяснений, но в сообщениях об ошибках нам особенно нравится то, что они имеют это маленькое изображение красного круга с левой стороны, которое поможет вам их легко обнаружить.
Стоит отметить, что мы уделяем не очень много внимания вкладке Journal, потому что в основном торгуем с помощью советников, и все сообщения, которые нам нужны, находятся на вкладке Experts.
Но не нужно недооценивать информацию, показанную во вкладке Journal. Её стоит изучить, если вы не можете найти объяснение в других местах.
Лог-файлы
Лог-файлы хранят в основном те же сообщения, которые вы найдете на вкладках Experts и Journal, но понятно, что лог-файлы могут хранить гораздо больше сообщений.
Если вы закроете и снова откроете платформу MT4, вы увидите, что на вкладках Experts/Journal никаких сообщений не останется. Их запись начинается заново, и все старые сообщения переносятся в лог-файлы.
Обычно передача сообщений с вкладок Experts/Journal в лог-файлы в режиме реального времени занимает некоторое время, поэтому, если вы хотите найти последние сообщения в лог-файлах, закройте платформу MT4 и подождите несколько секунд.
Сообщения со вкладки Experts сохраняются в лог-файлах, расположенных в папке Data FolderMQL4Logs.
Сообщения с вкладки Journal сохраняются в лог-файлах, расположенных в папке Data FolderLogs (эти файлы не сильно помогают при решении проблем, связанных с торговлей по советникам).
Папку «Data Folder» можно открыть непосредственно с платформы MT4 через пункт меню «File -> Open Data Folder«. Здесь хранятся все лог-файлы, а также советники, индикаторы, скрипты и другие файлы.
Доступ к папке данных MT4 из верхнего меню.
После открытия папки Data Folder вам нужно перейти в папку MQL4, а затем в папку Logs. Вот как выглядят лог-файлы со вкладки Experts у нас на компьютере.
Лог-файлы MQL4 от советников в папке данных платформы MT4.
Как видите, название каждого лог-файла является датой в формате YYYYMMDD. Это поможет легко найти то, что вы ищете.
Однако имейте в виду, что из-за разницы часовых поясов между вашим компьютером и брокером в лог-файле 20150413 могут отсутствовать сообщения за предыдущий или следующий день.
Поэтому, если кто-то попросит вас отправить ему лог-файл от 13 апреля 2015 года, мы рекомендуем отправить сразу три лог-файла: 20150412.log, 20150413.log, 20150414.log.
То есть, вы должны добавить файлы журнала за предыдущий и следующий день.
Чтение лог-файла
При открытии лог-файла в любом текстовом редакторе, таком как Notepad или Notepad++, вы увидите все сообщения, записанные в этот день.
Важно отметить, что существует ограничение на длительность сообщения на вкладке Experts, но нет ограничений на то, как долго сообщения могут храниться в лог-файле.
Поэтому, если на вкладке Experts какое-то сообщение оказалось обрезанным, полное сообщение вы наверняка найдёте в лог-файле.
Сообщения от советников MT4, напечатанные в лог-файле.
На изображении выше вы можете увидеть пример того, как это выглядит.
В принципе, формат такой же, как и на вкладке Experts, за исключением того, что изображения «жёлтого треугольника» преобразуются в цифру 2, а изображения «серого круга» в 0.
Далее идёт время, название советника, график инструмента и таймфрейм, и, наконец, само сообщение.
Еще один простой способ получить доступ к лог-файлам – щёлкнуть правой кнопкой мыши в любом месте вкладки Experts и выбрать пункт Open.
Щёлкните правой кнопкой мыши в любом месте вкладки Experts или Journal и выберите пункт «Открыть» для доступа к лог-файлам.
Выполнение этого действия на вкладке Experts откроет вам папку с лог-файлами Experts, а с вкладки Journal откроется папка с лог-файлами Journal.
Остальные пункты из этого меню не требуют пояснений, но нам особенно нравятся следующие варианты: Copy, View и “Auto Scroll“.
Опция «Auto Scroll» используется редко, но когда у нас возникают проблемы с каким-то советником, который печатает огромное количество сообщений в лог, бывает полезно включить «Auto Scroll».
Это позволит просто смотреть на сообщения вместо того, чтобы наблюдать их автоматическую прокрутку вниз, что даже не даст вам прочитать, что в них говорится.
Функция Copy просто копирует выбранные сообщения в буфер обмена, чтобы вы могли вставлять их в другие приложения.
Это устраняет необходимость в отправке полных лог-файлов, позволяя просто скопировать и вставить несколько сообщений с кодами ошибок и отправить их в службу поддержки производителя программного обеспечения.
Конечно, могут быть случаи, когда требуются полные лог-файлы, но во многих случаях для решения проблемы достаточно нескольких сообщений.
Опция View (просмотр) позволяет фильтровать сообщения в логах советников. Вот окно, которое при этом открывается.
MT4 позволяет искать сообщения в лог-файле по дате и фразе.
Что круто в этой функции, так это то, что вы можете ввести фразу, которую хотите найти, выбрать диапазон дат, и MT4 будет искать все файлы советников, чтобы найти все сообщения, в которых есть ваша фраза.
В приведённом выше примере мы вводим номер сделки 18831445, выбираем диапазон дат последних двух дней, и после нажатия кнопки запроса мы получаем сообщения с этим номером сделки.
Как отправить несколько лог-файлов в виде одного файла
Это очень просто. Для того, чтобы отправить несколько файлов журналов в виде одного файла, вам необходимо упаковать их в так называемый ZIP-архив.
На любом компьютере с Windows это делается очень легко.
Все, что вам нужно сделать, это открыть папку Logs, выбрать файлы, которые вы хотите упаковать, затем нажмите правую кнопку мыши и в меню выберите “Sent to -> Compressed (zipped)“.
Упаковка лог-файлов MT4 в zip-архив для удобства передачи.
На изображении ниже вы можете увидеть, как выглядит .zip-архив со сжатыми файлами.
Семь файлов журнала сжаты и упакованы в один файл .zip, который теперь можно отправить по электронной почте.
Это также экономит место. Эти 7 файлов в общей сложности весят 105 КБ, а архив .zip – всего 12 КБ.
Семь лог-файлов MT4, сжатых в один ZIP-архив.
Для того, чтобы распаковать .zip-архив, вам необходимо кликнуть правой кнопкой мыши по файлу и в всплывающем меню выбрать пункт «Extract All…«.
Извлечение Zip-архива со сжатыми и упакованными лог-файлами MT4.
Заключение
Благодаря простому чтению сообщений на вкладках Experts или Journal в вашей платформе MetaTrader 4 вы можете легко определить и решить проблемы, связанные с вашими советниками, индикаторами и скриптами.
Многие люди бросают всё слишком рано или тратят много времени, пытаясь решить проблему с помощью команды поддержки производителя программного обеспечения.
Очевидно, что в некоторых случаях вы не сможете решить проблему самостоятельно, но чаще всего достаточно просто посмотреть на эти сообщения и включить здравый смысл, чтобы сэкономить часы своего времени и снова заставить работать свои приложения MT4.
Помогла ли вам эта статья? Поделитесь информацией с друзьями и оставьте свои комментарии ниже.
Возможно вам также будет интересно прочитать статьи
Как закрыть все открытые сделки на MT4 в определённое время
Взламываем Metatrader, чтобы создать идеальный инструмент для определения соотношения риска и вознаграждения
Лучший способ установить много MT4 на один компьютер [или VPS]
Над статьями работает команда авторов, переводчиков и редактор. На сайте команда Privatefinance.biz публикует информационные статьи, обзоры, рейтинги, гайды о торговле на финансовых рынках и инвестировании, рекомендации по выбору брокера и инструментов инвестирования, актуальные новости из мира финансов.
Почта для связи с нами: [email protected]
Загрузка…
Когда Вы начинаете торговать на торговом терминале 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 – Ошибка при работе с объектом.
Открытие и установка ордеров
Формирование торговых приказов для открытия рыночных и установки отложенных ордеров
осуществляется с помощью функции OrderSend( ).
Функция OrderSend()
int OrderSend (string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
(обратите внимание, здесь и далее для справки представляется заголовок функции, а не пример использования вызова функции в программе).
Рассмотрим подробно, из чего состоит эта функция.
OrderSend — название функции. Функция возвращает номер тикета (ticket — уникальный порядковый
номер ордера), который назначен ордеру торговым сервером или -1 в случае, если
торговый приказ был отклонён севером или клиентским терминалом. Для получения информации
о причине отклонения торгового приказа необходимо использовать функцию GetLastError()
(в дальнейшем изложении мы рассмотрим несколько наиболее распространённых ошибок).
symbol — наименование финансового инструмента, с которым проводится торговая операция.
Каждому финансовому инструменту поставлено в соответствие значение строковой переменной.
Например, для валютной пары Eur/Usd это значение "EURUSD". Если открытие
ордера проводится по заранее известному финансовому инструменту, то этот параметр
можно указать в явном виде: "EURUSD", "EURGBP" и т.д. Если
же предполагается использование советника в окне любого другого финансового инструмента,
то можно использовать стандартную функцию Symbol(). Эта функция возвращает строковое
значение, соответствующее названию того финансового инструмента, в окне которого
исполняется советник или скрипт.
cmd — тип операции. Тип операций может быть указан в виде предопределённой константы
или её значения и в соответствии с типом торговой операции.
volume — количество лотов. Для рыночных ордеров всегда проверяется достаточность свободных средств на счёте. Для отложенных ордеров
количество лотов не ограничено.
price — цена открытия. Устанавливается в соответствии с требованиями и ограничениями,
принятыми для проведения торговых операций (см. Характеристики ордеров). Если заявленной цены для открытия рыночных ордеров не было в ценовом потоке или
она сильно устарела, то такой торговый приказ отклоняется; если же цена устарела,
но присутствует в ценовом потоке и при этом отклонение от текущей цены находится
в пределах значения slippage, то такой торговый приказ будет принят клиентским
терминалом и отправлен на торговый сервер.
slippage — максимально допустимое отклонение заявленной цены открытия ордера от рыночной
цены для рыночных ордеров (пунктов). В случае установки отложенного ордера параметр
не обрабатывается.
stoploss — заявленная цена закрытия, определяющая предельный уровень убыточности. Устанавливается
в соответствии с ограничениями, принятыми для проведения торговых операций (см.
Характеристики ордеров, Требования и ограничения торговых операций).
takeprofit — заявленная цена закрытия, определяющая предельный уровень прибыльности. Устанавливается
в соответствии с ограничениями, принятыми для проведения торговых операций (см.
Характеристики ордеров, Требования и ограничения торговых операций).
comment — текст комментария ордера. Последняя часть комментария может быть изменена торговым
сервером.
magic — магическое число ордера. Может использоваться как определяемый пользователем
идентификатор ордера. В некоторых случаях это — единственная информация, по которой
можно судить о принадлежности ордера к той или иной открывшей его программе. Параметр
устанавливается пользователем, может совпадать или не совпадать со значением этого
же параметра других ордеров.
expiration — срок истечения отложенного ордера. При наступлении этого срока отложенный ордер
будет автоматически закрыт на торговом сервере. На некоторых торговых серверах
может быть установлен запрет на применение срока истечения отложенных ордеров.
В этом случае при попытке задать ненулевое значение параметра торговый приказ будет
отклонён.
arrow_color — цвет открывающей стрелки на графике. Если параметр отсутствует или его значение
равно CLR_NONE, то открывающая стрелка на графике не отображается.
На некоторых торговых серверах может быть установлен лимит на общее количество открытых
и отложенных ордеров. При превышении этого лимита любой торговый приказ, предполагающий
открытие рыночного или установку отложенного ордера, будет отклонён торговым сервером.
Открытие рыночных ордеров
На первый взгляд может показаться, что функция OrderSend() слишком сложна для понимания.
В действительности, все рассматриваемые параметры достаточно просты, необходимы
и полезно используются в торговле. Для того чтобы в этом убедиться, рассмотрим
наиболее простой вариант использования торговой функции OrderSend() для открытия
рыночного ордера.
Прежде всего обратим внимание, что функция OrderSend() имеет предопределённые параметры
(см. Вызов функции и
Тело функции и оператор return). Это значит, что допустимо использование этой функции в упрощённом варианте, с
использованием только минимального набора обязательных параметров. Такими параметрами
являются:
symbol — финансовый инструмент указать необходимо, иначе неизвестно, где открывать ордер.
Пусть наш скрипт предполагает возможность открытия ордера в окне любого финансового инструмента.
В этом случае в качестве параметра подставим стандартную функцию Symbol();
cmd — для примера будем открывать ордер Buy, поэтому необходимо указать параметр OP_BUY;
volume — можно указать любое допустимое значение; мы будем открывать ордер небольшого размера, пусть это значение
будет 0.1;
price— цена открытия для ордера Buy — это цена Ask;
slippage — обычно это значение указывают в размере от 0 до 3 пунктов. Укажем значение 2;
stoploss — стоп-приказы могут быть выставлены не ближе минимальной дистанции, обычно 5 пунктов
(см. Требования и ограничения торговых операций); выставим стоп-приказы на расстоянии 15 пунктов от цены закрытия, а именно Bid
— 15*Point;
takeprofit — выставим стоп-приказы на расстоянии 15 пунктов от цены закрытия, а именно Bid +
15*Point;
Простейший скрипт simpleopen.mq4, предназначенный для открытия ордера Buy, выглядит так:
//-------------------------------------------------------------------- // simpleopen.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Спец. функция start() { // Открытие BUY OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point); return; // Выход из start() } //--------------------------------------------------------------------
Если запустить этот скрипт на исполнение, то в подавляющем большинстве случаев он
будет работать. Скрипт состоит из одной специальной функции, содержащей функцию
открытия ордера OrderSend() и оператор return. Опишем порядок исполнения программных
строк и связанных с этим событий.
1. Пользователь прикрепил скрипт к окну финансового инструмента — перетянул название
скрипта мышью из окна "Навигатор" клиентского терминала в окно финансового инструмента,
по которому он хочет открыть рыночный ордер Buy стоимостью 0.1 лота со стоп-приказами,
удалёнными от рыночного курса на 15 пунктов.
2. В момент прикрепления скрипта к окну финансового инструмента клиентский терминал
передал управление (запустил на исполнение) специальной функции start() (кратко
напомним, что start() скрипта запускается в момент присоединения к окну финансового
инструмента, а start() эксперта — в момент поступления ближайшего тика по финансовому
инструменту).
3. В рамках исполнения специальной функции start() управление передаётся в строку
вызова функции открытия ордера:
OrderSend(Symbol(),OP_BUY,0.1,Ask,2,Bid-15*Point,Bid+15*Point);
Перед исполнением этой функции программа вычисляет значения всех формальных параметров:
3.1. Мы прикрепили скрипт в окно финансового инструмента Eur/Usd. В этом случае стандартная
функция Symbol() вернёт строковое значение EURUSD.
3.2. Пусть на момент обращения Ask =1.2852 и Bid =1.2850.
3.3. Значение StopLoss в этом случае будет равно 1.2850-15*0.0001 = 1.2835, а TakeProfit
= 1.2865.
4. Исполнение функции OrderSend():
4.1. Функция сформировала торговый приказ на открытие ордера и передала этот приказ
клиентскому терминалу.
4.2. Одновременно с торговым приказом функция передала клиентскому терминалу управление
и, таким образом, исполнение программы приостановилось.
4.3. Клиентский терминал произвёл проверку полученного торгового приказа, не обнаружил
некорректных параметров и отправил торговый приказ на сервер.
4.4. Сервер получил торговый приказ, произвёл его проверку, не обнаружил некорректных
параметров и принял решение исполнить торговый приказ.
4.5. Сервер исполнил торговый приказ, произведя транзакцию в своей базе данных,
и отправил сведения об исполненном приказе торговому терминалу.
4.6. Торговый терминал получил информацию о том, что последний торговый приказ исполнен,
отразил это событие в окне терминала и в окне финансового инструмента и вернул
управление программе.
4.7. Получив управление, программа продолжила свою работу с того места, откуда ранее
управление передавалось в клиентский терминал (и куда впоследствии вернулось).
| Обратите внимание, в период с п.4.2 по п.4.7 в программе не производилось никаких действий — программа находилась в режиме ожидания ответа сервера. |
5. Управление в программе передаётся следующему оператору — return.
6. Исполнение оператора return приводит к выходу из функции start() и, как следствие,
к окончанию исполнения программы (напомним, что скрипты после исполнения заканчивают
работу) — управление возвращается клиентскому терминалу.
Таким образом, скрипт выполнил своё предназначение: открыт ордер Buy с заданными
параметрами. Использование скриптов очень удобно, если необходимо выполнить небольшую
разовую операцию; в данном случае использование скрипта вполне оправданно. В соответствии
с п. 4.6. трейдер может наблюдать ордер на экране.
Рис. 81. Ордер выставлен скриптом
simpleopen.mq4.
Рассмотренный выше порядок событий не всегда проходит так гладко. Возможны случаи,
при которых исполнение торгового приказа будет отклонено клиентским терминалом
или сервером. Попробуем немного поэкспериментировать, например, изменим название финансового инструмента: укажем явно "GBPUSD"
(это вполне допустимо). Получится программа с ограниченной областью
использования:
int start() // Спец. функция start { // Открытие BUY OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point); return; // Выход из start() }
Запустим скрипт в том же окне финансового инструмента Eur/Usd. По замыслу, скрипт
должен открыть ордер в окне Gbp/Usd. Однако после присоединения скрипта в окно
Eur/Usd ожидаемого открытия ордера в окне Gbp/Usd не происходит.
Недостатком подобных программ является их функциональная ограниченность. В данном
случае, после присоединения скрипта в окно финансового инструмента пользователь
просто ждёт открытия ордера. Но открытия нет. Пользователь находится в неведении
относительно причины сложившейся ситуации: то ли причина в том, что в коде программы
имеется алгоритмическая ошибка, то ли торговый приказ "потерялся" на
пути к серверу, то ли торговый приказ давно отклонён клиентским терминалом (а пользователь
ждёт), то ли имеется другая причина.
Для того чтобы предоставить в распоряжение пользователя (и, что не менее важно,
в распоряжение программы) информацию о событиях, связанных с исполнением торгового
приказа, необходимо выполнить обработку ошибок.
Обработка ошибок
Очень важное свойство клиентского терминала состоит в том, что в случае, если во
время выполнения прикладной программы возникает ошибка, то клиентский терминал
не прекращает исполнение программы. Обычно ошибки возникают по причине несовершенства используемого
в прикладной программе алгоритма, а в некоторых случаях — в результате внешних
(по отношению к программе) причин. К внутренним причинам относятся любые нарушения
требований языка MQL4 или правил торговли, например, использование неправильных
цен, а к внешним — причины, не связанные с прикладной программой, например, проблемы
со связью.
Если при исполнении программы возникает ошибка, то программа продолжает работу,
а клиентский терминал генерирует значение кода ошибки, которое доступно программе
при использовании функции GetLastError( ).
Функция GetLastError()
int GetLastError()
Функция возвращает код последней ошибки, после чего значение специальной переменной
last_error, в которой хранится код последней ошибки, обнуляется. Последующий вызов
GetLastError() вернет значение 0.
В дальнейшем все возникающие ошибки мы будем идентифицировать по этому коду. Во
время исполнения программы может возникнуть несколько ошибок; функция GetLastError() позволяет получить значение кода только одной — последней ошибки, поэтому во
всех случаях, когда может понадобиться такая информация, использовать функцию GetLastError() необходимо непосредственно после тех программных строк, в которых эта ошибка
может возникнуть.
Ошибка 130. Неправильные стопы
Последний рассмотренный скрипт не производит анализ ошибок, поэтому пользователь
остаётся в неведении относительно результатов исполнения функции открытия ордера.
В простом варианте использования функции GetLastError() можно проанализировать
ошибку и просто сообщить о ней пользователю. Если скрипт confined.mq4
запустить на исполнение в окне Eur/Usd, то возникнет ошибка.
//-------------------------------------------------------------------- // confined.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Спец. функция start { // Открытие BUY OrderSend("GBPUSD",OP_BUY,0.1,Ask,2,Bid-15*Point,Bid+15*Point); Alert (GetLastError()); // Сообщение об ошибке return; // Выход из start() } //--------------------------------------------------------------------
В этом скрипте добавлена всего одна, но очень содержательная строка:
Alert (GetLastError()); // Сообщение об ошибке
Функция GetLastError( ) возвращает код последней ошибки, а с помощью Alert() это
значение выводится на экран. После присоединения скрипта
confined.mq4 в окно финансового инструмента Eur/Usd скрипт исполнится, в результате чего пользователь
увидит следующее сообщение:
Рис. 82. Код ошибки, полученный при исполнении скрипта
confined.mq4 в окне Eur/Usd.
В приложении представлены Коды ошибок, которые могут возникать при исполнении программы. В данном
случае возникла ошибка 130 — неправильные стопы. Это значит, что значения формальных
параметров, используемых в функции OrderSend(), не удовлетворяют ограничениям,
указанным в Требования и ограничения торговых операций. При внимательном рассмотрении становится очевидной и причина возникшей ошибки:
текущие значения рыночной цены Bid и Ask берутся из того окна финансового инструмента,
в которое присоединён скрипт, а именно, из окна Eur/Usd. А используются эти значения
для формирования торгового приказа по финансовому инструменту Gbp/Usd. В результате,
при текущей цене Gbp/Usd Ask = 1.9655, значение TakeProfit для вновь открываемого
рыночного ордера оказывается равным (для Eur/Usd Bid =1.2930) 1.2930+15*0.0001=1.
2945, что значительно ниже предельно допустимого значения, т.е ошибочно.
В данном случае возникла алгоритмическая ошибка. Для того чтобы её
исправить, необходимо использовать
правильные значения цен по финансовому инструменту. Получить эти значения можно с помощью функции MarketInfo(). Скрипт improved.mq4
для открытия рыночного ордера по Gbp/Usd может быть запущен в окне любого
финансового инструмента:
//-------------------------------------------------------------------- // improved.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Спец. функция start { double bid =MarketInfo("GBPUSD",MODE_BID); // Запрос значения Bid double ask =MarketInfo("GBPUSD",MODE_ASK); // Запрос значения Ask double point =MarketInfo("GBPUSD",MODE_POINT);//Запрос Point // Открытие BUY OrderSend("GBPUSD",OP_BUY,0.1,ask,2,bid-15*Point,bid+15*Point); Alert (GetLastError()); // Сообщение об ошибке return; // Выход из start() } //--------------------------------------------------------------------
При исполнении этого скрипта рассматриваемая ошибка не возникает, поэтому в результате его исполнения будет
выведено соответствующее сообщение: 0 (ноль). Это значит, что функция GetLastError()
вернула значение 0, т.е. при исполнении торгового приказа клиентским терминалом
ошибок не выявлено.
Рассмотрим и некоторые другие наиболее распространённые ошибки. Для этого вернёмся
к идее открытия ордера с помощью скрипта в том окне, в которое присоединён скрипт.
Ошибка 129. Неправильная цена
В ряде случаев возникает банальная ошибка — в качестве цены открытия указывается
не то значение двухсторонней котировки. Как известно (см. Требования и ограничения торговых операций), рыночные ордера Buy открываются ценой Ask. Вот что получится, если
в скрипте mistaken.mq4 ошибочно указать Bid:
//-------------------------------------------------------------------- // mistaken.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Спец. функция start { // Открытие BUY OrderSend(Symbol(),OP_BUY,0.1,Bid,2,Bid-15*Point,Bid+15*Point); Alert (GetLastError()); // Сообщение об ошибке return; // Выход из start() } //--------------------------------------------------------------------
Перед отправкой торгового приказа на сервер клиентский терминал
проанализирует, соответствуют ли заявленные значения цены и стоп-приказов
допустимым значениям. Во время этой проверки обнаружится, что заявленная цена
открытия ордера является ошибочной, поэтому торговый приказ не будет отправлен
клиентским терминалом для исполнения на сервер, а функция GetLastError()
вернёт значение 129 (см. Коды ошибок). В
результате исполнения скрипта появится окно с соответствующим сообщением:
Рис. 83. Ошибка 129 (неправильная цена) при исполнении
mistaken.mq4.
Ошибка 134. Недостаточно денег для совершения операции
Аналогичный результат (ошибка 134) будет получен и в случае, если свободных средств
не хватает для открытия ордера. Размер свободных средств, необходимых для открытия 1 лота на покупку для каждого финансового инструмента можно узнать с помощью функции MarketInfo(Имя_инструмента, MODE_MARGINREQUIRED).
| Размер стандартного лота в разных дилинговых центрах для одного финансового инструмента может отличаться. |
Размер необходимых средств для открытия ордера в один лот обратно пропорционален размеру предоставляемого плеча. В то же время, стоимость 1 пункта в валюте депозита по финансовому
инструменту не зависит от предоставленного плеча.
Таблица 3. Варианты соотношения стоимости лотов и 1 пункта (валюта депозита- доллар США).
| Дилинговый центр 1 | Дилинговый центр 2 | Дилинговый центр 3 | |||||||
| Buy | Sell | 1pt | Buy | Sell | 1pt | Buy | Sell | 1pt | |
| EUR/USD | 1296.40 | 1296.20 | 10.00 | 1296.50 | 1296.20 | 10.00 | 1000.00 | 1000.00 | 10.00 |
| GBP/USD | 1966.20 | 1966.00 | 10.00 | 1376.48 | 1376.20 | 7.50 | 1000.00 | 1000.00 | 10.00 |
| AUD/USD | 784.40 | 784.20 | 10.00 | 1569.20 | 1568.40 | 20.00 | 1000.00 | 1000.00 | 10.00 |
| USD/JPY | 1000.00 | 1000.00 | 8.29 | 1000.00 | 1000.00 | 8.29 | 1000.00 | 1000.00 | 8.29 |
| USD/CHF | 1000.00 | 1000.00 | 8.02 | 1000.00 | 1000.00 | 8.02 | 1000.00 | 1000.00 | 8.02 |
| EUR/CHF | 1296.40 | 1296.20 | 8.02 | 1296.35 | 1296. 35 | 8.02 | 1000.00 | 1000.00 | 8.02 |
Цены даны по состоянию на 16.12.2007г.
Кратко рассмотрим распространённые методы расчёта стоимости 1 лота и 1 пункта.
Дилинговый центр 1 (наиболее распространённый вариант)
Для тех валютных инструментов, у которых в знаменателе указан USD, стоимость 1 лота
равна текущей цене соответствующей двухсторонней котировки, умноженной на 1000,
стоимость 1 пункта равна $10.
Для тех валютных инструментов, у которых USD указан в числителе, стоимость 1 лота
равна $1000.00, а стоимость 1 пункта обратно пропорциональна текущей котировке
и равна 1/(Bid). Например, для USD/CHF при Bid= 1.2466 стоимость 1 пункта = 1/1.
2466 = 8.02.
Для кросс-курсов стоимость 1 лота оценивается так, как оценивается стоимость валюты,
указанной в числителе, а стоимость 1 пункта так, как для валюты, указанной в знаменателе.
Например, для EUR/CHF стоимость 1 лота = 129.40 (как для EUR/USD), а стоимость 1
лота = 8.02 (как для USD/CHF).
Дилинговый центр 2
В некоторых дилинговых центрах при соблюдении того же общего порядка стоимостные
показатели для некоторых финансовых инструментов могут отличаться. Например, стоимость
лота и стоимость 1 пункта может быть пропорционально увеличена или уменьшена. Например,
для GBP/USD этот коэффициент составляет 0.75, а для AUD/USD составляет 2.0. Такое
представление стоимостных показателей не приводит ни к каким экономическим последствиям;
в таких случаях нужно просто учитывать эту особенность при расчёте стоимости ордера.
Обратите внимание также на особенность стоимости лотов для покупки и продажи активов
кросс-курсов — они совпадают.
Дилинговый центр 3
Существуют также такие дилинговые центры, которые устанавливают стоимость 1 лота
для любого финансового инструмента равной $1000.00. В то же время стоимость 1
пункта остаётся пропорциональной текущим ценам. Этим подразумевается, что для каждого
финансового инструмента устанавливается своё кредитное плечо.
| Стоимость 1 пункта для всех финансовых инструментов, котируемых не по отношению к USD, постоянно изменяется пропорционально стоимости той валюты, которая указана в знаменателе. |
В общем, возможны и другие принципы построения стоимостных показателей. Разумеется,
прежде чем приступить к реальной торговле, необходимо определить метод расчёта,
используемый в конкретном дилинговом центре, и при составлении программ его обязательно
учитывать.
Свободные средства
При составлении программ очень важно также учитывать принцип формирования свободных
средств. Cвободные средства — эта та сумма денежных средств, которая остаётся свободной
для совершения торговых операций.
Рассмотрим пример. Пусть Баланс = 5000.00, в терминале нет открытых ордеров. Откроем
ордер Buy стоимостью 1 лот в дилинговом центре 3. В дилинговом центре 3 установлено
следующее правило:
| Если по одному финансовому инструменту открыты разнонаправленные рыночные ордера, то меньшая суммарная стоимость однонаправленных ордеров высвобождается из торговли и увеличивает сумму свободных средств (правило выполняется не во всех дилинговых центрах). |
В окне терминала отразится информация об открытом ордере. Обратите внимание,
залог составляет 1000.00, прибыль по ордеру -30.00, таким образом, количество свободных
средств составляет 5000-1000-30=3970.00:
Рис. 84. Ордер Buy в окне терминала.
После открытия ордера Sell той же стоимости количество свободных средств увеличится.
Меньшая суммарная стоимость однонаправленных рыночных ордеров составляет 1000.00,
поэтому свободные средства увеличиваются на 1000.00. На рис. 85 показана ситуация,
при которой стоимость разнонаправленных ордеров совпадает, таким образом, вся сумма
стоимости ордеров высвобождается для торговли.
Рис. 85. Ордер Buy и Sell в окне терминала.
После открытия ордера Sell меньшей стоимости количество свободных средств также увеличится.
В данном случае меньшая суммарная стоимость однонаправленных рыночных ордеров составляет
700.00, поэтому свободные средства увеличиваются на 700.00, а залог составляет
разницу между суммарными стоимостями разнонаправленных ордеров (рис. 86).
Рис. 86. Ордер Buy и Sell в окне терминала.
В случае если будет открыт ещё один ордер Sell на 0.1 лота (стоимостью 100.00),
то меньшая суммарная стоимость однонаправленных ордеров составляет 700.00 + 100.
00 = 800.00. Таким образом, сумма залога (в сравнении с вариантом, когда открыт
только один ордер Buy) уменьшается на 800.00. В сравнении с вариантом, представленным
на рис. 86, залог уменьшается, а свободные средства увеличиваются на 100.00 (см.
рис. 87).
Рис. 87. Ордер Buy и Sell в окне терминала.
Количество свободных средств, отображаемых на рис. 86 и 87, отличаются более
чем на 100.00, т.к. при изменении текущего курса изменилось суммарное значение
прибыли по открытым ордерам (разница составляет 8.00).
Если аналогичные манипуляции провести на другом дилинговом центре, то легко убедиться,
что описанный выше порядок формирования значения свободных средств не соблюдается.
Для некоторых дилинговых центров выполняется правило:
| Открытие любых рыночных ордеров не высвобождает залоговые средства и не увеличивает сумму свободных средств. Открытие рыночных ордеров увеличивает залог на сумму, превышающую суммарную стоимость противоположных ордеров по финансовому инструменту (правило выполняется не во всех дилинговых центрах). |
Например, если в дилинговом центре 2 по USD/JPY ранее был открыт ордер Buy стоимостью
4 лота, то при открытии ордера Sell стоимостью 4 лота сумма залога и сумма свободных
средств не изменится.
Рис. 88. Наличие разнонаправленных ордеров не высвобождает залог.
Получить информацию о том, хватает ли текущих средств для открытия ордера можно
расчётным путём. Можно также воспользоваться функцией AccountFreeMarginCheck(),
возвращающей количество свободных средств, которые останутся после открытия рыночного
ордера заданного количества лотов по указанному финансовому инструменту. Если возвращённое
значение оказывается больше или равно 0, то средств хватает, если же меньше, то
ордер такой стоимости по этому финансовому инструменту открыть не удастся — клиентский
терминал вернёт ошибку 134.
Для того чтобы при первом знакомстве с условиями, предлагаемыми дилинговым центром,
выяснить размер свободных средств, требуемых для открытия ордера объемом в 1 лот, можно воспользоваться нехитрым скриптом
conditions.mq4:
//-------------------------------------------------------------------- // conditions.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Спец.функция start { Alert(Symbol()," Sell = ",AccountFreeMargin()// При продаже -AccountFreeMarginCheck(Symbol(),OP_SELL,1)); Alert(Symbol()," Buy = ",AccountFreeMargin() // При покупке -AccountFreeMarginCheck(Symbol(),OP_BUY,1)); return; // Выход из start() } //--------------------------------------------------------------------
Здесь выражение
AccountFreeMargin() - AccountFreeMarginCheck(Symbol(),OP_SELL,1)
позволяет вычислить разницу между имеющимися свободными средствами и свободными
средствами, которые останутся после открытия ордера.
Если этот скрипт запустить на исполнение в условиях, когда в терминале нет рыночных
ордеров, то можно получить текущий требуемый размер средств для открытия ордера объемом 1 лот на покупку
и на продажу:
Рис. 89. Стоимость 1 лота для различных финансовых инструментов, полученная
с помощью conditions.mq4.
Если скрипт conditions.mq4 запустить на исполнение в окне финансового инструмента, по которому открыты рыночные
ордера, то можно получить и другие значения в зависимости от того, каким методом
расчёта пользуется тот или иной дилинговый центр.
Другие ошибки и функция MarketInfo()
Существуют и другие ограничения, связанные с определением значений параметров функции
открытия ордера OrderSend(). Это — максимальный и минимальный шаг изменения стоимости
ордера, максимальный и минимальный размер стоимости ордера и пр. Использование
функции MarketInfo() позволяет получить различную информацию по финансовым инструментам,
которые отражены в окне "Обзор рынка" клиентского терминала.
Функция MarketInfo()
double MarketInfo(string symbol, int type)
Функция возвращает различную информацию о финансовых инструментах, перечисленных
в окне "Обзор рынка". Часть информации о текущем финансовом инструменте
хранится в предопределенных переменных.
Параметры:
symbol — символ инструмента;
type — идентификатор запроса, определяющий тип возвращаемой информации. Может быть любым
из значений идентификаторов запроса (см. Идентификаторы функции MarketInfo).
Некоторые ошибки могут возникать по причинам, обусловленным сервером. Например,
в условиях быстро изменяющихся цен брокер может увеличить минимальную дистанцию,
ограничивающую положение отложенных ордеров и стоп-приказов. В дальнейшем, при
спокойном рынке, брокер может снова уменьшить эту дистанцию. Таким образом, значения
некоторых параметров могут быть изменены в любой момент.
Для того чтобы программа работала устойчиво, с минимальным количеством отклонённых
торговых приказов, перед исполнением функции OrderSend() необходимо обновлять используемые программой параметры
информационного окружения с помощью функций MarketInfo()
и RefreshRates().
| Пример простого скрипта, открывающего ордер Buy, стоимостью 35% от суммы свободных средств, с некоторыми заданными значениями стоп-приказов (openbuy.mq4). |
//-------------------------------------------------------------------- // openbuy.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- int start() // Спец.функция start { int Dist_SL =10; // Заданный SL (pt) int Dist_TP =3; // Заданный TP (pt) double Prots=0.35; // Процент своб. ср. string Symb=Symbol(); // Финанс. инструмент //--------------------------------------------------------------- 2 -- while(true) // Цикл открытия орд. { int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер лота double Step =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен лотов double Free =AccountFreeMargin(); // Свободн средства double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим.1 лота //--------------------------------------------------------- 3 -- double Lot=MathFloor(Free*ProtsOne_LotStep)*Step;// Лоты if (Lot < Min_Lot) // Если меньше допуст { Alert(" Не хватает денег на ", Min_Lot," лотов"); break; // Выход из цикла } //--------------------------------------------------------- 4 -- if (Dist_SL < Min_Dist) // Если меньше допуст. { Dist_SL=Min_Dist; // Установим допуст. Alert(" Увеличена дистанция SL = ",Dist_SL," pt"); } double SL=Bid - Dist_SL*Point; // Заявленная цена SL //--------------------------------------------------------- 5 -- if (Dist_TP < Min_Dist) // Если меньше допуст. { Dist_TP=Min_Dist; // Установим допуст. Alert(" Увеличена дистанция TP = ",Dist_TP," pt"); } double TP=Bid + Dist_TP*Point; // Заявленная цена ТР //--------------------------------------------------------- 6 -- Alert("Торговый приказ отправлен на сервер. Ожидание ответа.."); int ticket=OrderSend(Symb, OP_BUY, Lot, Ask, 2, SL, TP); //--------------------------------------------------------- 7 -- if (ticket>0) // Получилось :) { Alert ("Открыт ордер Buy ",ticket); break; // Выход из цикла } //--------------------------------------------------------- 8 -- int Error=GetLastError(); // Не получилось :( switch(Error) // Преодолимые ошибки { case 135:Alert("Цена изменилась. Пробуем ещё раз.."); RefreshRates(); // Обновим данные continue; // На след. итерацию case 136:Alert("Нет цен. Ждём новый тик.."); while(RefreshRates()==false) // До нового тика Sleep(1); // Задержка в цикле continue; // На след. итерацию case 146:Alert("Подсистема торговли занята. Пробуем ещё.."); Sleep(500); // Простое решение RefreshRates(); // Обновим данные continue; // На след. итерацию } switch(Error) // Критические ошибки { case 2 : Alert("Общая ошибка."); break; // Выход из switch case 5 : Alert("Старая версия клиентского терминала."); break; // Выход из switch case 64: Alert("Счет заблокирован."); break; // Выход из switch case 133:Alert("Торговля запрещена"); break; // Выход из switch default: Alert("Возникла ошибка ",Error);// Другие варианты } break; // Выход из цикла } //--------------------------------------------------------------- 9 -- Alert ("Скрипт закончил работу -----------------------------"); return; // Выход из start() } //-------------------------------------------------------------- 10 --
Скрипт состоит из одной специальной функции start() (блоки 1-10). В блоке 1-2 заданы
значения, при которых должен быть открыт ордер. Блок 2-9 представляет цикл while
(), в котором производятся необходимые вычисления. Наличие этого цикла предполагает
возможность нескольких попыток открытия ордера. В блоке 2-3 обновляются переменные
окружения. В блоках 3-4-5-6 вычисляются значение количества лотов и заявленные
цены стоп-приказов. В блоке 7-8-9 выполняется обработка ошибок. В блоке 9-10 печатается
сообщение о завершении работы скрипта.
Рассмотрим некоторые особенности программного кода. Легко заметить, что формирование
торгового приказа осуществляется в блоке 6-7. В предшествующем блоке 3-4 вычисляется
количество лотов. Учитывается вариант, при котором выделенных свободных средств
не хватит для открытия ордера даже на минимальное количество лотов. Поэтому в блоке
3-4, после опубликования сообщения о нехватке денег, осуществляется выход из цикла
2-9 с помощью оператора break. Управление передаётся в блок 9-10, и скрипт заканчивает
работу. Сообщение в блоке 9 не обязательно должно присутствовать. Здесь оно указано
только для того, чтобы при опробовании скрипта на демо-счёте было легче сориентироваться
— когда программа закончила работу, а когда возникла пауза, связанная с задержками
в сети или на сервере.
Если для открытия ордера свободных средств хватает, то управление передаётся в блок
4-5 и далее в блок 5-6. В этих блоках не предусмотрен выход из цикла. Этим полагается,
что для любой минимальной дистанции, установленной брокером, найдутся соответствующие
значения стоп-приказов. В блоке 1-2 намеренно указано значение 3 пункта для TP.
Подавляющее число брокеров устанавливают минимальную дистанцию 5 пунктов. В блоке
5-6 будет обнаружено, что заданное значение меньше допустимого, и установлено такое
значение цены стоп-приказа, которое не противоречит ограничению.
Далее управление передаётся в блок 6-7 для открытия ордера. В первой строке этого
блока публикуется сообщение и лишь во второй строке формируется торговый приказ.
Возникает вопрос: почему мы заявляем о формировании торгового приказа ещё до того,
как он сформирован? Ведь можно было бы сначала отдать приказ, а потом сообщить
об этом пользователю. Ответ на этот вопрос непосредственно связан с технологией
отправки приказа клиентскому терминалу и далее на сервер (см. рис. 66). В нашем
случае торговый приказ формируется в функции OrderSend(), указанной в правой части
оператора присваивания. Собственно торговый приказ создаётся и отправляется на
сервер в самой функции, а исполнение операции присвоения в операторе присваивания
будет выполнено уже после того, как сервер вернёт какой-либо ответ о судьбе данного
торгового приказа. Таким образом, единственная возможность сообщить пользователю
о начале событий, связанных с торговым приказом, — это указать сообщение перед
оператором присваивания, в правой части которого указана торговая функция.
Рано
или поздно клиентский терминал вернёт управление в программу, будет исполнен оператор
присваивания в блоке 6-7, в результате чего переменная ticket получит какое-то
значение, и управление будет передано далее — в блок анализа ошибок 7-8-9.
Если ордер открыт на сервере, то переменной ticket будет присвоен номер открытого
ордера. В этом случае скрипт выполнил своё предназначение и далее работу программы
необходимо прекратить. В блоке 7-8 используется оператор break для выхода из цикла
while(). Управление передаётся в блок 9-10 (за пределы цикла) и программа заканчивает
работу.
Если же попытка открыть ордер не увенчалась успехом, то управление передаётся в
блок 8-9 для анализа ошибок. Здесь рассматривается 2 вида ошибок — те, которые
позволяют ещё надеяться на успешное открытие и те, появление которых однозначно
указывает на необходимость прекратить исполнение программы. Переменной Error присваивается
код последней ошибки, в данном случае той ошибки, которая была возвращена сервером
или клиентским терминалом при исполнении торговой функции OrderSend().
В первом операторе switch блока 8-9 рассматриваются преодолимые ошибки. Каждая из
ошибок этой группы обрабатывается по-своему. Например, если изменилась цена (ошибка
135), то достаточно просто обновить параметры окружения с помощью RefreshRates()
и повторить попытку открытия ордера. Если же возникла ошибка "нет цен" (ошибка 136),
то нет смысла сразу снова отправлять торговый приказ на сервер. В этом случае необходимо
дождаться нового тика (на сервере в этот период тоже нет цен) и только после этого
произвести ещё одну попытку открытия ордера. Поэтому в блоке обработки ошибки 136
имеется цикл задержки, который будет прерван в результате поступления нового тика.
Выход из оператора switch() осуществляется с помощью оператора continue, который
прекращает текущую итерацию цикла while () и начинает новую.
Ошибки непреодолимой силы обрабатываются иначе. Если такая ошибка возникла, то программа
просто сообщит о ней пользователю и прекратит работу. Для этой цели в программе
используется оператор break (последний в блоке 8-9), прекращающий цикл while (),
в результате чего программа заканчивает работу.
Отдельно нужно заметить, что в данном примере намеренно не рассматриваются все без
исключения ошибки. В данном случае мы не ставим перед собой цель предоставить в
распоряжение пользователя готовую программу. Очень важно, чтобы программист сам
проанализировал другие варианты ошибок и самостоятельно принял решение о том, какие
ещё ошибки и как необходимо обработать в программе. В то же время, некоторые ошибки
не должны обрабатываться, потому что сама программа построена таким образом, что
не предполагает возможности для возникновения некоторых ошибок, например, в данном
случае — для ошибок 129 и 130.
В представленном примере имеется также небольшая алгоритмическая ошибка, которая
не может быть обнаружена ни на этапе компиляции, ни в клиентском терминале, ни
на сервере.
| Относитесь критически к любым программным кодам, невзирая на авторитеты. |
Обратите внимание на код в блоке 4-5:
//--------------------------------------------------------------- 4 -- if (Dist_SL<Min_Dist) // Если меньше допуст. { Dist_SL=Min_Dist; // Установим допуст. Alert(" Увеличена дистанция SL = ",Dist_SL," pt"); } double SL = Bid - Dist_SL*Point; // Заявленная цена SL //--------------------------------------------------------------- 5 --
В результате вычислений в теле оператора if () переменная Dist_SL может получить
новое значение. Предположим, что обычно минимальная дистанция составляет 5 пунктов.
Предположим, что при первом исполнении (на быстром рынке) это значение установлено
на сервере равным 20 пунктов. Переменная Min_Dist получит значение 20.
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция
Предположим также, что сформированный торговый приказ был отклонён в результате
ошибки 136. Программа будет отслеживать новый тик в блоке 8-9. За это время на
сервере снова может быть изменено значение минимальной дистанции, на этот раз,
например,
уменьшено до 10 пунктов. С момента поступления нового тика управление будет передано
на новый цикл, будет вычислено новое значение переменной Min_Dist, равное 10. Однако
значение переменной Dist_SL останется неизменным, равным 20 (блок операторов 4-5
написан так, что значение Dist_SL может только увеличиваться). Чтобы исключить
эту алгоритмическую ошибку, блок 4-5 необходимо составить таким образом, чтобы
изменялось только то значение, которое зависит от ситуации, — в данном случае значение SL,
а значение Dist_SL не изменялось, например, так:
//--------------------------------------------------------------- 4 -- double SL = Bid - Dist_SL*Point; // Заявленная цена SL if (Dist_SL<Min_Dist) // Если меньше допуст. { SL = Bid - Min_Dist*Point; // Заявленная цена SL Alert(" Увеличена дистанция SL = ",Min_Dist," pt"); } //--------------------------------------------------------------- 5 --
Аналогичное изменение кода следует выполнить в блоке 5-6 и для другого
стоп-приказа.
Выставление отложенных ордеров
Программирование выставления отложенных ордеров принципиально ничем не отличается
от предназначенного для выставления рыночных.
Обратить внимание следует лишь на тот факт, что проверка достаточности средств (необходимых
для преобразования отложенного ордера в рыночный) для отложенных ордеров не производится
ни клиентским терминалом, ни сервером и никак не ограничена. Возможно выставить
отложенный ордер, многократно превышающий по стоимости имеющиеся на счёте средства.
Такой ордер может находиться в торговле неопределённо долгое время. В момент, когда
рыночная цена достигнет уровня заявленной в отложенном ордере цены открытия, на
сервере будет произведена проверка. Если в этот момент средств на счёте достаточно
для открытия, то ордер будет преобразован в рыночный (открыт), если же нет — то
он будет удалён.
Функция WindowPriceOnDropped()
В MQL4 есть одна очень важная возможность — программно определить в окне финансового
инструмента координаты места, на которое был установлен эксперт или скрипт, если
они присоединены с помощью мыши. Например, используя функцию WindowPriceOnDropped()
можно получить значение прикрепления скрипта по оси ординат.
double WindowPriceOnDropped()
Функция возвращает значение цены в точке графика, на которой был брошен эксперт
или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены
с помощью мыши (технология "drag and drop"). Для пользовательских индикаторов
это значение не определено.
| Пример простого скрипта, устанавливающего ордер BuyStop, стоимостью 35% от суммы свободных средств, с некоторыми заданными значениями стоп-приказов (openbuystop.mq4). |
//-------------------------------------------------------------------- // openbuystop.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- int start() // Спец.функция start { int Dist_SL =10; // Заданный SL (pt) int Dist_TP =3; // Заданный TP (pt) double Prots=0.35; // Процент своб. ср. string Symb=Symbol(); // Финанс. инструмент double Win_Price=WindowPriceOnDropped(); // Здесь брошен скрипт Alert("Мышкой задана цена Price = ",Win_Price);// Задано мышей //--------------------------------------------------------------- 2 -- while(true) // Цикл открытия орд. { int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер лота double Free =AccountFreeMargin(); // Свободн средства double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим.лота double Lot=MathFloor(Free*ProtsOne_LotMin_Lot)*Min_Lot;// Лоты //--------------------------------------------------------- 3 -- double Price=Win_Price; // Цена задана мышей if (NormalizeDouble(Price,Digits)< // Если меньше допуст. NormalizeDouble(Ask+Min_Dist*Point,Digits)) { // Только для BuyStop! Price=Ask+Min_Dist*Point; // Ближе нельзя Alert("Изменена заявленная цена: Price = ",Price); } //--------------------------------------------------------- 4 -- double SL=Price - Dist_SL*Point; // Заявленная цена SL if (Dist_SL < Min_Dist) // Если меньше допуст. { SL=Price - Min_Dist*Point; // Заявленная цена SL Alert(" Увеличена дистанция SL = ",Min_Dist," pt"); } //--------------------------------------------------------- 5 -- double TP=Price + Dist_TP*Point; // Заявленная цена ТР if (Dist_TP < Min_Dist) // Если меньше допуст. { TP=Price + Min_Dist*Point; // Заявленная цена TP Alert(" Увеличена дистанция TP = ",Min_Dist," pt"); } //--------------------------------------------------------- 6 -- Alert("Торговый приказ отправлен на сервер. Ожидание ответа.."); int ticket=OrderSend(Symb, OP_BUYSTOP, Lot, Price, 0, SL, TP); //--------------------------------------------------------- 7 -- if (ticket>0) // Получилось :) { Alert ("Установлен ордер BuyStop ",ticket); break; // Выход из цикла } //--------------------------------------------------------- 8 -- int Error=GetLastError(); // Не получилось :( switch(Error) // Преодолимые ошибки { case 129:Alert("Неправильная цена. Пробуем ещё раз.."); RefreshRates(); // Обновим данные continue; // На след. итерацию case 135:Alert("Цена изменилась. Пробуем ещё раз.."); RefreshRates(); // Обновим данные continue; // На след. итерацию case 146:Alert("Подсистема торговли занята. Пробуем ещё.."); Sleep(500); // Простое решение RefreshRates(); // Обновим данные continue; // На след. итерацию } switch(Error) // Критические ошибки { case 2 : Alert("Общая ошибка."); break; // Выход из switch case 5 : Alert("Старая версия клиентского терминала."); break; // Выход из switch case 64: Alert("Счет заблокирован."); break; // Выход из switch case 133:Alert("Торговля запрещена"); break; // Выход из switch default: Alert("Возникла ошибка ",Error);// Другие варианты } break; // Выход из цикла } //--------------------------------------------------------------- 9 -- Alert ("Скрипт закончил работу -----------------------------"); return; // Выход из start() } //-------------------------------------------------------------- 10 --
Структура скрипта openbuystop.mq4 построена так же, как в скрипте
openbuy.mq4, поэтому нет необходимости описывать его подробно. Остановимся только на основных
отличиях этих программ.
Цена, на уровне которой скрипт был прикреплён к окну финансового инструмента, определяется
в строке:
double Win_Price=WindowPriceOnDropped(); // Здесь брошен скрипт
В дальнейшем значение этой переменной сохраняется неизменным в течение всего времени
работы программ. Это необходимо в случае, если скрипт несколько раз подряд потерпит
неудачу при попытке установить ордер. При этом скрипт всякий раз будет вычислять
заявленное значение цены, близкой к тому месту (тому уровню цены), где пользователь
прикрепил скрипт.
Нетрудно увидеть, что в скрипте
openbuystop.mq4 отсутствует проверка достаточности свободных средств для открытия ордера, но появилась
проверка значения цены открытия ордера (блок 3-4). Если вычисленное значение переменной
Price не удовлетворяет требованиям установки отложенного Stop ордера (см. Характеристики ордеров, Требования и ограничения торговых операций), то производится перерасчёт этого значения.
В блоке обработки ошибок также произошли небольшие изменения: некоторые ошибки не
рассматриваются, но появилась обработка кодов других ошибок.
Разумные ограничения
В связи с использованием торговых функций необходимо обратить внимание на ограничения
более общего характера. Например, ошибка 146 возникает только в том случае, если
в окне одного финансового инструмента одновременно работают несколько программ,
формирующих торговые приказы. По мнению автора, такая практика, хотя и допустима,
но не оправданна.
Гораздо эффективнее — создать и использовать одну торгующую программу, которая
учитывала бы все особенности торговли. Во время работы одной программы возможность
формирования одновременно нескольких торговых приказов вообще не возникает.
Кроме того, в такой программе можно более эффективно организовать весь алгоритм:
учитывать вероятность успешных торгов по различным финансовым инструментам и в
зависимости от этого правильно перераспределять денежные средства.
Для торговых операций более эффективно использовать полноценный эксперт, а скрипт
лучше применять для разовых расчётов и сообщения на экран некоторой полезной информации.
Вместе с тем, в случае если трейдер не использует эксперт для автоматической торговли,
применение скриптов оказывается более эффективным, чем управление ордерами с помощью
панели управления клиентского терминала.
При работе торгового терминала 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 — Ошибка при работе с объектом.
Некоторые наиболее часто возникающие проблемы- ошибки в работе форекс — советников и возможные способы их решения. Коды ошибок можно узнать, посмотрев папки «Эксперты» и «Журнал» панели «Терминал», или папку «Журнал» панели «Тестер», если ошибки происходят в процессе тестирования.
Ошибки в процессе тестирования советника
Если проблема остаётся или кода вашей ошибки нет в этом перечне, необходимо обращаться к разработчику советника.
Все коды ошибок.
ошибка 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. Проверьте, Минимальный и Максимальный лот в Вашем ДЦ и на Вашем счете. На некоторых типах счетов, минимальный лот может быть 0.01 а также 0.1 и даже 3. Максимальный лот может быть 5 лотов и 999 лотов и другие.
3. Уточните разрядность лотов на Вашем сервере. Если например разрядность лотов=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
Остаток от деления на ноль
1. Вы пытаетесь поделить число на 0.
Способы решения:
1. Проверьте Весь код советника на наличие такой грубой ошибки, или же проверьте все значения из MarketInfo функций на момент возвращения 0, иногда при MarketInfo(Symbol(),MODE_SPREAD) возвращается не спред а 0 (у брокеров с плавающим спредом)
ошибка 4017
Вызовы DLL не разрешены
1. В Вашем терминале запрещен вызов DLL
Способы решения:
1. Разрешите вызов DLL через Меню – сервис – Настройки – Советник – Разрешить вызов DLL, но помните, разрешайте данную опцию только для советников, в которых Вы уверены, и уверены что в ДЛЛ не сидит какой-нибудь троян. Проверьте ДЛЛ на наличие троянов с помощью антивируса.
ошибка 4018 , 4019
Невозможно загрузить библиотеку
1. Библиотека повреждена
2. Вызов библиотеки осуществляется с ошибкой
Способы решения:
1. Проверьте библиотеку DLL
2. Обратитесь к разработчику данной библиотеки
ошибка 4020
Вызовы внешних библиотечных функций не разрешены
1. В Вашем терминале запрещен вызов функций из внешних экспертов
Способы решения:
1. Разрешите вызов функций через Меню – сервис – Настройки – Советник – Разрешить вызов внешних экспертов,
ошибка 4103
Невозможно открыть файл
1. Данный файл не существует
2. Данный файл заблокирован
Способы решения:
1. Проверьте наличие указанного файла в папке experts – files Тester – files
2. Проверьте не заблокирован ли файл системой антивируса. Разрешен ли режим записичтения файла
ошибка 4106
Неизвестный символ
1. Символа нет в обзоре рынка
Способы решения:
1. В обзоре рынка – правой кнопкой мыши – показать все символы
2. Проверить названия символа в советнике и наличие его в обзоре рынка
3. Некоторые советники используют четкие названия без суфиксов, а брокеры намеренно ставят суфиксы, например EURUSDx где х – суфикс.
ошибка 4108
Неверный номер тикета
1. Тикет ордера, который выбирает эксперт – не существует
2. Эксперт пытается выбрать тикет, но данный ордер был закрыт другим советником или руками.
3. При попытке осуществления приказа над ордером, тикет был исполнен и закрыт брокером.
Способы решения:
1. Если данная ошибка появляется очень часто, 100-1000 раз за минуту, проверьте функции Вашего советника
2. Отключите другие советники, или настройте их так, чтобы они не конфликтовали, не закрывайте ордер руками, когда эксперт выполняет операцию
ошибка 4109
Торговля не разрешена
1. Советнику запрещено торговать, на графике грустный смайл или крестик
Способы решения:
1. Включите галочку «Разрешить советнику торговать» в вкладе при установке советника, либо в меню- сервис – настройки – советники.
ошибка 4110, 4111
1. Длинные позиции не разрешены
2. Короткие позиции не разрешены
Способы решения:
1. В настройках советника, в вкладке Общие не разрешен тип позиций
2. В Вкладке Общие, при установке советника есть выбор позиций:
Long Short – Разрешены BUY SELL
Only Long– Разрешен BUY
Only Short – Разрешен SELL
Другие статьи по теме:
Устранение ошибок в работе эксперта
Коды ошибок в работе советников форекс (константы MQL4)
Тонкости работы торгового терминала MetaTrader4
Очистка терминала МТ4



































