Quantcast
Channel: Блог компании MetaQuotes Software
Viewing all 80 articles
Browse latest View live

Новый MetaTrader 5 для Android - со стаканом цен и тиковым графиком

$
0
0
В свежем билдеприложение получило новый облик, полностью соответствующий гайдлайну Google Style Guide, — дизайнеры существенно обновили программу.

Новый MetaTrader 5 для Android


Работа проведена  не только над оболочкой, но и над содержанием: трейдерам теперь доступны новые возможности, приближающие функционал приложения к десктопной версии:

  • Появилась поддержка стакана цен (для символов, торговля которыми осуществляется в режиме биржевого исполнения).

  • При совершении торговых сделок стал доступен тиковый график.

  • Добавлен системный журнал, в котором фиксируется информация обо всех событиях во время работы терминала, включая совершенные торговые операции.

  • Стали доступны финансовые новости. Не выходя из терминала, можно оперативно читать все важные сообщения о ситуации на рынках и держать руку на пульсе. Новости отбираются редакторами по принципу «только реально полезная для трейдинга информация, никакого мусора, никакой рекламы».

 

Кроме того, в новом билде появились таймфреймы W1 (недельный) и MN (месячный), была проведена локализация на греческий и португальский языки и добавлено звуковое сопровождение торговых операций.

Скачать обновленное приложениеможно в Google Play.

Где взять роботов для Московской Биржи?

$
0
0
«По данным Московской биржи уже два года назад торговые роботы выставляли более 95% объема заявок на рынке акций, а в объеме торгов их доля составляла 40%. На срочном рынке FORTS доля роботов и вовсе была более 60%. И из года в год влияние роботов на мировых финансовых рынках только растет. Торговые решения принимаются такими автоматическими системами за доли секунды — в режиме ручного трейдинга подобная реакция на колебания котировок невозможна.

Особенно актуальным такой высокочастотный трейдинг (HFT)становится в моменты сильных колебаний котировок — скорость реакции и минимальная задержка в исполнении сделок выходят на первый план. Вспомним хотя бы сверхволатильный конец 2014 года — »черный понедельник" 14 декабря и еще более «черный вторник» 15 декабря с последующим отскоком рубля. Расчетливые алготрейдеры наверняка существенно увеличили свой торговый счет в эти дни.

Как раз за несколько недель до этого на валютном рынке Московской биржи стала доступна торговая платформа MetaTrader 5, поддерживающая HFT-трейдинг и торговых роботов. Трейдеры, использующие MOEX в качестве основной рабочей площадки, получили в распоряжение не просто популярное торговое решение, а универсальный аппарат «все-в-одном». Эта высокоскоростная платформа позволяет не только торговать на рублевых парах, зарабатывая на колебаниях курсов. Благодаря встроенным сервисам можно прямо в MetaTrader 5 покупать готовых роботов или заказывать у фрилансеров эксклюзивные советники, которые будут торговать по заданной стратегии.

Торговые роботы для валютного рынка Московской Биржи

MetaTrader 5 — это целая экосистема со множеством сервисов, облегчающих каждодневную деятельность трейдеров любого уровня подготовки. Важнейшим элементом этой экосистемы является магазин готовых торговых приложений MetaTrader Market. Именно там вы можете купить роботов, торгующих по заданной автором стратегии, и технические индикаторы, в автоматическом режиме анализирующие рынок.

Самое главное — благодаря широкому распространению платформ MetaTrader такие роботы становятся доступны все большему количеству трейдеров. Это раньше нужно было быть опытным программистом, чтобы самостоятельно написать советника для автоматической торговли. Теперь же любого робота можно скачать во встроенном в MetaTrader 5 Маркете, работающем по принципу Apple App Store или Google Play. Помимо 1 100 советников и индикаторов там можно найти журналы и книги финансовой тематики. Словом, все необходимое для совершенствования своих навыков и знаний. В магазине представлены и бесплатные продукты — качайте и используйте их в торговле совершенно свободно!

Созданный два года назад Маркет точно угадал текущие запросы трейдеров и стал «ходовым местом» — к лету 2014 года в магазине было продано 6 300 продуктов общей стоимостью более 522 000 $, а услугами сервиса воспользовались 520 продавцов и 24 500 покупателей. Таким образом Маркет обрел статус главного места покупки торговых роботов в интернете: «Говорим — рынок советников, подразумеваем — MetaTrader Market».

Готовы использовать роботов для автоматизации своей торговли, но боитесь подступить к новому для себя делу? Тогда зайдите в Маркет и бесплатно скачайте какой-нибудь советник для MetaTrader 5. Запустите его в торговлю и оцените результаты. Возможно, это в итоге подтолкнет вас на дальнейшее знакомство с алготрейдингом и даст преимущество в виде HFT на Московской Бирже".

Источник: investfunds.ru, «Где найти роботов для Московской биржи»

Торговых роботов для платформ MetaTrader теперь можно взять напрокат

$
0
0

Мы стремимся сделать магазин MetaTrader Marketболее ходовым и популярным, в то же время он должен оставаться максимально полезным для трейдеров. Сейчас рынок приложений активно развивается и важную роль в этом играют пожелания его участников.

В последнее время от пользователей все чаще поступали предложения о внедрении аренды. Выяснилось, что трейдеры хотели бы получить интересующие их программы не на вечное пользование, а на какой-то короткий срок. За это время можно протестировать работу торгового робота и решить, понадобится программа на более длительный срок или нет.

Почему бы нет, если это действительно поможет трейдерам определиться в своих желаниях, а разработчикам — расширить клиентскую базу за счет привлечения «сомневающихся»? После некоторых раздумий мы дали разработчикам такую возможность — программы теперь можно не только продавать за полную стоимость, но и выставлять сетку тарифов на аренду — 1/3/6/12 месяцев.

Аренда торговых роботов для MetaTrader 4 и MetaTrader 5

Разработчики восприняли это нововведение с энтузиазмом — опция стала доступна совсем недавно, а программ, которые можно взять напрокат, насчитывается уже более 350 (233 для MetaTrader 4 и 129 для MetaTrader 5).

Причем, неделей ранее 11 февраля таких продуктов в Маркете было в два раза меньше — 160. Старт получился довольно резвый. Посмотрим, как дело пойдет дальше.

Социальный трейдинг на Московской Бирже реален?

$
0
0

В торговой платформе MetaTrader 5 есть свой социальный трейдинг — сервис «Торговые сигналы». Он позволяет одним трейдерам транслировать торговые операции, а другим — автоматически повторять их с минимальными задержками на своем счете. Сервисом активно пользуются тысячи трейдеров по всему миру.

Чтобы облегчить знакомство новых пользователей с торговыми сигналами, мы подготовили серию обучающих видеороликов. Большинство людей склонно к визуальному восприятию информации, поэтому мы надеемся, что такой формат подачи поможет трейдерам быстрее понять принципы работы сервиса. Просмотрев все ролики всего за 15 минут, можно составить полное представление о копи-трейдинге в платформах MetaTrader.

С технической точки зрения копи-трейдинг реализован как штатная функция в MetaTrader 4 и в MetaTrader 5. Это означает, что сигнальному сервису ничто не мешает работать на Московской Бирже. В данный момент ведутся переговоры с брокерами о включении этой опции в составе MetaTrader 5 для торговли на MOEX. С нетерпением ждем, когда лед тронется.

Есть ли альтернатива VPS для хостинга роботов 24/7?

$
0
0

Как трейдеры обычно добиваются бесперебойного хостинга роботов, когда «домашний компьютер — не вариант»? Арендуют VPS. Теперь этому есть альтернатива — виртуальный хостинг, встроенный в платформу MetaTrader 5.

Тут нет сложностей с настройками, разумные тарифы и главное — это заточенное конкретно под трейдерские задачи решение. Отсюда вытекает самое важное преимущество — минимальные сетевые задержки, дающие лучшее исполнение сделок. Платформа сама предоставляет наилучшую площадку с минимальными задержками до сервера брокера. Одно это позволяет арендовавшему виртуальный MetaTrader 5 окупить месячный хостинг.

Аренда виртуальной копии платформы прямо в MetaTrader 5
Сам по себе процесс аренды виртуальной платформы достаточно прост и проходит в несколько кликов непосредственно в MetaTrader 5. Протестировать виртуальный хостинг и самостоятельно оценить пинг до своего брокера может любой трейдер — первые 24 часа работы сервиса предоставляются бесплатно.

Тестовый период позволяет оценить ключевые характеристики сервиса и его преимущества — мгновенное исполнение сделок, минимальные задержки и проскальзывания, а также полный контроль за работой виртуальной платформы. Выбрав ближайший сервер и подходящий тарифный план, пользователи получают полноценную копию своей платформы. Там точно так же запускаются графики и торговые роботы, копируются сделки поставщиков сигналов.

Кроме того, благодаря графическим отчетам трейдер может анализировать использование ресурсов процессора, дискового пространства и оперативной памяти на виртуальной копии. Это позволяет легко оценить степень загрузки системы.

Есть ли альтернатива VPS для хостинга роботов 24/7?

 

Хотите узнать, какова скорость доступа до сервера вашего брокера прямо сейчас? Используйте тестовый период — у вас есть целые сутки бесплатной аренды виртуальной платформы.

Новый MetaTrader 5 build 1150 с лентой сделок, упрощенными покупками в Маркете и отладкой роботов на истории

$
0
0

Стало доступно большое обновление MetaTrader 5 со множеством улучшений:

  1. Для биржевых инструментов на тиковом графике теперь отображается лента сделок Time & Sales. Все заключенные на бирже сделки отмечаются на графике так: красные круги — сделки на продажу, синие круги — сделки на покупку, зеленые круги — направление сделки не определено.

    Лента сделок в MetaTrader 5

    Чем больше размер круга, тем больше объем совершенной сделки. Объемы сделок также показываются в виде гистограммы под тиковым графиком. В верхней и нижней части показываются общие объемы текущих предложений на покупку и на продажу.

  2. Покупать торговых роботов в Маркететеперь можно без регистрации на MQL5.com. Покупка происходит в один шаг — продукт оплачивается в одной из платежных систем прямо в самом терминале.


    Простые покупки в Маркете MetaTrader 5

  3. Появилась отладка экспертов и индикаторов на исторических данных. Ранее можно работу торговых приложений можно было проверить лишь на графиках в режиме реального времени. Теперь программа запускается на графике, который строится на смоделированной в тестере последовательности тиков.

    Для запуска визуального тестирования нужно лишь задать нужные параметры для отладки в настройках MetaEditor: символ, таймфрейм, интервал, режимы исполнения и генерации тиков, а также начальный депозит и плечо.

    Отладка экспертов и индикаторов на исторических данных

Полный список изменений в билде вы найдете здесь.

Чтобы проверить все эти нововведения на практике, необходимо обновить MetaTrader 5.

«Открытие Брокер» запускает MetaTrader 5 на фондовом рынке

$
0
0

16 декабря АО «Открытие Брокер» официально запустило торговую платформу MetaTrader 5 на фондовом рынке Московской Биржи. Более 60 000 клиентов одного из крупнейших российских брокеров получили возможность торговать ценными бумагами, используя все преимущества популярной платформы.

MetaTrader 5 на фондовом рынке Московской Биржи

В MetaTrader 5реализован мощнейший арсенал современных средств для трейдинга на фондовом рынке — технический и фундаментальный анализ, создание и запуск торговых роботов, тестирование торговых стратегий, написание собственных технических индикаторов и скриптов. Теперь все это стало доступно и фондовым трейдерам «Открытие Брокер» для операций с российскими акциями на Московской Бирже. Трейдеры, работающие на валютном рынке MOEX, начали использовать MetaTrader 5годом ранее — в ноябре 2014 года. Таким образом, в MetaTrader 5 теперь можно торговать на фондовом, срочном и валютном рынках Московской Биржи.

«Торговая платформа MetaTrader 5 традиционно пользуется заслуженной популярностью среди профессиональных трейдеров, предоставляя широкие торговые возможности работы с графиками и программирования. Однако, функционал программы до последнего времени был недоступен для пользователей, совершающих операции на фондовом рынке Московской Биржи. Теперь же данный пробел устранен, и мы рады предложить клиентам “Открытие Брокер” воспользоваться MetaTrader 5 с возможностью торговли российскими акциями. Уверен, что многие инвесторы и трейдеры не только оценят удобство и функциональность данной торговой платформы, но и смогут с ее помощью существенно улучшить свои торговые результаты», — говорит генеральный директор «Открытие Брокер» Юрий Минцев.

