Многие трейдеры на Московской бирже хотели бы автоматизировать свои торговые алгоритмы, но не знают с чего начать. Язык MQL5 предлагает не только огромный набор торговых функций, но и готовые классы, которые максимально облегчают первые шаги в алготрейдинге.
//+------------------------------------------------------------------+//| Возврат стрингового результата торговой операции по его коду |//+------------------------------------------------------------------+string ResultRetcodeDescription(int retcode)
{
string str;
//----switch(retcode)
{
caseTRADE_RETCODE_REQUOTE:
str="TRADE_RETCODE_REQUOTE(Реквота)";
break;
caseTRADE_RETCODE_REJECT:
str="TRADE_RETCODE_REJECT(Запрос отвергнут)";
break;
caseTRADE_RETCODE_CANCEL:
str="TRADE_RETCODE_CANCEL(Запрос отменен трейдером)";
break;
caseTRADE_RETCODE_PLACED:
str="TRADE_RETCODE_PLACED(Ордер размещен)";
break;
caseTRADE_RETCODE_DONE:
str="TRADE_RETCODE_DONE(Заявка выполнена)";
break;
caseTRADE_RETCODE_DONE_PARTIAL:
str="TRADE_RETCODE_DONE_PARTIAL(Заявка выполнена частично)";
break;
caseTRADE_RETCODE_ERROR:
str="TRADE_RETCODE_ERROR(Ошибка обработки запроса)";
break;
caseTRADE_RETCODE_TIMEOUT:
str="TRADE_RETCODE_TIMEOUT(Запрос отменен по истечению времени)";
break;
caseTRADE_RETCODE_INVALID:
str="TRADE_RETCODE_INVALID(Неправильный запрос)";
break;
caseTRADE_RETCODE_INVALID_VOLUME:
str="Неправильный объем в запросе";
break;
caseTRADE_RETCODE_INVALID_PRICE:
str="TRADE_RETCODE_INVALID_VOLUME(Неправильная цена в запросе)";
break;
caseTRADE_RETCODE_INVALID_STOPS:
str="TRADE_RETCODE_INVALID_STOPS(Неправильные стопы в запросе)";
break;
caseTRADE_RETCODE_TRADE_DISABLED:
str="TRADE_RETCODE_TRADE_DISABLED(Торговля запрещена)";
break;
caseTRADE_RETCODE_MARKET_CLOSED:
str="TRADE_RETCODE_MARKET_CLOSED(Рынок закрыт)";
break;
caseTRADE_RETCODE_NO_MONEY:
str="TRADE_RETCODE_NO_MONEY(Нет достаточных денежных средств для выполнения запроса)";
break;
caseTRADE_RETCODE_PRICE_CHANGED:
str="TRADE_RETCODE_PRICE_CHANGED(Цены изменились)";
break;
caseTRADE_RETCODE_PRICE_OFF:
str="TRADE_RETCODE_PRICE_OFF(Отсутствуют котировки для обработки запроса)";
break;
caseTRADE_RETCODE_INVALID_EXPIRATION:
str="TRADE_RETCODE_INVALID_EXPIRATION(Неверная дата истечения ордера в запросе)";
break;
caseTRADE_RETCODE_ORDER_CHANGED:
str="TRADE_RETCODE_ORDER_CHANGED(Состояние ордера изменилось)";
break;
caseTRADE_RETCODE_TOO_MANY_REQUESTS:
str="TRADE_RETCODE_TOO_MANY_REQUESTS(Слишком частые запросы)";
break;
caseTRADE_RETCODE_NO_CHANGES:
str="TRADE_RETCODE_NO_CHANGES(В запросе нет изменений)";
break;
caseTRADE_RETCODE_SERVER_DISABLES_AT:
str="TRADE_RETCODE_SERVER_DISABLES_AT(Автотрейдинг запрещен сервером)";
break;
caseTRADE_RETCODE_CLIENT_DISABLES_AT:
str="TRADE_RETCODE_CLIENT_DISABLES_AT(Автотрейдинг запрещен клиентским терминалом)";
break;
caseTRADE_RETCODE_LOCKED:
str="TRADE_RETCODE_LOCKED(Запрос заблокирован для обработки)";
break;
caseTRADE_RETCODE_FROZEN:
str="TRADE_RETCODE_FROZEN(Ордер или позиция заморожены)";
break;
caseTRADE_RETCODE_INVALID_FILL:
str="TRADE_RETCODE_INVALID_FILL(Указан неподдерживаемый тип исполнения ордера по остатку)";
break;
caseTRADE_RETCODE_CONNECTION:
str="TRADE_RETCODE_CONNECTION(Нет соединения с торговым сервером)";
break;
caseTRADE_RETCODE_ONLY_REAL:
str="TRADE_RETCODE_ONLY_REAL(Операция разрешена только для реальных счетов)";
break;
caseTRADE_RETCODE_LIMIT_ORDERS:
str="TRADE_RETCODE_LIMIT_ORDERS(Достигнут лимит на количество отложенных ордеров)";
break;
caseTRADE_RETCODE_LIMIT_VOLUME:
str="TRADE_RETCODE_LIMIT_VOLUME(Достигнут лимит на объем ордеров и позиций для данного символа)";
break;
caseTRADE_RETCODE_INVALID_ORDER:
str="TRADE_RETCODE_INVALID_ORDER:Неверный или запрещённый тип ордера)";
break;
caseTRADE_RETCODE_POSITION_CLOSED:
str="TRADE_RETCODE_POSITION_CLOSED:Позиция с указанным POSITION_IDENTIFIER уже закрыта)";
break;
caseTRADE_RETCODE_INVALID_CLOSE_VOLUME:
str="TRADE_RETCODE_INVALID_CLOSE_VOLUME(Закрываемый объем превышает текущий объем позиции)";
break;
caseTRADE_RETCODE_CLOSE_ORDER_EXIST:
str="TRADE_RETCODE_CLOSE_ORDER_EXIST(Для указанной позиции уже есть ордер на закрытие)";
break;
caseTRADE_RETCODE_LIMIT_POSITIONS:
str="TRADE_RETCODE_LIMIT_POSITIONS(Количество открытых позиций, которое можно одновременно иметь на счете, может быть ограничено настройками сервера)";
break;
caseTRADE_RETCODE_REJECT_CANCEL:
str="TRADE_RETCODE_REJECT_CANCEL(Запрос на активацию отложенного ордера отклонен, а сам ордер отменен)";
break;
caseTRADE_RETCODE_LONG_ONLY:
str="TRADE_RETCODE_LONG_ONLY(Запрос отклонен, так как на символе установлено правило \"Разрешены только длинные позиции\")";
break;
caseTRADE_RETCODE_SHORT_ONLY:
str="TRADE_RETCODE_SHORT_ONLY(Запрос отклонен, так как на символе установлено правило \"Разрешены только короткие позиции\")";
break;
caseTRADE_RETCODE_CLOSE_ONLY:
str="TRADE_RETCODE_CLOSE_ONLY(Запрос отклонен, так как на символе установлено правило \"Разрешено только закрывать существующие позиции\")";
break;
caseTRADE_RETCODE_FIFO_CLOSE:
str="TRADE_RETCODE_FIFO_CLOSE(Запрос отклонен, так как для торгового счета установлено правило \"Разрешено закрывать существующие позиции только по правилу FIFO\")";
break;
case TRADE_RETCODE_HEDGE_PROHIBITED:
str="TRADE_RETCODE_HEDGE_PROHIBITED(Запрос отклонен, так как для торгового счета установлено правило \"Запрещено открывать встречные позиции по одному символу\")";
break;
//case : str=""; break;//case : str=""; break;//case : str=""; break;//case : str=""; break;default:
str="Неизвестный результат";
}
//----return(str);
}
它似乎是这样工作的。
但它非常慢,而且不是一个很好的解决方案。
它似乎是这样工作的。
但它非常慢,而且不是一个很好的解决方案。
你几乎已经做出了这个选择。
关于交易、自动交易系统和交易策略测试的论坛
伟大而可怕的永远的MT4(或如何制定迁移策略)
fxsaber, 2021.05.09 00:36
你可以使用这个条件。
一般来说,我们需要开发人员提供某种同步的RefreshPositions(),它将可靠地从服务器返回位置+订单的状态。
然后,需要的人异步发送命令,不需要的人在程序的主体中等待服务器的回答。
这就是问题所在,它确实如此。当脚本运行结束时,会有一个或两个位置被挂起(取决于代码中插入了多少个印刷品)。
代码。
结果。
为了使画面更完整,将文章中的交易事件监听器https://www.mql5.com/ru/articles/2513,添加到相邻的图表中
要查看事件的顺序
+ addrequest_id - 发送订单时由终端设置的请求ID。
有多少订单是真正送到那里的
我认为,OnTradeTransaction()也不能保证任何事情,事件的顺序不能保证,信息传递到终端本身也不能保证--我指的是在互联网供应商不是最可靠的情况下。
没有机制来控制OnTradeTransaction(),或者我已经或没有严格按照顺序收到所有事件。
PZY: 我希望一些不太忙的MQ程序员能抽出2个小时来写一个函数,返回错误代码的文本描述。 那就太好了,在MQL5中可以少写一些,在MT4中也不需要--让他们手动来做。
;)
在codobase中找到,并添加了最新的代码
所以人们要求进入黑匣子--他们得到了。
现在你必须自己进行同步。问了吗?他们做到了。他们有吗?他们做到了。它好吗?他们说,这将是很好的。一旦给了,就变坏了。
1.我没有要求这样做。
2.没有人说价格会是数据的完整性,这一点要重要得多。
而不是像 "我们的错 "这样赤裸裸的蛊惑人心,你能不能提供一个没有拐杖的解决方案?
在kodobase中找到并添加了最新的代码
我在半小时内从ME的帮助下完成了同样的代码--打开错误代码,突出显示鼠标,Ctrl+C ,创建一个空的Excel页面,Ctrl+V,用case:和倒置的逗号添加列。
然后在ME中 按Ctrl+ C +Ctrl+V 键
好吧,显然,"忍受困难 "不仅仅是军事手册中的一条,它更像是我们的心态。
1.我没有要求这样做。
2.没有人说价格会是数据的完整性,这一点要重要得多。
与其说是 "责备自己 "的蛊惑人心,你能不能提出一个没有拐杖的解决方案?
我在半小时内从ME的帮助下完成了同样的代码--打开错误代码,突出显示鼠标,Ctrl+C ,创建一个空的Excel页面,Ctrl+V,用case:和倒置的逗号添加列。
然后在ME中 按Ctrl+ C +Ctrl+V 键
好吧,显然,"忍受困难 "不仅仅是军事手册中的一条,它更像是我们的心态。