Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Во, а то fxsaber расстраивается, что я один эту ошибку заметил, значит, никому либа не нужна )) Просто народ у нас ну очень наблюдательный.
Анекдот из жизни - вел вебинар, раз 10 повторил, что запись будет. В конце говорю еще раз, запись будет завтра, если есть вопросы - задавайте. А теперь угадайте первый вопрос )))
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как правильно работать в MT5 с OrderSend
fxsaber, 2016.10.13 07:10
Самостоятельно пишется очень простая перегрузка OrderSend: пока OnTrade не возвратит ответ, все последующие OrderSend возвращают false. Как ответ получен - принудительный false отменяется.
ЗЫ Если хочется совсем полноценно (не для СБ), то в OnTrade по приходу соответствующей синхронизации вызывать самостоятельно OnTick и OnTimer.
Учитывайте это MT5-обстоятельство при работе с привычными MT4-Order-функциями: OrderSend, OrderModify, OrderClose, OrderDelete.
Добавить в MT5 гарантированную (как в MT4) синхронизацию истории после торговых приказов возможно самостоятельно по алгоритму в цитате.
Идея интересная. Однако, конвертированный МТ4 эксперт на МТ5 работает медленно
Медленно работает только реализация OrderSelect(index, SELECT_BY_POS, MODE_HISTORY). Можно было бы ускорить, но тогда не было бы определенной сортировки истории, которая есть в MT4 и которую некоторые используют. Если бы не использовали, можно было бы сделать работу этого режима не медленней, чем в MT4. Все остальное работает точно не медленней. Поэтому, если не используете вышеназванный режим OrderSelect, ищите тормоза вне MT4Orders.
Если же касаться таймсерий и других вещей, то в описании подчеркнута эта тема - не затрагивалась. Скорее всего, там у Вас тормоза.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2016.10.20 08:24
СБ на всех торговых серверах//| Get the property value "ORDER_TYPE_FILLING" |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
{
return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
}
ВСЕГДА в тестере возвращает ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN.
Поэтому если в OrderModify filling задать через COrderInfo::TypeFilling(), то на том же RoboForexEU-MetaTrader 5 будет логичная ошибка [Unsupported filling mode]. Однако, на MetaQuotes-Demo этой ошибки не возникает - криво настроен сервер разработчиков?
это может вызвать ошибку [Unsupported filling mode] на некоторых торговых серверах при попытке модификации через OrderModify отложенных ордеров.
Если столкнулись с такой проблемой, то следующим образом этот баг можно обойти
// https://www.mql5.com/ru/forum/1111/page1759#comment_2906850
if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2016.10.20 15:54
Изучил Стандартную Библиотеку и написал проверочный советник#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>
// Через MT5-Стандартную Библиотеку - only MT5
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT5Order( const double Price )
{
CTrade Trade;
if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
Trade.SetTypeFilling(ORDER_FILLING_RETURN);
Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);
const ulong Ticket = Trade.ResultOrder();
if (Ticket > 0)
{
COrderInfo Order;
if (Order.Select(Ticket))
Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
}
}
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
// Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT4Order( const double Price )
{
const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}
void OnTick()
{
static bool FirstRun = true;
if (FirstRun)
{
const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
MT5Order(Price); // Через MT5-Стандартную Библиотеку - only MT5
MT4Order(Price); // Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
FirstRun = false;
}
}
можно сравнить код функций MT4Order и MT5Order.
Да, вы правы, медленная работа из-за OrdersHistoryTotal()
Возможно, стоит сделать ускоренный вариант этой функции. Будет работать без какого-либо промедления, но не на 100% соответствовать MT4.
Посмотрел код сейчас. Есть несколько способов ускорения. Например, в тестере можно наплевать на синхронизацию с MT5-историей, т.к. в тестере все прямолинейно.
Но, честно говоря, ни в тестере, ни на реале не приходилось сталкиваться с задачами, когда ТС требовалось анализировать историю.
Поэтому подобное ускорение, сомневаюсь, что буду делать.
Возможно, стоит сделать ускоренный вариант этой функции. Будет работать без какого-либо промедления, но не на 100% соответствовать MT4.
Посмотрел код сейчас. Есть несколько способов ускорения. Например, в тестере можно наплевать на синхронизацию с MT5-историей, т.к. в тестере все прямолинейно.
Но, честно говоря, ни в тестере, ни на реале не приходилось сталкиваться с задачами, когда ТС требовалось анализировать историю.
Поэтому подобное ускорение, сомневаюсь, что буду делать.
Я использую анализ истории, мой ММ подразумевает торговлю ситуации, на протяжении которой происходит закрытие и открытие позиций, а риск учитывается с использованием финансового результата с начала возникновения ситуации.
Под ситуацией можно представить выявление тренда - работа по его окучиванию до его завершения ведется разная - открытие и закрытие позиций, но важно знать чем можно рисковать так как чем дольше тренд протекает, тем больше вероятность его завершения - отсюда разный объем открываемых ордеров и точек выхода.