«Мы всегда рады расширению сотрудничества с нашими клиентами. Запуск одним из крупнейших российских брокеров платформы MetaTrader 5 на фондовом рынке Московской Биржи — это важное событие и для нас, и для клиентов “Открытие Брокер”. Год назад эта компания уже предоставила трейдерам возможность торговать на валютном рынке через MetaTrader 5. Убежден, что теперь пользователи оценят широкие возможности нашей платформы и для сделок с ценными бумагами», — добавляет Гайс Крейс, исполнительный директор компании MetaQuotes.

Открыть демо-счет на сайте «Открытие Брокер» >>

Торговая платформа MetaTrader 5 получила хеджирование

$
0
0

Сегодня компания MetaQuotes Software Corp. выпустила новую версию торговой платформы MetaTrader 5 build 1325. Главная ее особенность — появление хеджинговой системы учета позиций, которая уже знакома пользователям MetaTrader 4. Теперь в платформе можно использовать так называемое локирование, открывая встречные позиции по одному и тому же финансовому инструменту.

MetaTrader 5 с хеджированием

Разработчики устранили последний барьер для перехода трейдеров и брокеров на MetaTrader 5— отсутствие хеджирования. Это серьезно меняет расклад сил на рынке и причин оставаться на MetaTrader 4 больше нет. Трейдеры могут использовать привычное для себя локирование и в MetaTrader 5, получив доступ ко всем преимуществам более мощной и скоростной платформы.

«Зачем пользоваться двумя платформами, когда все можно делать в одной? — задается вопросом глава MetaQuotes Software Corp. Ренат Фатхуллин. — MetaTrader 5 не просто мультирыночная платформа, теперь она учитывает особенности этих рынков. Для фондовых трейдеров мы предлагаем неттинговую торговую систему, а для форекс-трейдеров — привычную хеджинговую».

Чат в MetaTrader 5 — общение с другими трейдерами прямо в платформе

В новом MetaTrader 5 также добавлена возможность тестирования торговых роботов и индикаторов по реальной тиковой истории. Это повышает точность отчетов о тестировании и оптимизации торговых роботов, и снижает риски потерь для трейдеров. Еще одно новшество MetaTrader 5 — встроенный чат. Прямо в платформе теперь можно общаться с другими трейдерами, обсуждать финансовые новости и торговые стратегии.

Обновленное руководство пользователя в MetaTrader 5

Кроме того, руководство пользователя стало намного полезнее. Этого удалось достичь за счет новой подачи материала: вместо текста теперь намного чаще используются иллюстрации, пояснительные схемы, интерактивные изображения и видеоролики. Объем текста уменьшился, но его информативность возросла.

Скачать новую версию MetaTrader 5 и протестировать хеджирование можно по ссылке.


Торгуйте в MetaTrader 5 прямо из браузера — бета-версия веб-платформы уже доступна

$
0
0

Сегодня запущена бета-версия мультирыночной веб-платформы MetaTrader 5. Вы можете опробовать новинку в торговле на валютном рынке прямо сейчас. Для этого достаточно иметь аккаунт на MQL5.communityи открыть демо-счет на MetaQuotes-Demo.

Торгуйте в MetaTrader 5 прямо из браузера — бета-версия веб-платформы уже доступна

Веб-платформа MetaTrader 5 позволяет торговать на финансовых рынках через любой браузер в любой операционной системе (Windows, Mac, Linux). Для этого не нужно устанавливать никаких программ, достаточно иметь доступ в интернет.

Веб-версия торговой платформы MetaTrader 5 была разработана по многочисленным просьбам брокерских компаний, желающих привлечь новых трейдеров. Новинка сочетает в себе удобство и кроссплатформенность веб-терминала с преимуществами десктопной «пятерки» — скоростью, мультирыночностью, расширенными торговыми функциями.

Уже в бета-версии вам доступны хеджинговая система учета позиций, 30 технических индикаторов, 24 аналитических объекта и полный набор торговых ордеров MetaTrader 5. А чтобы у пользователей веб-платформы MetaTrader 5 не возникло языковых барьеров, интерфейс приложения переведен на 41 язык.

Примите участие в публичном тестировании веб-платформы MetaTrader 5и первыми оцените ее возможности.

Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?

$
0
0

Для сравнения языков MQL5 и QLUA мы написали несколько тестов, которые замеряют скорость выполнения базовых операций.

В тестах использовался компьютер с Windows 7 Professional 64 bit, MetaTrader 5 build 1340 и QUIK версии 7.2.0.45.

Результаты представлены в таблице, где все значения представлены в миллисекундах (чем меньше время, тем лучше):

Название            MQL5        QLUA     Преимущество MQL5

TestFloat          3 969     273 391     69 раз
TestArrays           375     230 768    615 раз
TestFibo           1 125      61 110     55 раз
TestPiCalculated   2 328     183 812     79 раз
TestQuickSort      2 031     211 279    104 раза
TestAckermann        828      64 541     78 раз

Сравнение производительности MQL5 и QLUA, чем меньше, тем лучше
Сравнения показывают, что MQL5 быстрее QLUA от 50 до 600 раз на базовых операциях любого языка программирования. Это достигается за счет того, что MQL5 является строго типизированным компилируемым языком в 32/64 бита в противоположность динамическому интерпретируемому QLUA.

Что это дает трейдеру? Возможность максимально быстро обсчитывать огромные массивы данных (а они в MetaTrader 5 практически не ограничены) и быстрее принимать решения.

Это всего лишь проверка базового функционала. Но за фасадом языков скрываются их API. И не у всех он простой. MQL5, будучи прикладным языком для торговой платформы, содержит в себе сотни специализированных функций по доступу/обработке рыночной информации и взаимодействию со всеми компонентами терминала.

Важно, что MQL5 не прицеплен сбоку к существующей системе, а сам является центральным звеном платформы. Все процессы в торговом терминале построены вокруг удовлетворения потребностей разработчиков торговых роботов. Это дает максимальную скорость доступа к внутренним данным платформы и прямой канал для торговых операций.



Ниже приведены примеры скриптов и результаты тестирования, чтобы каждый мог убедиться в результатах. Полные архивы скриптов можно скачать по ссылке https://c.mql5.com/36/9/mql5-vs-qlua-benchmarks.zipи проверить самостоятельно.

 

TestFloat — Скорость выполнения операций с вещественными числами

Код на MQL5

//+------------------------------------------------------------------+
//|                                                    TestFloat.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---
#define MAX_SIZE 35000
//---
double f0=0;
double f1=123.456789;
double f2=98765.12345678998765432;
double f3=12345678943.98;
//---
//+------------------------------------------------------------------+
//| Функция OnStart                                                  |
//+------------------------------------------------------------------+
int OnStart()
  {
   uint tick_count,res;
//--- тест
   tick_count=GetTickCount();
   TestFloat();
   res=GetTickCount()-tick_count;
   Print("Test float time=",res," ms");
   Print("Result=",f0);
//--- возвращает время, затраченное на выполнение теста, в милисекундах
   return((int)res);
  }
//+------------------------------------------------------------------+
//| Функция тестирования                                             |
//+------------------------------------------------------------------+
void TestFloat()
  {
   for(int i=0;i<MAX_SIZE;i++)
      for(int j=0;j<MAX_SIZE;j++)
        {
         f0=f0+(f1/(i+1))-f2+(f3*i);
        }
  }
//+------------------------------------------------------------------+

Код на LUA

-- TestFloat
f0=0.0  
f1=123.456789
f2=98765.12345678998765432
f3=12345678943.98
MAX_SIZE=35000
function Start()
   local t=os.clock()
   TestFloat()
   local res=(os.clock()-t)*1000
   -- результы выполнения занесем сюда
   check=f0
   message("TestFloat time=" ..res.." ms\n  check="..tostring(check));
end

function TestFloat()
    -- в цикле мы проходим до значение на 1 меньше, чем MAX_SIZE
        MAX_SIZE=MAX_SIZE-1
        for i=0, MAX_SIZE do
        for j=0, MAX_SIZE do
            f0=f0+(f1/(i+1))-f2+(f3*i);
        end
    end
end
-- запускаем скрипт
Start()

Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?


TestArrays — Тестирование времени доступа к элементам массива

Код на MQL5

//+------------------------------------------------------------------+
//|                                                   TestArrays.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---
#define MAX_SIZE 32000
//---
int x[MAX_SIZE],y[MAX_SIZE];
//+------------------------------------------------------------------+
//| Функция OnStart                                                  |
//+------------------------------------------------------------------+
int OnStart()
  {
   int  i,k;
   uint tick_count,res;
//--- тест
   tick_count=GetTickCount();
   for(i=0;i<MAX_SIZE;i++)
      x[i]=i+1;

   for(k=0;k<MAX_SIZE;k++)
      for(i=MAX_SIZE-1; i>=0; i--)
         y[i]+=x[i];
   long check=0;
   for(i=0;i<MAX_SIZE;i++)
     {
      check+=y[i];
     }          
   res=GetTickCount()-tick_count;
   Print("TestArrays time=",res," ms");
      Print("check=",check);
//--- возвращает время, затраченное на выполнение теста, в милисекундах
   return((int)res);
  }
//+------------------------------------------------------------------+

Код на LUA

-- TestArrays
function Start()
        MAX_SIZE=32000
    x={}
    y={}
    local start=os.clock()
    for i=1,MAX_SIZE,1 do
      x[i]=i
      y[i]=0
    end  
    y[MAX_SIZE]=0
    for k=1,MAX_SIZE,1 do
        for i=MAX_SIZE, 1,-1 do         
            y[i]=y[i]+x[i]
        end
    end
    local res=(os.clock()-start)*1000
    -- контрольное число
    local check=0
    for k=1,MAX_SIZE,1 do
        check=check+y[k]
    end
    message("Time = "..res.." ms\n  check=".. check)
end
-- запускаем скрипт
Start()

Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?


TestFibo — вычисление последовательности ряда Фибоначии

Код на MQL5

//+------------------------------------------------------------------+
//|                                                     TestFibo.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---
#define MAX_SIZE 40
long fib[MAX_SIZE];
//+------------------------------------------------------------------+
//| Функция OnStart                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int  i;
   uint res;
//--- тест
   res=GetTickCount();
   for(i=0;i<MAX_SIZE;i++)
      fib[i]=TestFibo(i);
   res=GetTickCount()-res;
   Print("TestFibo time=",res," ms");
   Print("Fibo[39]=",fib[39]);
  }
//+------------------------------------------------------------------+
//| Функция тестирования                                             |
//+------------------------------------------------------------------+
long TestFibo(long n)
  {
   if(n<2) return(1);
//---
   return(TestFibo(n-2)+TestFibo(n-1));
  }
//+------------------------------------------------------------------+

Код на LUA

-- TestFibo
MAX_SIZE=40
fib={}
function Start()
   start=os.clock()
   for i=0,MAX_SIZE-1 do
     fib[i]=TestFibo(i)
   end
   res=(os.clock()-start)*1000
   message("TestFibo time="..res.." ms\n Fibo[39]="..fib[39])
end

function TestFibo(n)
   if n<2 then
      return(1)
   else
      return(TestFibo(n-2)+TestFibo(n-1))
   end
end
-- запускаем скрипт
Start()

Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?


TestPiCalculated -  Вычисление 22 000 знаков числа Pi

Код на MQL5

//+------------------------------------------------------------------+
//|                                             TestPiCalculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---
#define MAX_SIZE 22000
//--- в эту строку поместим значение числа PI
string str;
int    a[(MAX_SIZE/4+1)*14];
//+------------------------------------------------------------------+
//| Функция OnStart                                                  |
//+------------------------------------------------------------------+
int OnStart()
  {
   uint tick_count,res;
//--- тест
   tick_count=GetTickCount();
   PiCalculate(MAX_SIZE);
   res=GetTickCount()-tick_count;
   Print("TestPiCalculated time=",res," ms");
   Print("Pi=",StringSubstr(str,0,16));
//--- возвращает время, затраченное на выполнение теста, в милисекундах
   return((int)res);
  }
//+------------------------------------------------------------------+
//| Функция тестирования                                             |
//+------------------------------------------------------------------+
void PiCalculate(const int digits)
  {
   int d = 0,e,b,g,r;
   int c = (digits/4+1)*14;
   int f = 10000;
//---
   for(int i=0;i<c;i++)
      a[i]=20000000;
//---
   while((b=c-=14)>0)
     {
      d=e=d%f;
      while(--b>0)
        {
         d = d * b + a[b];
         g = (b << 1) - 1;
         a[b]=(d%g)*f;
         d/=g;
        }
      r=e+d/f;
      if(r<1000)
        {
         if(r>99)
            str+="0";
         else
           {
            if(r>9)
               str+="00";
            else
               str+="000";
           }
        }
      str+=IntegerToString®;
     }
  }
//+------------------------------------------------------------------+

Код на LUA

-- TestPiCalculated
-- сколько знаков числа Pi будем вычислять
MAX_SIZE=22000
-- в эту строку поместим значение числа Pi
str=""
a={}
function OnStart()
        start=os.clock()
        PiCalculate(MAX_SIZE)
        -- время вычисления числа Pi в миллисекундах
        res=(os.clock()-start)*1000
        message("TestPiCalculated time=" .. res .." ms\n\n Pi="..string.sub(str,1,16)) -- выведем 16 знаков
end
function PiCalculate(digits)
        d = 0
        c = (math.floor(digits/4)+1)*14  -- math.floor() -целочисленное деление на основе примера из справки LUA
        f = 10000

        for i=0,c do
                a[i]=20000000
        end
        c=c-14
        b=c
        while b>0 do
                e=d%f
                d=e
                while b-1>0 do
                        b=b-1
                        d = d * b + a[b]
                        g = (b * 2) - 1
                        a[b]=(d%g)*f  
            d=math.floor(d/g)  -- math.floor(d/g) -целочисленное деление на основе примера из справки LUA
        end
        r=e+math.floor(d/f)  -- math.floor(d/f) - это целочисленное деление на основе примера из справки LUA
                if r<1000 then
                        if(r>99) then 
                                str=str .. "0"
                        else
                                if(r > 9) then
                                        str=str .. "00"
                                else
                                        str=str .. "000"
                                end
                        end
                end
                str=str .. string.format("%d",r)
                c=c-14
                b=c
        end
end
-- запускаем скрипт
OnStart()

Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?


Тестирование времени быстрой сортировки массива

Код на MQL5

//+------------------------------------------------------------------+
//|                                                TestQuickSort.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- будем сортировать массив размером в 16 миллионов элементов
#define MAX_SIZE 16000000
//---
int array[MAX_SIZE];
//+------------------------------------------------------------------+
//| Функция OnStart                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   uint tick_count,res;
   for(int i=0;i<MAX_SIZE;i++)
      array[i]=i%100;
   tick_count=GetTickCount();
   QuickSort(array,0,MAX_SIZE-1);
   res=GetTickCount()-tick_count;
   Print("TestQuickSort time=",res," ms");

   for(int i=1;i<MAX_SIZE;i++)
      if(array[i]<array[i-1])
        {
        Print("Array not sorted");
        break;
        }
  }
//+------------------------------------------------------------------+
//| Функция быстрой сортировки                                       |
//+------------------------------------------------------------------+
void QuickSort(int &arr[],int left,int right)
  {
   int i=left;
   int j=right;
   int center=arr[(i+j)/2];
   int x;
//---
   while(i<=j)
     {
      while(arr[i]<center && i<right) i++;
      while(arr[j]>center && j>left) j--;
      if(i<=j)
        {
         x=arr[i];
         arr[i]=arr[j];
         arr[j]=x;
         i++;
         j--;
        }
     }
   if(left<j) QuickSort(arr,left,j);
   if(right>i) QuickSort(arr,i,right);
  }
//+------------------------------------------------------------------+

Код на LUA

-- TestQuickSort
-- будем сортировать массив размером в 16 миллионов элементов
MAX_SIZE=16000000
array={}
function Start()
    for i=0,MAX_SIZE-1 do
        array[i]=i%100
    end
    start=os.clock()
    QuickSort(array,0,MAX_SIZE-1)
    res=(os.clock()-t)*1000
    message("TestQuickSort time=" .. res .. " ms")
    for i=1,MAX_SIZE-1 do
        if array[i]<array[i-1] then
            message("Array not sorted");
            break;
        end
    end
end

function QuickSort(arr,left,right)
    i=left
    j=right
    center=arr[math.floor((i+j)/2)]
    while i<=j do
        while(arr[i]<center and i<right) do
            i=i+1
        end
        while(arr[j]>center and j>left) do
            j=j-1
        end
        if i<=j then
            x=arr[i]
            arr[i]=arr[j]
            arr[j]=x
            i=i+1
            j=j-1
        end
    end
    if left<j then 
        QuickSort(arr,left,j)
    end
    if right>i then 
        QuickSort(arr,i,right)
    end
end
-- запускаем скрипт
Start()

 Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?

 

TestAckermann — тестирование рекурсии в функциях

Код на MQL5

//+------------------------------------------------------------------+
//|                                                TestAckermann.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- количество прогонов функции Аккермана в цикле
#define MAX_SIZE 120000
//+------------------------------------------------------------------+
//| Функция OnStart                                                  |
//+------------------------------------------------------------------+
void  OnStart()
  {
//--- контрольное число
   uint check=0;
//--- время выполнения в миллисекундах
   uint res=0;
//--- тест
   res=GetTickCount();
   for(int i=0;i<MAX_SIZE;i++)
      check+=Ackermann(1+i%3,1+i%5);
   res=GetTickCount()-res;
   Print("TestAckermann time=",res," ms");
   Print("check=",check);
//---
  }
//+------------------------------------------------------------------+
//| Функция тестирования                                             |
//+------------------------------------------------------------------+
int Ackermann(int m,int n)
  {
   if(m==0) return(n+1);
   if(n==0) return(Ackermann(m-1,1));
//---
   return(Ackermann(m-1,Ackermann(m,(n-1))));
  }
//+------------------------------------------------------------------+

Код на LUA

-- TestAckermann
MAX_SIZE=120000
function Start()        
    local check=0 -- контрольное число
    local start=os.clock()
        for i=1,MAX_SIZE do
             check=check+Ackermann(1+i%3,1+i%5);                                                
        end 
    local finish=os.clock()
    local time=(finish-start)*1000
    message("TestAckermann time=".. time.." ms\n\n check="..check)
end

function Ackermann(m,n)
        if(m==0) then return(n+1) end
        if(n==0) then return(Ackermann(m-1,1)) end
        return(Ackermann(m-1,Ackermann(m,(n-1))))
end
-- запускаем скрипт
Start()

Битва за скорость: QLUA vs MQL5 - почему MQL5 быстрее от 50 до 600 раз?



Как создать торгового робота для Московской биржи MOEX на MetaTrader 5?

$
0
0

Многие трейдеры на Московской бирже хотели бы автоматизировать свои торговые алгоритмы, но не знают с чего начать. А ведь давно есть проработанные решения, которые максимально облегчают первые шаги в алготрейдинге.

 

Торговать на бирже с помощью роботов — это просто

Язык MQL5 изначально поддерживает все торговые возможности платформы MetaTrader 5 — в нем множество торговых функцийдля работы с ордерами, позициями и торговыми запросами. При этом не имеет значения, на каком рынке вы торгуете -  фьючерсы, акции, опционы и т.д.

Средствами MQL5 вы можете создать торговый запроси отослать его на сервер с помощью функций OrderSend()или OrderSendAsync(), получить результат его выполнения, просмотреть торговую историю, узнать спецификацию контрактадля инструмента, обработать торговое событиеи получить еще множество другой необходимой информации.


MetaTrader 5 предлагает 6 типов торговых операций

Существует несколько основных типов торговых операций, которые вам могут понадобиться в торговом роботе:

  1. покупка/продажа по текущей цене,
  2. установка отложенного ордера на покупку/продажу по некоторому условию,
  3. модификация/удаление отложенного ордера,
  4. закрытие/наращивание/сокращение/переворот позиции.

Все эти операции реализуются с помощью функции OrderSend(), существует также и асинхронный вариант этой функции — OrderSendAsync(). Всё многообразие торговых операций описывается структурой MqlTradeRequest, содержащей описание торгового запроса. Поэтому единственные трудности с торговыми операциями могут заключаться только в правильном заполнении структуры MqlTradeRequest и обработке результата выполнения запроса.

В соответствии с правилами вашей торговой системы вы можете совершить покупку или продажу по цене рынка (BUY или SELL), а можете поместить отложенный ордер на совершение покупки/продажи на некотором расстоянии от текущей цены рынка:

  • BUY STOP, SELL STOP — покупка или продажа при пробитии указанного уровня (хуже текущей цены);
  • BUY LIMIT, SELL LIMIT — покупка или продажа при достижении указанного уровня (лучше текущей цены);
  • BUY STOP LIMIT, SELL STOP LIMIT — установка ордера BUY LIMIT или SELL LIMIT при достижении указанной цены.

Типы этих стандартных ордеров соответствуют перечислению ENUM_ORDER_TYPE

Как создать торгового робота для Московской биржи MOEX на MetaTrader 5?

 

Кроме  того, вам может понадобиться модифицировать или вовсе удалить отложенный ордер, это также делается с помощью функций OrderSend()/OrderSendAsync(). Изменение открытой позиций тоже не представляет сложности, так как происходит в результате совершения всё тех же торговых операций.

В этой статье мы покажем не только, как легко и просто программировать покупки и продажи в MQL5, но также подскажем, как работать с торговым счетом и свойствами символов. В этом нам помогут торговые классыСтандартной библиотеки.

 

Работа с торговым счетом

Первым делом при запуске торгового робота в дело необходимо получить информацию о торговом счете, на котором он будет торговать.

Для работы со счетом есть класс CAccountInfo, который как раз и разрабатывался для этих целей. Добавим в наш код подключение файла  AccountInfo.mqh и объявим переменную этого класса account:

#include <Trade\AccountInfo.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объект для работы со счетом
  CAccountInfo account;
//--- получим номер счета, на котором запущен советник
   long login=account.Login();
   Print("Login=",login);
//--- выведем валюту счета    
   Print("Валюта счета: ",account.Currency());   
//--- выведем баланс и текущую прибыль на счете
   Print("Balance=",account.Balance(),"  Profit=",account.Profit(),"   Equity=",account.Equity());
//--- выведем тип счета    
   Print("Тип счета: ",account.TradeModeDescription());
//--- выясним, можно ли вообще торговать на данном счете
   if(account.TradeAllowed())
      Print("Торговля на данном счете разрешена");
   else
      Print("Торговля на счете запрещена: возможно, вход был совершен по инвест-паролю");
//--- режим вычисления маржи
   Print("Режим вычисления маржи: ",account.MarginModeDescription());
//--- выясним, разрешено ли торговать на счете с помощью эксперта
   if(account.TradeExpert())
      Print("Автоматическая торговля на счете разрешена");
   else
      Print("Запрещена автоматическая торговля с помощью экспертов и скриптов");
//--- допустимое количество ордеров задано или нет
   int orders_limit=account.LimitOrders();
   if(orders_limit!=0)Print("Максимально допустимое количество действующих отложенных ордеров: ",orders_limit);
//--- выведем имя компании и сервера
   Print(account.Company(),": server ",account.Server());
   Print(__FUNCTION__,"  completed"); //---   
  }

Как видно из приведенного кода, с помощью переменной accountв функции OnInit() можно получить много полезной информации. Вы можете добавить этот код в своего эксперта и вам будет гораздо проще разбирать логи при анализе его работы.

Результат запуска скрипта показан на картинке.

Как создать торгового робота для Московской биржи MOEX на MetaTrader 5?

 

Получение свойств финансового инструмента

Информацию о счете мы получили, но для совершения торговых операций нужно знать еще свойства актива, по которому мы собираемся торговать. Для этого предназначен еще один удобный класс CSymbolInfoс большим количеством методов. Мы приведем в примере только небольшую их часть.

#include<Trade\SymbolInfo.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объект для получения свойств символа
  CSymbolInfo symbol_info;
//--- зададим имя символа, для которого будем получать информацию
   symbol_info.Name(_Symbol);
//--- получим текущие котировки и выведем
   symbol_info.RefreshRates();
   Print(symbol_info.Name()," (",symbol_info.Description(),")",
         "  Bid=",symbol_info.Bid(),"   Ask=",symbol_info.Ask());
//--- получим количество знаков после запятой и размер пункта
   Print("Digits=",symbol_info.Digits(),
         ", Point=",DoubleToString(symbol_info.Point(),symbol_info.Digits()));
//--- запросим тип исполнения ордеров, нет ли ограничений
   Print("Ограничения на торговые операции: ",EnumToString(symbol_info.TradeMode()),
         " (",symbol_info.TradeModeDescription(),")");
//--- выясним режим заключения сделок
   Print("Режим исполнения сделок: ",EnumToString(symbol_info.TradeExecution()),
         " (",symbol_info.TradeExecutionDescription(),")");
//--- выясним способ вычисления стоимости контрактов
   Print("Вычисление стоимости контракта: ",EnumToString(symbol_info.TradeCalcMode()),
         " (",symbol_info.TradeCalcModeDescription(),")");
//--- размер контракта
   Print("Размер стандартного контракта: ",symbol_info.ContractSize());
//--- размер начальной маржи для 1 контракта
   Print("Начальная маржа для стандартного контракта: ",symbol_info.MarginInitial()," ",symbol_info.CurrencyBase());
//--- минимальный, максимальный размеры объема в торговых операциях
   Print("Volume info: LotsMin=",symbol_info.LotsMin(),"  LotsMax=",symbol_info.LotsMax(),
         "  LotsStep=",symbol_info.LotsStep());
//--- 
   Print(__FUNCTION__,"  completed");   
  }

И на рисунке показаны свойства символа Si-6.16 из секции срочного рынка Московской биржи (FORTS). Теперь вы готовы перейти непосредственно к торговле.

Как создать торгового робота для Московской биржи MOEX на MetaTrader 5?

 

Программирование торговых операций

Для отправки торговых приказов в языке MQL5 существует две функции — OrderSend() и OrderSendAsync(). На самом деле это две реализации одной функции. Если OrderSend() отправляет торговый запрос и ждет результата его выполнения, то асинхронная OrderSendAsync() просто выстреливает запрос и позволяет работать программе дальше, не дожидаясь ответа торгового сервера. Таким образом, торговать в MQL5 действительно просто, достаточно использовать только одну функцию для всех торговых операций

Обе функции получают в качестве первого параметра структуру MqlTradeRequest, которая содержит более десятка полей. Состав требуемых полей зависит от типа торговой операции, поэтому не все поля требуется заполнять. В случае неправильного значения или отсутствия обязательного поля запрос не пройдет проверку в самом терминале и просто не будет отправлен на сервер. При этом 5 из этих полей требуют указания корректного значения из предопределенных перечислений.

Столь большое количество полей торгового запроса вызвано необходимостью описать множество свойств ордера, которые могут меняться в зависимости от политики исполнения, времени истечения и некоторых других параметров. Вам не понадобится заучивать все эти тонкости, просто используйте готовый класс CTrade. Вот так примерно может выглядеть использование этого класса в вашем торговом роботе:

#include<Trade\Trade.mqh>
//--- объект для проведения торговых операций
CTrade  trade;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- зададим MagicNumber для идентификации своих ордеров
   int MagicNumber=123456;
   trade.SetExpertMagicNumber(MagicNumber);
//--- установим допустимое проскальзывание в пунктах при совершении покупки/продажи
   int deviation=10;
   trade.SetDeviationInPoints(deviation);
//--- режим заполнения ордера, нужно использовать тот режим, который разрешается сервером
   trade.SetTypeFilling(ORDER_FILLING_RETURN);
//--- режим логирования: лучше не вызывать этот метод вообще, класс сам выставит оптимальный режим
   trade.LogLevel(1); 
//--- какую функцию использовать для торговли: true - OrderSendAsync(), false - OrderSend()
   trade.SetAsyncMode(true);
//---
   return(0);
  }

Для торговли на бирже как правило используется режим исполнения ORDER_FILLING_RETURN. Справка гласит:

Данный режим используется только в режимах«Исполнение по рынку» и «Биржевое исполнение»: для рыночных (ORDER_TYPE_BUY и ORDER_TYPE_SELL), лимитных и стоп-лимитных ордеров (ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP_LIMIT и ORDER_TYPE_SELL_STOP_LIMIT). В случае частичного исполнения рыночный или лимитный ордер с остаточным объемом не снимается, а продолжает действовать.

Для ордеров ORDER_TYPE_BUY_STOP_LIMIT и ORDER_TYPE_SELL_STOP_LIMIT при активации будет создан соответствующий лимитный ордер ORDER_TYPE_BUY_LIMIT/ORDER_TYPE_SELL_LIMIT с типом исполнения ORDER_FILLING_RETURN.

 

Ну а теперь пришло время посмотреть, как CTrade помогает в торговых операциях.

Покупка/продажа по текущей цене

Часто в торговых стратегиях необходимо совершить покупку или продажу по текущей цене прямо сейчас. CTrade знаком с такой ситуацией и просит лишь необходимый объем торговой операции. Все остальные параметры — цену открытия и название символа, уровни Stop Loss и Take Profit, комментарий к ордеру — можно не указывать.

//--- 1. пример покупки по текущему символу
   if(!trade.Buy(1))
     {
      //--- сообщим о неудаче
      Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

По умолчанию если имя инструмента не указано, CTrade будет использовать имя символа, на графике которого он запущен. Это очень удобно для простых стратегий. Для робота, который торгует сразу на нескольких инструментах,  вам необходимо каждый раз явно указывать символ, по которому будет проводиться торговая операция.

//--- 2. пример покупки по указанному символу
   if(!trade.Buy(1,"Si-6.16"))
     {
      //--- сообщим о неудаче
      Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Можно указать все параметры ордера: уровни Stop Loss/Take Profit, цена открытия и комментарий.

//--- 3. пример покупки по указанному символу символу с заданными SL и TP
   double volume=1;           // укажем объем торговой операции
   string symbol="Si-6.16";   // укажем символ, на котором проводится операция
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // текущая цена для закрытия LONG
   double SL=bid-100*point;                                    // ненормализованное значение SL
   SL=NormalizeDouble(SL,digits);                              // нормализуем Stop Loss
   double TP=bid+100*point;                                    // ненормализованное значение TP
   TP=NormalizeDouble(TP,digits);                              // нормализуем Take Profit
//--- получим текущую цену открытия для LONG позиций
   double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK);
   string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(open_price,digits),
                               DoubleToString(SL,digits),
                               DoubleToString(TP,digits));
   if(!trade.Buy(volume,symbol,open_price,SL,TP,comment))
     {
      //--- сообщим о неудаче
      Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Напомним, MagicNumber и допустимое проскальзывание мы задали при инициализации экземпляра CTrade, поэтому они не требуются. Хотя их тоже можно задавать непосредственно перед каждой торговой операцией, если это необходимо.

Выставление лимитного ордера

Для отправки лимитного ордера используется соответствующий метод класса BuyLimit()или SellLimit(). Для большинства случаев может подойти укороченный вариант, когда указываются только цена открытия и объем. Цена открытия для BuyLimit должна быть ниже текущей цены, а для SellLimit должна быть выше. То есть эти ордера используются для входа в рынок по лучшей цене, например, в стратегиях с расчетом на отскок от уровня поддержки. При этом используется тот символ, на котором запущен эксперт:

//--- 1. пример установки отложенного ордера BuyLimit
   string symbol="Si-6.16";                                    // укажем символ, на котором выставляется ордер
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);             // текущая цена покупки
   double price=ask-100*point;                                 // ненормализованное цена открытия
   price=NormalizeDouble(price,digits);                        // нормализуем цену открытия
//--- все готово, отправляем на сервер отложенный ордер Buy Limit
   if(!trade.BuyLimit(1,price))
     {
      //--- сообщим о неудаче
      Print("Метод BuyLimit() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод BuyLimit() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Можно использовать и более подробный вариант с указанием всех параметров: уровни SL/TP, время истечения, название инструмента и комментарий к ордеру.

//--- 2. пример установки отложенного ордера BuyLimit со всеми параметрами
   double volume=1;
   string symbol="Si-6.16";                                    // укажем символ, на котором выставляется ордер
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);             // текущая цена покупки
   double price=ask-100*point;                                 // ненормализованное цена открытия
   price=NormalizeDouble(price,digits);                        // нормализуем цену открытия
   int SL_pips=100;                                            // Stop Loss в пунктах
   int TP_pips=100;                                            // Take Profit в пунктах
   double SL=price-SL_pips*point;                              // ненормализованное значение SL
   SL=NormalizeDouble(SL,digits);                              // нормализуем Stop Loss
   double TP=price+TP_pips*point;                              // ненормализованное значение TP
   TP=NormalizeDouble(TP,digits);                              // нормализуем Take Profit
   datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);
   string comment=StringFormat("Buy Limit %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(price,digits),
                               DoubleToString(SL,digits),
                               DoubleToString(TP,digits));
//--- все готово, отправляем на сервер отложенный ордер Buy Limit
   if(!trade.BuyLimit(volume,price,symbol,SL,TP,ORDER_TIME_DAY,expiration,comment))
     {
      //--- сообщим о неудаче
      Print("Метод BuyLimit() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод BuyLimit() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Во втором варианте необходимо правильно указать уровни SL и TP. Не забывайте, что для покупок уровень Take Profit должен быть выше цены открытия, а уровень Stop Loss — ниже цены открытия. Для ордеров SellLimit всё наоборот. Вы легко можете узнать о своей ошибке при тестировании эксперта на исторических данных, класс CTrade автоматическивыводит в таких случаях сообщения (если вы сами не вызывали функцию LogLevel).

 

Выставление стопового ордера

Для отправки стопового ордера используются аналогичные методы BuyStop()и SellStop(). Цена открытия для Buy Stop должна быть выше текущей цены, а для SellStop должна быть ниже. Стоповые ордера используются в стратегиях, которые входят на прорыве некоего уровня сопротивления, а также для ограничения убытков. Простой вариант:

//--- 1. пример установки отложенного ордера Buy Stop
   string symbol="RTS-6.16";    // укажем символ, на котором выставляется ордер
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);             // текущая цена покупки
   double price=ask+100*point;                                 // ненормализованное цена открытия
   price=NormalizeDouble(price,digits);                        // нормализуем цену открытия
//--- все готово, отправляем на сервер отложенный ордер Buy Stop 
   if(!trade.BuyStop(1,price))
     {
      //--- сообщим о неудаче
      Print("Метод BuyStop() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод BuyStop() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

И более подробный, когда нужно указать максимум параметров для отложенного ордера BuyStop:

//--- 2. пример установки отложенного ордера Buy Stop со всеми параметрами
   double volume=1;
   string symbol="RTS-6.16";    // укажем символ, на котором выставляется ордер
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);             // текущая цена покупки
   double price=ask+100*point;                                 // ненормализованное цена открытия
   price=NormalizeDouble(price,digits);                        // нормализуем цену открытия
   int SL_pips=100;                                            // Stop Loss в пунктах
   int TP_pips=100;                                            // Take Profit в пунктах
   double SL=price-SL_pips*point;                              // ненормализованное значение SL
   SL=NormalizeDouble(SL,digits);                              // нормализуем Stop Loss
   double TP=price+TP_pips*point;                              // ненормализованное значение TP
   TP=NormalizeDouble(TP,digits);                              // нормализуем Take Profit
   datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);
   string comment=StringFormat("Buy Stop %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(price,digits),
                               DoubleToString(SL,digits),
                               DoubleToString(TP,digits));
//--- все готово, отправляем на сервер отложенный ордер Buy Stop 
   if(!trade.BuyStop(volume,price,symbol,SL,TP,ORDER_TIME_DAY,expiration,comment))
     {
      //--- сообщим о неудаче
      Print("Метод BuyStop() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод BuyStop() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Для отправки ордера SellStop применяется соответствующий метод класса CTrade, главное — правильно указывать цены.

Работа с позицией

Вы можете вместо использования методов Buy() и Sell() пользоваться методами для открытия позиции. Правда, в этом случае придется указать больше деталей:

//--- количество знаков после запятой
   int    digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- значение пункта
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- получим цену покупки
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- вычислим и нормализуем уровни SL и TP
   double SL=NormalizeDouble(price-100*point,digits);
   double TP=NormalizeDouble(price+100*point,digits);
//--- заполним комментарий
   string comment="Buy "+_Symbol+" 1 at "+DoubleToString(price,digits);
//--- все готово, делаем попытку открыть позицию на покупку
   if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,1,price,SL,TP,comment))
     {
      //--- сообщим о неудаче
      Print("Метод PositionOpen() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод PositionOpen() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Для закрытия позиции достаточно указать имя инструмента, остальное класс CTrade сделает сам.

//--- закрываем позицию по текущему символу
   if(!trade.PositionClose(_Symbol))
     {
      //--- сообщим о неудаче
      Print("Метод PositionClose() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод PositionClose() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

У открытой позиции можно изменять уровни StopLoss и TakeProfit. Это делается с помощью метода ModifyPosition().

//--- количество знаков после запятой
   int    digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- значение пункта
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- получим текущую цену Bid
   double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
//--- вычислим и нормализуем уровни SL и TP
   double SL=NormalizeDouble(price-100*point,digits);
   double TP=NormalizeDouble(price+100*point,digits);
//--- все готово, делаем попытку модифицировать позицию на покупку
   if(!trade.PositionModify(_Symbol,SL,TP))
     {
      //--- сообщим о неудаче
      Print("Метод PositionModify() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод PositionModify() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Модификация и удаление ордера

Для изменения параметров отложенного ордера в классе CTrade предусмотрен метод OrderModify(), которому необходимо передать все требуемые параметры.

//--- проверим наличие ордера  
   if(!OrderSelect(ticket))
     {
      Print("Ордер #",ticket," не найден");
      return;
     }
//--- символ 
   string symbol=OrderGetString(ORDER_SYMBOL);
//--- количество знаков после запятой
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- значение пункта
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
//--- получим цену открытия
   double price=OrderGetDouble(ORDER_PRICE_OPEN);
//--- вычислим и нормализуем уровни SL и TP
   double SL=NormalizeDouble(price-200*point,digits);
   double TP=NormalizeDouble(price+200*point,digits);
//--- все готово, делаем попытку модифицировать ордер 
//   if(!trade.OrderModify(ticket,price,SL,TP,(ENUM_ORDER_TYPE_TIME)OrderGetInteger(ORDER_TYPE_TIME),0))

   if(!trade.OrderModify(ticket,price,SL,TP,ORDER_TIME_DAY,0))
     {
      //--- сообщим о неудаче
      Print("Метод OrderModify() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод OrderModify() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Вам необходимо получить тикет ордера, который необходимо изменить, и в зависимости от его типа указать правильные уровни StopLoss и TakeProfit. Кроме того, новая цена открытия должна быть также корректной по отношению к текущей цене.

Для удаления отложенного ордера достаточно знать его тикет:

//--- проверим наличие ордера  
   if(!OrderSelect(ticket))
     {
      Print("Ордер #",ticket," не найден");
      return;
     }
//--- все готово, делаем попытку удалить ордер
   if(!trade.OrderDelete(ticket))
     {
      //--- сообщим о неудаче
      Print("Метод OrderDelete() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод OrderDelete() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

В классе также есть универсальный метод OrderOpen(), который может выставлять отложенные ордера любого типа. В отличие от специализированных методов BuyLimit, BuyStop, SellLimitи SellStop, он требует указывать больше обязательных параметров. Возможно, кому-то он покажется более удобным.


Что еще посмотреть в торговых классах

В этой статье мы показали простые приемы для программирования торговых операций покупки и продажи, а также работу с отложенными ордерами. Но в разделе Торговые классы есть еще несколько удобных помощников для разработчиков роботов на MQL5:

  • COrderInfo— для работы с ордерами;
  • CHistoryOrderInfo— для работы с отработанными ордерами, попавшими в историю торговли;
  • CPositionInfo— для работы с позициями;
  • CDealInfo— для работы со сделками;
  • CTerminalInfo— для получения информации о самом терминале.

С помощью этих классов вы можете сосредоточиться только на торговой стороне вашей стратегии, сведя все технические вопросы к минимуму. Кроме того, класс CTrade можно использовать для изучения торговых запросов, например, под отладкой. И со временем вы можете создать на его основе собственные классы, в которых реализуете необходимую вам логику по обработке результатов выполнения торгового запроса.

Начните свой путь в алготрейдинг с простых скриптов

Предложенные в статье способы по разработке торговых роботов на MQL5 предназначены в первую очередь новичкам, хотя многие опытные разработчики также могут найти для себя что-то новое и полезное.

Начните с выполнения простых скриптов (https://c.mql5.com/36/9/mql5-moex-first-steps.zip), и вы поймете, что создать торгового робота гораздо проще, чем вы думали!

Лента сделок в MetaTrader 5: новый инструмент для анализа фондового рынка

$
0
0

На днях был выпущен релиз торговой платформы MetaTrader 5 build 1375 с лентой сделок (Time & Sales) в стакане цен.

Лента сделок позволяет видеть список всех биржевых торговых операций в режиме реального времени. По каждой сделке показывается ее время, направление, цена и объем. Каждое направление выделяется отдельным цветом, а объемы даны в виде гистограммы:

Лента сделок в MetaTrader 5: новый инструмент для анализа фондового рынка

Из ленты можно экспортировать данные в формате CSV и анализировать в сторонних редакторах электронных таблиц.

Если у вас не произошло автоматическое обновление через вашего брокера, попробуйте обновиться через демо счет на сервере MetaQuotes-Demo. Для этого просто добавьте MetaQuotes-Demo в список серверов и откройте там демо-счет:

Лента сделок в MetaTrader 5: новый инструмент для анализа фондового рынка

Полный список изменений 1375 билда: http://www.metatrader5.com/ru/releasenotes

Новый шлюз к Interactive Brokers для MetaTrader 5 от MetaQuotes и oneZero — это торговля на 130 фондовых биржах мира, включая NASDAQ и NYSE

$
0
0

Мы вместе с oneZero Financial Systemsвыпустили шлюз интеграции с Interactive Brokers Group, Inc. С его помощью в MetaTrader 5 можно торговать акциями, фьючерсами и другими биржевыми инструментами на крупнейших фондовых биржах мира: Нью-Йоркской (NYSE), Лондонской (LSE), Гонконгской (HKEX), Токийской (TSE), NASDAQ и пр.

Новый шлюз к Interactive Brokers для MetaTrader 5 от MetaQuotes и oneZero — это торговля на 130 фондовых биржах мира, включая NASDAQ и NYSE

Помимо ценных бумаг и фьючерсов, шлюз позволяет торговать валютными парами, контрактами на разницу и драгоценными металлами с поддержкой стакана цен для соответствующих инструментов. Кроме того, с помощью шлюза брокеры могут автоматически производить корпоративные действия по определенной ценной бумаге (например, начислять дивиденды) сразу по всем трейдерам, имеющим открытые позиции по данному инструменту. На сайте американского брокера можно ознакомиться с полным списком символови бирж, доступ к которым обеспечивает новый продукт (в MetaTrader 5 можно торговать всем, кроме опционов).

Отметим важное преимущество шлюза Interactive Brokers для брокеров: компании, использующие этот продукт, получают доступ к различным биржам по единому соединению без необходимости напрямую подключаться к этим биржам или биржевым клиринг-агентам. Для приобретения шлюза oneZero Hub для MetaTrader 5 необходимо обратиться в компанию oneZero Financial Systems. Для работы также потребуется активный счет от компании Interactive Brokers.

Новый шлюз к Interactive Brokers для MetaTrader 5 от MetaQuotes и oneZero — это торговля на 130 фондовых биржах мира, включая NASDAQ и NYSE

“Мы в oneZero были рады работать над этой важной и долгожданной интеграцией напрямую с компанией MetaQuotes Software, — комментирует партнерство генеральный директор oneZero Эндрю Ралич. — В результате тесного взаимодействия с компаниями MetaQuotes Software и Interactive Brokers мы выпустили действительно востребованный шлюз для MetaTrader 5 на основе нашего продукта Hub и существующей технологической платформы. Интеграция с Interactive Brokers предоставляет дополнительные институциональные возможности к уже имеющимся в платформе MetaTrader 5, например, к использованию стакана цен”.

«Выпуск шлюза oneZero для интеграции с Interactive Brokers — это важный прогрессивный шаг для MetaTrader 5, — убежден генеральный директор MetaQuotes Software Corp. Ренат Фатхуллин. — Теперь у миллионов пользователей нашей платформы появилась уникальная возможность торговать ценными бумагами и фьючерсами международных корпораций на пятнадцати из двадцати крупнейших фондовых бирж мира!»

Выпущен новый шлюз MetaTrader 5 Gateway to CQG от Forexware

$
0
0

Мы расширяем торговые возможности мультирыночной платформы MetaTrader 5: вслед за релизом шлюза к Interactive Brokers выпущен шлюз к платформе CQG.

Приложение разработано компанией Forexware и предоставляет прямой доступ на международные биржи CME, CBOT, NYMEX, ICE, EUREX и десятки других.
MetaTrader 5 Gateway to CQG от Forexware
Спектр торгуемых на этих площадках инструментов максимально широк — от фьючерсов и опционов до индексов и биржевых спредов (counter spread). Причем для всех этих инструментов шлюз поддерживает стакан цен (market depth).

CQG, Inc.более 15 лет поставляет котировки мировым банкам, инвестиционным компаниям, брокерам и другим крупнейшим участникам финансового мира. Обладая собственной инфраструктурой, компания получает котировки от бирж напрямую, без посредников.

Таким образом, шлюз к CQG для MetaTrader 5 способен успешно прописаться в рабочем арсенале биржевых трейдеров, предпочитающих прозрачные котировки и молниеносное исполнение ордеров.

http://www.metatrader5.com/ru/news

Cравниваем MQL5 и QLUA - почему роботы на MQL5 до 28 раз быстрее?

$
0
0



Многие трейдеры зачастую не задумываются над тем, как быстро доходит их заявка до биржи, как долго она там исполняется и когда торговый терминал трейдера узнает о результате.

В результате они не знают, что легко могут улучшить качество исполнения своих сделок за счет более быстрой реакции и скорости проведения транзакций.

12 сентября 2016 года были проведены три замера скорости на реальном счете БД «Открытие» на MetaTrader 5 build 1415 и Quik 7.2.23 в одно и то же время.

Каждый тест был призван измерить конкретную скоростную характеристику, важную с точки зрения алгоритмического трейдинга:
  1. Тестирование синхронных операций — серия из 10 синхронныхпоследовательных торговых операций Buyс подтверждением успешности выполнения каждой транзакции на бирже. Последующая операция не производится, пока не будет  получено подтверждение от торгового сервера, что операция прошла/не прошла на бирже. Скорость выполнения зависит от всей цепочки терминал — торговый сервер — биржа — торговый сервер — терминал. Чем меньше будет среднее время торговой синхронной операции, тем лучше.
  2. Тестирование асинхронных операций— серия из 10 асинхронныхторговых операций Buyбез подтверждения успешности выполнения транзакции. Это чистый тест на скорострельность, измеряющий скорость отправки заявок на биржу. Тут также лучшим будет тот терминал, у которого время выполнения 10-ти асинхронных покупок будет меньше.
  3. Тестирование обновления стакана заявок— замер скорости изменений заявок в Стакане. Это простой подсчет количества тиков (обновлений) Стакана в единицу времени. Чем чаще приходят котировки с биржи в торговый терминал, тем быстрее будет обновляться Стакан. Следовательно, чем больше тиков за секунду поступает в программу автоматической торговли, тем быстрее она может среагировать на изменения в структуре спроса/предложения на рынке. Лучшим будет тот терминал, в котором скорость обновления Стакана выше.

Условия испытаний

Оба терминала установлены на арендованном сервере VPS в Москве, как и сами торговые серверы БД «Открытие». Торговля велась на одном и том же реальном счете в срочной секции Московской биржи инструментом Si-9.6.

Мы записали на видео все три теста одним роликом, чтобы было видно:

  1. торговые операции проводились на одном и том же реальном счете;
  2. и на одном и том же инструменте Si-9.16;
  3. на одном и том же компьютере;
  4. торговые операции проводились в одно и то же время;
  5. в одних и тех же рыночных условиях;
  6. скорости обновления стаканов замерялись на одном и том же инструменте и в одно и то же время;
  7. сетевая задержка до серверов Открытия была 2 мс.

Результаты сравнения скорости операций: MetaTrader 5 vs QUIK

Результаты всех трех тестов собраны в сводной таблице, детальные результаты по каждому тесту представлены ниже отдельными разделами этой статьи.

Тест                   MetaTrader 5    QUIK      Выигрыш MT5
Синхронные операции        9.59 ms   277.80 ms  28.96 раз
Асинхронная                0.09 ms     0.30 ms   3.33 раза
Обновлений стакана        42.7 в сек   8.40      5.08 раза

Как видно из таблицы, MetaTrader 5 опережает по всем трем тестам со значительным отрывом. Желающие могут самостоятельно провести подобные испытания с помощью приложенных исходных кодов. Само тестирование представлено на видео выше.

 

Видео сравнения скорости торговых операций


MetaTrader 5 быстрее QUIK в торговых операциях до 28 раз

Проведенные замеры показали, что язык MQL5 значительно опережает QLUA как в проведении торговых операций на Московской бирже, так и просто в сканировании стакана заявок. Торговые роботы, написанные на языке MQL5, не только считают в 50-100 раз быстрее, но и торгуют до 28 раз быстрее. И при этом вам не нужно изобретать свои велосипеды — приводы, коннекторы и т.д. К вашим услугам готовые торговые классыстандартной библиотеки и масса статейпо автоматизации трейдинга.

Надежный торговый робот просто обязан проверять результаты отправки торговых операций — то есть, дожидаться ответа от торгового сервера. Тесты доказали, что MetaTrader 5 значительно быстрее в синхронных операциях. Если же вам нужны асинхронные операции — то и здесь скорость в 3 раза выше. Требуется анализировать поток заявок — и тут MetaTrader 5 даст вам преимущество по сравнению с QUIK за счет в 5 раз более быстрого потока котировок без снапшотов.

Проведенные испытания показали, что для создания быстрых автоматических торговых систем язык MQL5 подходит как нельзя лучше. Никакие коннекторы и библиотеки, подключаемые к терминалу QUIK для ускорения расчетов, не спасут: узким местом будет являться само время проведения торговых операций.

Теперь рассмотрим скучные, но обязательные детали тестирования.

 

Детальные отчеты по сравнению терминалов

Программа на QLUA при замере времени обращается к системному таймеру операционной системы, который по умолчанию имеет погрешность измеренияв пределах в 10…15.6 миллисекунда (чаще всего — 15.6 мс). Поэтому мы повысили точность замеров времени в QLUA простым повышением точности системного таймера до 1 ms.

Сделано это с помощью скрипта на SpeedupSystemTimer.mq5, который вызывает функцию timeBeginPeriodсистемной библиотеки Winmm.dll

#import "winmm.dll"
int timeBeginPeriod(uint per);
#import

void OnInit()
  {
   timeBeginPeriod(1);
  }

void OnTick()
  {
  }

Этот скрипт мы запустили перед началом тестов в терминале MetaTrader 5 и разрешив вызов DLL, в результате чего обеспечили погрешность измерений операций в терминале QUIK не более 1 миллисекунды.

В языке MQL5 есть готовая функция GetMicrosecondCount(), поэтому замеры в терминале MetaTrader 5 делались с точностью 1 микросекунда (1 миллисекунда=1000 микросекунд).

#1 Тестирование скорости синхронных торговых операций

Тестирование заключалось в измерении скорости синхронных торговых операций — это значит, что каждая последующая торговая операция совершалась только после получения от торгового сервера подтверждения, что предыдущая транзакция была успешно проведена с полным подтверждением от биржи.

Сначала была проведена серия торговых операций через терминал MetaTrader 5 build 1415, затем такая же серия была произведена через терминал QUIK версии 7.2.23.

Суть испытания заключается в измерении среднего времени 10 синхронных операций покупки по рынку 1 лотом:

  • SyncTradeTest.mq5
  • SyncTradeTest.lua

Измерение времени, затраченного на синхронную транзакцию, проводилось следующим образом:

  • В языке MQL5 есть синхронная функция OrderSend, а время легко замерить в начале и конце серии сделок.

  • В языке QLUA нет синхронной торговой функции и поэтому статус сделки приходится отлавливать отдельно. Время старта торговой операции замерялось непосредственно перед вызовом sendTransaction () с помощью функции os.closck().

    Успешное выполнение транзакции отслеживалось во встроенном обработчике OnOrder() на первом вызове в момент, когда приходило событие о совершении сделки на бирже. Разница между этими событиями и есть время, потраченное на выполнение торговой операции.
Результаты замеров показывают, что в синхронных операциях MetaTrader 5 до 28 раз быстрее,чем QUIK.

 

#2 Тестирование скорости асинхронных торговых операций

В этом тесте все значительно проще. Десять раз подряд на биржу отправляется приказ на покупкуодного контракта фьючерса Si-9.16. Это позволило нам измерить среднее время асинхронной передачи в QLUA с точностью 1 ms / 10 = 0.10 ms. В MetaTrader 5 погрешности нет, так как в нем используется микросекундный таймер.

Мы не ждем никакого результата наших операций, за каждой отправкой заявки торговому серверу сразу же делается отправка новой заявки:

  • AsyncTradeTest.mq5
  • AsyncTradeTest.lua
Как видно из результатов, в асинхронных операциях MetaTrader 5 в 3.33 раза быстрее,чем QUIK.

 

#3Тестирование обновления стакана заявок

Ряд торговых стратегий строится на анализе потока заявок в стакане. В языке MQL5 событие изменения стакана можно отлавливать в обработчике OnBookEvent(), а в QLUA через OnQuote().

Тесты скорости обновления стаканов проводились с помощью следующих программ, которые доступны в приложенном ZIP-архиве:

  • MarketUpdateTest.mq5
  • MarketUpdateTest.lua

В результате последовательного запуска этих программ на двух разных терминалах было зафиксировано, что стакан в MetaTrader 5 обновляется примерно в 5 раза чаще, чем в QUIK. Скорее всего QUIK просто лимитирует частоту обновлений стакана и не показывает все изменения.

Так как все исходные коды приложены тут же, любой желающий может самостоятельно воспроизвести эти тесты и убедиться лично в представленных результатах.

 

Почему такая разница?

Мы фанатично относимся к производительности и боремся за каждый десяток микросекунд, годами оптимизируя торговую платформу.

Именно поэтому мы показываем потрясающую производительность встроенного алгоритмического языка MQL5 и скорость торговых транзакций.

Ведущая MTF-площадка для торговли валютами LMAX Exchange стала поставщиком ликвидности для MetaTrader 5

$
0
0

Мы рады сообщить об интеграции с LMAX Exchange— многосторонней площадкой (Multilateral Trading Facility, MTF) для торговли валютами, драгоценными металлами и индексами.

Шлюз MetaTrader 5 к LMAX Exchangeпредлагает брокерам, фондам и профессиональным трейдерам доступ к потоковой ликвидности с использованием лимитных ордеров, прозрачное ценообразование и качественное исполнение при отсутствии «last look».

Используемая LMAX Exchange схема «no last look» обеспечивает отсутствие реквотов и гарантированное исполнение по заявленной поставщиком ликвидности цене.

Ведущая MTF-площадка для торговли валютами LMAX Exchange стала поставщиком ликвидности для MetaTrader 5

При постоянно повышающемся спросе брокеров и институциональных трейдеров на нейтральное, бесконфликтное и прозрачное исполнение шлюз к LMAX Exchange обеспечивает пользователей MetaTrader 5 качественной рыночной инфраструктурой, ликвидностью, исполнением и потоковыми рыночными данными.

На данный момент на LMAX доступны более 70 валютных пар и самые популярные CFD на индексы и сырьевые фьючерсы.

Скотт Моффат, LMAX Exchange

Скотт Моффат, LMAX Exchange

«Я очень рад нашему продолжающемуся сотрудничеству с компанией MetaQuotes и тому позитивному влиянию, которое оно оказывает на клиентов розничных брокеров, предоставляя передовые технологии и доступ к мировому рынку, — отмечает исполнительный директор LMAX Exchange Скотт Моффат. — Выпуск шлюза MetaTrader 5 к LMAX Exchange свидетельствует о нашем совместном стремлении к инновациям и наилучшему исполнению».

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

$
0
0

Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода.

В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и выхода зачастую требуются годы ручной торговли. Но с помощью MetaTrader 5 вы можете быстро проверить любую подобную стратегию на реальной истории.

Торговая идея на тиках

Прежде всего, нам необходимо создать индикатор, который будет строить тиковые графики — то есть графики,  на которых можно увидеть каждое изменение цены.

Один из первых таких индикаторов вы можете найти в Библиотеке — https://www.mql5.com/ru/code/89. В отличие от обычных, на тиковых графиках при поступлении нового тика необходимо весь график смещать назад.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

За основу проверяемой идеи возьмем ряд изменений цены между двумя последовательными тиками, это будет примерно такая последовательность в пунктах:

+1, 0, +2, -1, 0, +1, -2, -1, +1, -5, -1, +1, 0, -1, +1, 0, +2, -1, +1, +6, -1, +1,...

Закон нормального распределения гласит, что 99 % изменений цены между двумя тиками укладывается в пределах 3-х сигм.  Мы попробуем в режиме реального времени вычислять на каждом тике среднеквадратичное отклонение и помечать резкие скачки цены значками красного и синего цвета.

Таким образом мы попытаемся визуально выбрать стратегию для использования таких резких выбросов — торговать в направлении изменения или же использовать «возврат к среднему». Как видите, идея совсем простая, и наверняка по этому пути прошло большинство любителей математики.

 

Создаем тиковый индикатор

В MetaEditor запускаем Мастер MQL, задаем имя  и два входных параметра:

  • ticks — сколько тиков будет использоваться для расчета среднеквадратичного отклонения
  • gap — коэффициент для получения интервала в сигмах.

Далее отмечаем «Индикатор в отдельном окне» и указываем 2 графических построения, которые будут отображать информацию в подокне: линия для тиков и цветные стрелки для сигналов о появлении резких изменений цены.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Внесем в полученную заготовку изменения, которые отмечены желтым

//+------------------------------------------------------------------+
//|                                              TickSpikeHunter.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   2
//--- plot TickPrice
#property indicator_label1  "TickPrice"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Signal
#property indicator_label2  "Signal"
#property indicator_type2   DRAW_COLOR_ARROW
#property indicator_color2  clrRed,clrBlue,C'0,0,0',C'0,0,0',C'0,0,0',C'0,0,0',C'0,0,0',C'0,0,0'
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      ticks=50;         // количество тиков в расчетах
input double   gap=3.0;          // ширина канала в сигмах
//--- indicator buffers
double         TickPriceBuffer[];
double         SignalBuffer[];
double         SignalColors[];
//--- счетчик изменений цены
int ticks_counter;
//--- первый вызов индикатора
bool first;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,TickPriceBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,SignalColors,INDICATOR_COLOR_INDEX);
//--- укажем пустые значения, которые нужно игнорировать при отрисовке  
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//--- сигналы будем выводить в виде этого значка
   PlotIndexSetInteger(1,PLOT_ARROW,159);
//--- инициализация глобальных переменных
   ticks_counter=0;
   first=true;
//--- успешная инициализация программы
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Теперь осталось добавить код в предопределенный обработчик поступающих тиков OnCalculate(). При первом вызове функции явно обнулим значения в индикаторных буферах, а также для удобства установим для них признак таймсерии— таким образом индексация у них будет справа налево.

Это позволит обращаться к самому свежему значению индикаторного буфера по индексу ноль, то есть в TickPriceBuffer[0] будет храниться значение последнего  тика.

Кроме того,  основную обработку тиков мы вынесем в отдельную функцию ApplyTick():

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- при первом вызове обнулим индикаторные буферы и установим признак серии
   if(first)
     {
      ZeroMemory(TickPriceBuffer);
      ZeroMemory(SignalBuffer);
      ZeroMemory(SignalColors);
      //--- массивы серии идут задом наперед, так удобнее в данном случае
      ArraySetAsSeries(SignalBuffer,true);
      ArraySetAsSeries(TickPriceBuffer,true);
      ArraySetAsSeries(SignalColors,true);
      first=false;
     }
//--- возьмем в качестве цены текущее значение Close
   double lastprice=close[rates_total-1];
//--- считаем тики
   ticks_counter++;
   ApplyTick(lastprice); // проведем вычисления и сдвиг в буферах   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| применяет тик для вычислений                                     |
//+------------------------------------------------------------------+
void ApplyTick(double price)
  {
   int size=ArraySize(TickPriceBuffer);
   ArrayCopy(TickPriceBuffer,TickPriceBuffer,1,0,size-1);
   ArrayCopy(SignalBuffer,SignalBuffer,1,0,size-1);
   ArrayCopy(SignalColors,SignalColors,1,0,size-1);
//--- запишем последнее значение цены
   TickPriceBuffer[0]=price;
//---
  }

Функция ApplyTick() пока производит самые простые действия — сдвигает все значения буфера на одну позицию вглубь истории и пишет в TickPriceBuffer[0] последний тик. Запускаем индикатор под отладкой и наблюдаем некоторое время.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Видим, что цена Bid, по которой строится Close текущей свечи, очень часто остается неизменной, и поэтому график рисуется кусками «плато». Немного подправим код, чтобы получать только «пилу» — так глазу более понятно.

//--- вычисляем только если цена изменилась
   if(lastprice!=TickPriceBuffer[0])
     {
      ticks_counter++;      // считаем тики
      ApplyTick(lastprice); // проведем вычисления и сдвиг в буферах
     }

Итак, первую версию индикатора мы создали, теперь у нас не бывает нулевых приращений цены.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

 

Добавляем вспомогательный буфер и расчет среднеквадратичного отклонения

Для вычисления отклонения нам необходим дополнительный массив, который будет хранить приращения цены на каждом тике. В качестве такого массива добавим еще один индикаторный буфер и добавим соответствующий код  в нужных местах:

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
...
//--- indicator buffers
double         TickPriceBuffer[];
double         SignalBuffer[];
double         DeltaTickBuffer[];
double         ColorsBuffers[];
...
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,TickPriceBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,SignalColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,DeltaTickBuffer,INDICATOR_CALCULATIONS);
...
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const ...)

//--- при первом вызове обнулим индикаторные буфера и установим признак серии
   if(first)
     {
      ZeroMemory(TickPriceBuffer);
      ZeroMemory(SignalBuffer);
      ZeroMemory(SignalColors);
      ZeroMemory(DeltaTickBuffer);
      //--- массивы серии идут задом наперед, так удобнее в данном случае
      ArraySetAsSeries(TickPriceBuffer,true);
      ArraySetAsSeries(SignalBuffer,true);
      ArraySetAsSeries(SignalColors,true);
      ArraySetAsSeries(DeltaTickBuffer,true);
      first=false;
     }
...
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| применяет тик для вычислений                                     |
//+------------------------------------------------------------------+
void ApplyTick(double price)
  {
   int size=ArraySize(TickPriceBuffer);
   ArrayCopy(TickPriceBuffer,TickPriceBuffer,1,0,size-1);
   ArrayCopy(SignalBuffer,SignalBuffer,1,0,size-1);
   ArrayCopy(SignalColors,SignalColors,1,0,size-1);  
   ArrayCopy(DeltaTickBuffer,DeltaTickBuffer,1,0,size-1);
//--- запишем последнее значение цены
   TickPriceBuffer[0]=price;
//--- вычислим разницу с предыдущим значением
   DeltaTickBuffer[0]=TickPriceBuffer[0]-TickPriceBuffer[1];
//--- получим ср.кв. отклонение
   double stddev=getStdDev(ticks);  

Теперь мы готовы вычислить среднеквадратичное отклонение. Сначала напишем функцию getStdDev(), которая делает все вычисления«в лоб», пробегая по всем элементам массива столько циклов, сколько нужно.

//+------------------------------------------------------------------+
//| вычисляет стандартное отклонение "в лоб"                            |
//+------------------------------------------------------------------+
double getStdDev(int number)
  {
   double summ=0,sum2=0,average,stddev;
//--- считаем сумму изменений и вычисляем матожидание
   for(int i=0;i<ticks;i++)
      summ+=DeltaTickBuffer[i];
   average=summ/ticks;
//--- теперь считаем среднеквадратичное отклонение
   sum2=0;
   for(int i=0;i<ticks;i++)
      sum2+=(DeltaTickBuffer[i]-average)*(DeltaTickBuffer[i]-average);
   stddev=MathSqrt(sum2/(number-1));
   return (stddev);
  }

Затем там же допишем блок, который отвечает за выставление сигналов на тиковом графике — установку кружков красного и синего цвета

//+------------------------------------------------------------------+
//| применяет тик для вычислений                                     |
//+------------------------------------------------------------------+
void ApplyTick(double price)
  {
   int size=ArraySize(TickPriceBuffer);
   ArrayCopy(TickPriceBuffer,TickPriceBuffer,1,0,size-1);
   ArrayCopy(SignalBuffer,SignalBuffer,1,0,size-1);
   ArrayCopy(SignalColors,SignalColors,1,0,size-1);
   ArrayCopy(DeltaTickBuffer,DeltaTickBuffer,1,0,size-1);   
//--- запишем последнее значение цены
   TickPriceBuffer[0]=price;
//--- вычислим разницу с предыдущим значением
   DeltaTickBuffer[0]=TickPriceBuffer[0]-TickPriceBuffer[1];   
//--- получим ср.кв. отклонение
   double stddev=getStdDev(ticks);   
//--- если изменение цены превысило заданный порог
   if(MathAbs(DeltaTickBuffer[0])>gap*stddev) // при первом тике будет показан сигнал, оставим как фичу
     {
      SignalBuffer[0]=price;     // поставим точку
      string col="Red";          // по умолчанию, точка красного цвета
      if(DeltaTickBuffer[0]>0)   // цена резко выросла
        {
         SignalColors[0]=1;      // тогда точка синего цвета
         col="Blue";             // запомним для вывода в лог
        }
      else                       // цена резко упала
      SignalColors[0]=0;         // точка красного цвета
      //--- выведем запись в журнал Экспертов
      PrintFormat("tick=%G change=%.1f pts, trigger=%.3f pts,  stddev=%.3f pts %s",
                  TickPriceBuffer[0],DeltaTickBuffer[0]/_Point,gap*stddev/_Point,stddev/_Point,col);
     }
   else SignalBuffer[0]=0;       // нет сигнала      
//---
  }

Нажимаем кнопку F5 (Начало отладки/продолжение выполнения) и наблюдаем в терминале MetaTrader 5, как работает наш индикатор.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Теперь пришло время заняться отладкойкода, которая позволит выявить ошибки и ускорить работу программы.

 

Профилировка кода для ускорения работы

Для программ, работающих в режиме реального времени, критически важна скорость выполнения. Среда разработки MetaEditor позволяет удобно и быстро оценивать затраты времени на выполнение тех или иных участков программы.

Для этого необходимо запустить профилирование кода и дать поработать программе некоторое время. Для профилировки индикатора будет достаточно минуты.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Как видите, большая часть времени (95.21%) ушла на отработку функции ApplyTick(), которая была вызвана 41 раз из функции OnCalculate(). Сама же OnCalculate() вызывалась 143 раза, но только в 41 случае цена в пришедшем тике отличалась от цены предыдущего.

При этом в самой функции ApplyTick() большую часть времени заняли вызовы функции ArrayCopy(), которые выполняют только вспомогательные действия и не производят вычислений, ради которых и был задуман данный индикатор. Вычисление среднеквадратичного отклонения на 111 строке кода заняло только 0.57% общего времени выполнения программы. 

Постараемся уменьшить непроизводительные затраты, для этого попробуем копировать не все элементы массивов  (TickPriceBuffer и т.д), а только 200 последних. Ведь нам на графике достаточно будет видеть 200 последних значений, к тому же количество тиков за одну торговую сессию может достигать десятков и сотен тысяч.

Просматривать их все нет необходимости. Поэтому введем входной параметр shift=200, который задает  количество сдвигаемых значений. Добавьте в код строки, выделенные желтым:

//--- input parameters
input int      ticks=50;         // кол-во тиков в расчетах
input int      shift=200;        // кол-во сдвигаемых значений
input double   gap=3.0;          // ширина канала в сигмах
...
void ApplyTick(double price)
  {
//--- сколько элементов сдвигаем в индикаторных буферах на каждом тике
   int move=ArraySize(TickPriceBuffer)-1;
   if(shift!=0) move=shift;
   ArrayCopy(TickPriceBuffer,TickPriceBuffer,1,0,move);
   ArrayCopy(SignalBuffer,SignalBuffer,1,0,move);
   ArrayCopy(SignalColors,SignalColors,1,0,move);
   ArrayCopy(DeltaTickBuffer,DeltaTickBuffer,1,0,move);

Запускаем заново профилировку и видим новый результат — время на копирование массивов упало в в сотни или тысячи раз, теперь основное время занимает вызов StdDev(), которая отвечает за вычисление среднеквадратичного отклонения.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Таким образом, мы ускорили работу функции ApplyTick() на несколько порядков, что даст нам существенную экономию при оптимизации стратегии и при работе программы в режиме реального времени.  Ведь вычислительных ресурсов никогда не бывает слишком много.

 

Аналитическая оптимизация кода

Иногда даже оптимально написанный код можно заставить работать еще быстрее. В данном случае вычисление среднеквадратичного отклонения можно ускорить, если немного переписать формулу. 

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Таким образом, мы можем просто вычислять квадрат суммы и сумму квадратов приращений цены — это позволит нам выполнять меньше математических операций на каждом тике.  На каждом тике мы просто отнимаем выпадающий элемент массива и добавляем входящий элемент массива в переменные, содержащие суммы.

Создадим новую функцию getStdDevOptimized(), в которой применим уже знакомый метод сдвига значений массива внутри себя.

//+------------------------------------------------------------------+
//| вычисляет стандартное отклонение по формулам                     |
//+------------------------------------------------------------------+
double getStdDevOptimized(int number)
  {
//---
   static double X2[],X[],X2sum=0,Xsum=0;
   static bool firstcall=true;
//--- первый вызов
   if(firstcall)
     {
      //--- зададим размер динамических массивов на 1 больше количества тиков
      ArrayResize(X2,ticks+1);
      ArrayResize(X,ticks+1);
      //--- гарантируем себе нулевые значения в начале вычислений
      ZeroMemory(X2);
      ZeroMemory(X);

      firstcall=false;
     }
//--- сдвигаем массивы
   ArrayCopy(X,X,1,0,ticks);
   ArrayCopy(X2,X2,1,0,ticks);
//--- вычислим новые входящие значения сумм
   X[0]=DeltaTickBuffer[0];
   X2[0]=DeltaTickBuffer[0]*DeltaTickBuffer[0];
//--- вычислим новые суммы
   Xsum=Xsum+X[0]-X[ticks];
   X2sum=X2sum+X2[0]-X2[ticks];
//--- квадрат стандартного отклонения
   double S2=(1.0/(ticks-1))*(X2sum-Xsum*Xsum/ticks);
//--- считаем сумму тиков и вычисляем матожидание
   double stddev=MathSqrt(S2);
//---
   return (stddev);
  } 

Добавим в функцию ApplyTick() вычисление среднеквадратичного отклонения вторым способом через функцию getStdDevOptimized() и вновь запустим профилировку.

//--- вычислим разницу с предыдущим значением
   DeltaTickBuffer[0]=TickPriceBuffer[0]-TickPriceBuffer[1];
//--- получим ср.кв. отклонение
   double stddev=getStdDev(ticks);
   double std_opt=getStdDevOptimized(ticks);

Результат выполнения:

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Видно, что новая функция getStdDevOptimized() требует в два раза меньше времени — 4.56%, чем лобовой обсчет в getStdDev() — 9.54%. Она выполняется даже быстрее, чем встроенная функция PrintFormat(), которая использовала 4.74% времени работы программы.

Таким образом, использование оптимального способа вычисления дает еще больший выигрыш по скорости работы программы. Рекомендуем также посмотреть статью 3 метода ускорения индикаторов на примере линейной регрессии.

Кстати, о вызове стандартных функций — в данном индикаторе мы получаем цену из таймсерии close[], которая строится по ценам Bid. Есть еще два способа получить эту цену — с помощью функций SymbolInfoDouble()и SymbolInfoTick(). Добавим эти вызовы в код и снова сделаем профилировку.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Как видите, здесь тоже есть разница по скорости работы. И это понятно, так как чтение готовой цены из close[] не требует затрат по сравнению с вызовом универсальных функций.

Отладка на реальных тиках в тестере

При написании индикаторов и торговых роботов нельзя предусмотреть все возможные ситуации, которые могут случиться при онлайн-работе. К счастью, MetaEditor позволяет проводить отладку и на исторических данных.

Просто запустите отладку в режиме визуального тестирования, и вы сможете проверить вашу программу на заданном интервале истории. Вы сможете ускорять, останавливать и прокручивать тестирование до нужной даты.

Важно:в окне Отладкаукажите режим моделирования "Каждый тик на основе реальных тиков". Это позволит использовать для отладки реальные записанные котировки, которые хранит у себя торговый сервер. При первом запуске тестирования они автоматически загрузятся на ваш компьютер.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Если эти параметры не заданы в MetaEditor, то при в виузальном режиме тестирования будут использоваться текущие настройки тестера.Укажите в них режим «Каждый тик на основе реальных тиков».

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор


Мы видим, что на тиковом графике появляются странные разрывы. Значит, в алгоритме допущена какая-то ошибка. Неизвестно, сколько времени ушло бы на её проявление при тестировании в реальном времени. В данном случае по выводам в Журнал визуального тестирования видно, что странные разрывы возникают в момент появления нового бара.

Точно! — мы забыли, что при переходе на новый бар размер индикаторных буферов автоматически увеличивается на 1. Внесём исправление в код:

void ApplyTick(double price)
  {
//--- будем запоминать размер массива TickPriceBuffer - он равен кол-ву баров на графике
   static int prev_size=0;
   int size=ArraySize(TickPriceBuffer);
//--- если размер индикаторных буферов не изменился, то сдвинем все элементы на 1 позицию назад
   if(size==prev_size)
     {
      //--- сколько элементов сдвигаем в индикаторных буферах на каждом тике
      int move=ArraySize(TickPriceBuffer)-1;
      if(shift!=0) move=shift;
      ArrayCopy(TickPriceBuffer,TickPriceBuffer,1,0,move);
      ArrayCopy(SignalBuffer,SignalBuffer,1,0,move);
      ArrayCopy(SignalColors,SignalColors,1,0,move);
      ArrayCopy(DeltaTickBuffer,DeltaTickBuffer,1,0,move);
     }
   prev_size=size;
//--- запишем последнее значение цены
   TickPriceBuffer[0]=price;
//--- вычислим разницу с предыдущим значением

Запустим визуальное тестирование и поставим точку остановки, чтобы поймать момент открытия нового бара. Добавим наблюдаемые значения и убедимся, что всё сделали правильно: количество баров на графике увеличилось на единицу, тиковый объем текущего бара равен 1 — это самый первый тик нового бара.

Как в MetaTrader 5 быстро разработать и отладить торговую стратегию: тиковый анализатор

Ну вот, мы провели оптимизацию кода, исправили ошибки, замерили время выполнения различных функций, теперь индикатор готов к работе. Можно запускать визуальное тестированиеи наблюдать, что происходит после появления сигналов на тиковом графике. Можно что-то еще улучшить в коде индикатора?

Перфекционист от кодинга скажет — да! Мы еще не попробовали использовать кольцевой буфердля ускорения работы.  Желающие могут проверить сами — дает ли это прирост производительности?

 

MetaEditor — это готовая лаборатория для разработки торговых стратегий

Для написания автоматической торговой системы важно иметь не только удобную среду разработки и мощный язык программирования, но и дополнительные инструменты для отладки и калибровки программы.  В этой статье мы показали как:

  1. создавать за пару минут тиковый график в первом приближении;
  2. пользоваться отладкой в режиме реального времени на графике по кнопке F5;
  3. запускать профилировку для выявления неэффективных мест в коде;
  4. проводить быструю отладку на исторических данных в режиме визуального тестирования;
  5. просматривать значения нужных переменных в процессе отладки.

Разработка индикатора, показывающего торговые сигналы, зачастую является первым необходимым шагом для написания торгового робота. Визуализация помогает выработать торговые правила либо отвергнуть идею еще до начала работы над проектом.

Пользуйтесь всеми возможностями среды разработки MetaEditor для создания эффективных торговых роботов!

Статьи по теме:

  1. Как написать индикатор в MQL5
  2. Создание тиковых индикаторов
  3. Принципы экономного пересчета индикаторов
  4. Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  5. Отладка программ на MQL5

Готовый файл можно скачать по ссылке: https://www.mql5.com/ru/articles/download/2661/tickspikehunter.mq5

Вышел MetaTrader 5 build 1455 с библиотеками математических функций в MQL5 - на пути к R

$
0
0
Попробуйте очередной релиз MetaTrader 5 с упором на развитие математических пакетов и оптимизацией отрисовки стакана, пожалуйста!

Ниже представлен список изменений:

1) Terminal: Добавлены всплывающие подсказки для кнопок Buy, Sell и Close в диалогах торговли.

Подсказки поясняют, какие именно активы будут куплены и проданы при выполнении той или иной операции, помогая начинающим трейдерам понять суть торгового процесса.

Вышел MetaTrader 5 build 1455 с библиотеками математических функций в MQL5 - на пути к R

2) Terminal: Добавлены новые пиктограммы ордеров, сделок и позиций на вкладках «Торговля» и «История».

3) Terminal: Оптимизировано и значительно ускорено (до 4-5 раз) отображение и обновление стакана цен, тикового графика стакана цен и ленты сделок.

4) Terminal: Исправлена ошибка синхронизации тиковой истории в неторговое время. В некоторых случаях ошибка приводила к чрезмерному потреблению сетевого трафика.

5) MQL5: В стандартную библиотеку включена MQL5-версия библиотеки численного анализа ALGLIB.

Возможности библиотеки:
  • Линейная алгебра
  • Решение систем уравнений — линейных и нелинейных
  • Интерполяция
  • Оптимизация
  • Быстрое преобразование Фурье
  • Численное интегрирование
  • Линейная и нелинейная аппроксимация по методу наименьших квадратов
  • Решение обыкновенных дифференциальных уравнений
  • Вычисление специальных функций
  • Описательная статистика и проверка гипотез
  • Анализ данных — классификация, регрессия
  • Реализация алгоритмов линейной алгебры, интерполяции и т.д. в арифметике высокой точности (с использованием MPFR)

Файлы библиотеки ALGLIB расположены в каталоге \MQL5\Include\Math\Alglib. Для использования функций, включите основной файл библиотеки в свою программу: #include <Math\Alglib\alglib.mqh>

6) MQL5: В стандартную библиотеку включены функции работы с математической статистикой.

Теперь в MQL5 доступны возможности языка R —  одного из лучших инструментов статистической обработки и анализа данных.

Статистическая библиотека содержит функции для расчета статистических характеристик данных, а также функции для работы со статистическими распределениями:
  • Функции для расчета статистических характеристик элементов массива
  • Функции для работы со статистическими распределениями: нормальное распределение, логнормальное распределение, бета-распределение и т.д.

Файлы расположены в каталоге \MQL5\Include\Math\Stat. Для использования включите файл с нужными функциями в свою программу, например: #include <Math\Stat\Binomal.mqh>

 Подробное описание функций библиотеки читайте в статье "Статистические распределения в MQL5 — берем лучшее из R".

7) MQL5: В стандартную библиотеку включена MQL5-версия библиотеки Fuzzy, в которой реализованы системы нечеткого логического вывода Мамдани и Сугено.

Возможности библиотеки:
  • 13 функций принадлежностей
  • Гибкая форма написания правил для нечетких систем
  • Система нечеткого логического вывода Мамдани
  • Система нечеткого логического вывода Сугено
  • 5 методов дефаззификации для систем типа Мамдани
  • Неограниченное количество входных и выходных переменных


Файлы расположены в каталоге \MQL5\Include\Math\Fuzzy. Для использования включите файл с нужными функциями в свою программу, например: #include <Math\Fuzzy\mamdanifuzzysystem.mqh>

8) MQL5: Добавлено свойство CHART_QUICK_NAVIGATION для включения/отключения строки быстрой навигации на графике.

Для изменения и получения состояния свойства используйте функции ChartSetInteger и ChartGetInteger. Строка вызывается нажатием клавиши Enter или Space. При помощи нее можно быстро переместиться к заданной дате на графике, переключить символ и таймфрейм.

Если ваша MQL5-программа обрабатывает нажатия клавиш Enter или Space, отключите свойство CHART_QUICK_NAVIGATION, чтобы терминал не перехватывал эти события. При этом останется возможность вызова строки навигации двойным кликом мыши.

9) MQL5: Добавлены функции FileLoad и FileSave для легкого чтения и сохранения массивов в файлы.

В отличие от FileRead* и FileWrite*, этим функциям не требуется хэндл файла. FileLoad и FileSave работают с массивами числовых типов, а также с простыми структурами, не имеющими строк, динамических массивов или объектов класса.

10) MQL5: Модифицировано отображение пользовательского индикатора с режимом рисования DRAW_CANDLES. Теперь для этого стиля можно задавать от одного до трех цветов, в зависимости от этого меняется внешний вид свечей.

11) MQL5: Исправлен ряд ошибок и ускорена работа с тиковой историей при помощи функции CopyTicks.

12) MQL5: Разрешено использование операторов в интерфейсах.

13) Market: Исправлена ошибка, в некоторых случаях приводившая к повторному запросу авторизации на MQL5.community при покупке в Маркете.

14) Tester: Добавлен перевод пользовательского интерфейса на греческий язык, малайский язык и иврит.

15) Обновлена документация.

Обновление доступно через систему LiveUpdate. Если с торгового сервера вашего брокера не приходит обновление, то подключитесь к серверу MetaQuotes-Demo и перезапустите программу. Обновление придет на старте.

Если у вас еще нет MetaTrader 5, то скачайте его бесплатно по ссылке https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5setup.exe, пожалуйста.

Откройте демо-счет на сервере MetaQuotes-Demo и получите доступ к задержанным на 15 минут котировкам MOEX:

Вышел MetaTrader 5 build 1455 с библиотеками математических функций в MQL5 - на пути к R

На демо-счете вы можете проводить анализ и тестировать торговые стратегии на реальных тиках.

MQL4 и MQL5 – на 41-м месте рейтинга языков программирования TIOBE

$
0
0

Язык программирования торговых стратегий MQL4/MQL5 скакнул на 77 позиций в мировом индексе TIOBE.

В декабре 2014 года MQL4/MQL5 дебютировал в нем на 118-м месте, а в ноябре 2016 года добрался уже до 41-й строчки. Отметим, что для организаторов рейтинга оба языка MQL4 и MQL5 объединены из-за одинаковости.

MQL4 и MQL5 – на 41-м месте рейтинга языков программирования TIOBE
 

TIOBE считается самым авторитетным рейтингом языков программирования и показывает не только текущую позицию языка, но и ее динамику.

Cтатистика TIOBE ежемесячно отражает, какие языки становятся популярнее, а какие – теряют своих сторонников. Методика подсчета рейтинга подробно описана здесь.

Главный критерий оценки – количество поисковых запросов, содержащих название языка. Чем выше интерес к языкам MQL4/MQL5 в поисковых системах Google, Bing, Yahoo, Википедии и YouTube, тем выше их место в рейтинге.

77 позиций вверх за 2 года – это впечатляющий рывок, говорящий о серьезном росте интереса к самостоятельному написанию роботов для платформ MetaTrader и увеличении количества алготрейдеров. 

Благодарим всех пользователей, проявивших интерес к алготрейдингу и языкам MQL4/MQL5!

У MetaTrader 5 победа в номинации "Лучшая мультирыночная платформа"!

$
0
0

Торговые платформы MetaTrader завоевали награды в двух номинациях на конкурсе Finance Magnates Awards 2016.

Победителем в категории «Лучшая мультирыночная платформа» стала MetaTrader 5, а лучшей форекс-платформой была признана MetaTrader 4.

2016 Finance Magnates London Summit Awards

Награждение победителей состоялось 15 ноября на вечерней церемонии закрытия Finance Magnates Awards.

В этом году мероприятие собрало более 2 000 профессионалов финансовой индустрии и 90 компаний-участников – это рекордное количество посетителей в истории конкурса.

В результате независимого голосования MetaTrader 4 и MetaTrader 5 обошли своих конкурентов и набрали большинство голосов. Поэтому полученные награды по праву можно считать объективной оценкой ситуации на рынке.

Напомним, что это не первый успех наших продуктов на Finance Magnates Awards: в прошлом годуплатформы MetaTrader победили в ключевых номинациях «Лучшая платформа» и «Лучший мобильный продукт».

Таким образом, из года в год крупнейшие игроки финансовой отрасли выбирают MetaTrader.

Viewing all 80 articles
Browse latest View live