← Назад

MetaTrader

Михаил, добрый день. Можно ли с Вашей помощью реализовать получение котировок из MetaTrader при помощи DDE??? MetaTrader с радостью их посылает через DDE и в Exel можно их увидеть, я бы хотел так же через DDE видеть их в .Net

Комментарии (40)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

denis
denis

я не Михаил, но в главе Экспорт произвольных таблиц написано: "QuikTrader поддерживает экспорт не только таких таблиц, как Инструменты, Заявки и т.д., но и произвольных. Эта возможность необходима тем торговых алгоритмам, которые используют особый набор данных. "

Только придется стартовать экспорт в ручную.

elcust
elcust Автор

Экспорт произвольных таблиц относится только к QUIK, а тут Metatrader. Это разные торговые платформы.

denis
denis

даа? 8-0 во дела-а-а... пойду учить мат. часть.

Mikhail Sukhov
Mikhail Sukhov

Как сказал Денис, нет особой разницы. DDE - это универсальный протокол. Так что можно попробовать... А как именно хотите использовать МТ? 4-ка?

elcust
elcust Автор

Есть МТ4 который предоставляет компания broco в демонстрационном доступе, оттуда можно получать фьюч S&P, Brand, EURUSD и все что хотите в общем, там весь мир в реальном времени без задержек. Сейчас я оттуда выкачиваю нужные мне данные при помощи SQL.

Mikhail Sukhov
Mikhail Sukhov

Ок, а для чего Вам S#?

elcust
elcust Автор

Использую шлюз взаимодействия с QUIK.

Mikhail Sukhov
Mikhail Sukhov

Понятно. А вы МТ используете как аналитический блок, или как простое получение данных?

elcust
elcust Автор

Какие то вещи обсчитываю в MT4, чтобы не тянуть много информации, большинство уже непосредственно в проекте.

Mikhail Sukhov
Mikhail Sukhov

Ок, понятно. Ну тогда действительно, через ДДЕ. Я думал у Вас связка чуть другая, когда МТ сам сигналы генерирует. Но раз у Вас логика с своем роботе, то да, правильно идете. Пробовали уже пересылать данные?

elcust
elcust Автор

По DDE из MT4 нет еще. Но в самое ближайшее время послушаю DDE S#. Если выйдет, вообще будет улетно!

Ronin
Ronin

elcust, держите нас в курсе :) Интерестная тема.

elcust
elcust Автор

Кому нужно могу выслать реализацию связки MT4 с SQL. На почту скидывайте запрос обратным письмом верну

Mikhail Sukhov
Mikhail Sukhov

Мне больше интересно не столько реализация, сколько сам подход. Я вижу у Вас как: MT -> данные по dde -> S# -> собственный робот на .NET с торговой логикой -> сигналы через S# в Квик -> Квик. Павильно?

А почему решили не делать логику в рамках MT? Какие ограничения?

XMbIPb
XMbIPb

По какому имени произвольной таблицы S# находит данные передаваемые MT ? И вообще кому-нибудь удалось их подружить?

Mikhail Sukhov
Mikhail Sukhov

Процесс, насколько я понял, следующий. MT начинает экспортировать данные по DDE. QuikTrader их успешно получает и выводит через событие ProcessUnknownDdeData. Зачем S# находить таблицу (кстати, какую)?

XMbIPb
XMbIPb

Я про эту строчку: // узнаем, что пришедшие данные отвечают за портфель if (string.Compare(name, "portfolio", true) == 0)

S# распознаёт MTшные данные как "portfolio" ?

Mikhail Sukhov
Mikhail Sukhov

Нет конечно. Это пример экспорта произвольной таблицы portfolio. Можно экспортировать clientposition, money, account, charts. Да все, что экспортируется. Аналогично и с МТ.

ustas
ustas

Привет! Скинь плиз связку MT4 с SQL любопытно

shtirliz45 @ gmail.com (без пробелов)

спасибо!

XMbIPb
XMbIPb

clientposition, money, account - это же уже названия столбцов? как я понял, вместо них нужно прописать те которые передаёт МТ (SYMBOL, BID, ASK, DATE), а вот что писать вместо "portfolio" ? извиняюсь если туплю, просто DDE для меня ещё тёмный лес...

Mikhail Sukhov
Mikhail Sukhov

clientposition, money, account - это все название категории. При экспорте через ДДЕ есть такое понятие. Оно однозначно идентифицирует поток данных Скажем, чтобы отличить, какие данные были получены, по сделкам или заявкам.

XMbIPb
XMbIPb

А что такое "portfolio" ? и чем категории отличаются от столбцов, там разве не реляционная модель данных? и как мне всё-таки получить эти SYMBOL, BID, ASK и DATE?

Mikhail Sukhov
Mikhail Sukhov

portfolio - это ДДЕ категория таблицы порфтелей... Я думал, лучше все прочитать в Квике раздел про ДДЕ. А так же о том, как работает ДДЕ в S#.

XMbIPb
XMbIPb

Хорошо, тогда так: Какое название категории идентифицирует поток данных, отправляемых метатрейдером?

XMbIPb
XMbIPb

this.Trader.ProcessUnknownDdeData += (name, rows) => { // узнаем, что пришедшие данные отвечают за портфель if (string.Compare(name, "portfolio", true) == 0) { foreach (var row in rows) { var client = (string)row[0]; var portfolio = _portfolioWindow.Portfolios.FirstOrDefault(p => p.Client == client);

                   if (portfolio == null)
                    {
                            portfolio = new Portfolio { Client = client };
                            _portfolioWindow.Portfolios.Add(portfolio);
                    }

                   portfolio.Shorts = (double)row[1];
                    portfolio.Longs = (double)row[2];
                    portfolio.Collateral = (double)row[3];
                    portfolio.Margin = (double)row[4];
                    portfolio.Money = (double)row[5];
                    portfolio.PnL = (double)row[6];
            }
    }

Здесь "portfolio" - это ДДЕ категория таблицы портфелей, которую мы указали в настройках ДДЕ сервера в квике, а portfolio.Collateral,portfolio.Margin,portfolio.Money и portfolio.PnL

  • это названия столбцов этой таблицы.. я прав?

Вся беда в том что у МТ нет настроек ДДЕ сервера, где бы я мог указать нужную категорию, у меня есть только названия столбцов, указанные в документации МТ ( SYMBOL, BID, ASK и DATE)...

Mikhail Sukhov
Mikhail Sukhov

Я с МТ не работал. Но думаю, что так же, как и в Квике. Какой задается в настройках - такой и приходит по ДДЕ... Вы умеете из МТ экспортировать в Эксель?

XMbIPb
XMbIPb

В том то и беда, что там нет настроек... В эксель тоже не умею..вот всё что есть в документации:

Экспорт котировок Исходными данными, на базе которых строится вся аналитическая работа пользователя терминала, являются данные о динамике цен финансовых инструментов. Эту информацию поставляет брокерская компания. Ценовые данные позволяют строить графики финансовых инструментов, исследовать финансовые рынки, использовать различные торговые тактики и принимать торговые решения. Котировки представляют собой файлы с записями в формате "SYMBOL, BID, ASK, DATE" (финансовый инструмент, цена покупки, цена продажи, дата и время) и поступают в терминал автоматически после установки связи с сервером.

Терминал позволяет экспортировать текущие котировки в другие программы в режиме реального времени по протоколу "DDE" (Dynamic Data Exchange). Это -- протокол операционных систем MS Windows для динамической передачи данных между различными приложениями. Котировки по DDE выдаются только по приходе новых тиков (режим ADVISE), а не сразу же по запросу (режим REQUEST) с выдачей последней известной цены. N/A выдается при первом запросе REQUEST, а после прихода новой цены появляются котировки.

Для активизации режима экспорта котировок из клиентского терминала по протоколу DDE необходимо включить опцию "Разрешить DDE сервер" в настройках терминала.

Внимание: исторические данные по протоколу DDE не транслируются. Передача текущих котировок производится только при работающем клиентском терминале. Форматы DDE-запросов с их возможными результатами на примере файла "DDE-sample.xls":

запрос BID: = MT4|BID!USDCHF результат: 1.5773 запрос ASK: = MT4|ASK!USDCHF результат: 1.5778 запрос HIGH: = MT4|HIGH!USDCHF результат: 1.5801 запрос LOW: = MT4|LOW!USDCHF результат: 1.5741 запрос TIME: = MT4|TIME!USDCHF результат: 21.05.02 9:52 запрос QUOTE: = MT4|QUOTE!USDCHF результат: 21.05.02 9:52 1.5773 1.5778 1.5776

Внимание: для правильного отображения данных в MS Excel нужно включить опцию в меню "Сервис -- Параметры -- Переход -- Преобразование формул в формат Excel при вводе".

Mikhail Sukhov
Mikhail Sukhov

Из того, что Вы привели, я понял так. Название категорий - BID ASK HIGH LOW TIME QUOTE.... Проще всего это узнать через ITrader.ProcessUnknownDdeData. И, опять же, судя по тому, что Вы привели, указывать название ddeServer нужно MT.

XMbIPb
XMbIPb

А как узнать названия категорий через trader.ProcessUnknownDdeData, если это событие не срабатывает? И где нужно указывать название MT?

Mikhail Sukhov
Mikhail Sukhov

http://stocksharp.com/doc/help/html/E_Ecng_Trading_Quik_QuikTrader_ProcessUnknownDdeData.htm

Первый параметр и есть название категории. Если событие не срабатывает, значит по ДДЕ и не шлется... Вы добились экспорта в Эксель? Потому что, по Вашему описанию решения, я понял, что проблема явно не в обработке данных из МТ, а в самой настройке МТ.

XMbIPb
XMbIPb

С экспортом в эксель проблем не возникло, я просто запустил DDE- sample.xls из папки МТ, открыл подключение и МТ сразу начал отправлять данные.. Я так и не понял, что вот здесь - this.Trader.StartDde("Портфель") нужно указать вместо "Портфель"..что бы ни прописывал S# пишет, что не найдено окно с таким именем.. или ProcessUnknownDdeData и без этого должен срабатывать?

Mikhail Sukhov
Mikhail Sukhov

ДДЕ бывает двух направленностей. Первая - это клиент, когда данные посылаются в какую-то программу. Вторая - это сервер, когда данные получаются от клиентов.

Так вот, QuikTrader.StartDde("Портфель") запускает ДДЕ клиента в Квике. И только. Вам же нужно запускать аналогичного в МТ. Через данну функцию это не получится, потому что я ее сделал только для Квика.

Далее, категории ДДЕ это совсем другое. Это то, что приходит первым параметром черезhttp://stocksharp.com/doc/help/html/E_Ecng_Trading_Quik_QuikTrader_ProcessUnknownDdeData.htm

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

XMbIPb
XMbIPb

Теперь понятно..вот только запустить экспорт в MT вручную не получится(там есть всего одна опция для DDE - "Разрешить DDE сервер")..мне кажется единственное решение - это подсмотреть как Эксель запускает ДДЕ клиента в MT и претвориться им.. это реально?

Mikhail Sukhov
Mikhail Sukhov

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

XMbIPb
XMbIPb

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

Mikhail Sukhov
Mikhail Sukhov

Сервер только принимает данные.

Tauler
Tauler

я качал из МТ4 через DDE используя Ndde библиотеку. Метак сам является сервером DDE, название сервера MT4

вот код формы

namespace QuoteListener
{
    public partial class MainForm : XtraForm
    {
        private readonly DdeClient client;
        private readonly QuoteServiceContractClient contractClient;
        object senderSyncObj = new object();

        private FileStream fs;
        private StreamWriter sw;
        private DdeAdviseEventArgs lastAdvice;

        public MainForm()
        {
            InitializeComponent();
            client = new DdeClient("MT4", "QUOTE", this);
            client.Advise += client_Advise;
            client.Disconnected += client_Disconnected;
            contractClient = new QuoteServiceContractClient();
        }

        private void client_Advise(object sender, DdeAdviseEventArgs args)
        {
            sendAdviceToService(args);
        }

        private void client_Disconnected(object sender, DdeDisconnectedEventArgs args)
        {
            edtAdviceText.Text =
                string.Format("OnDisconnected: IsServerInitiated={0} IsDisposed={1}", args.IsServerInitiated, args.IsDisposed);
            MessageBox.Show("Я сломался ! DDE отвалился.", "Караул", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                if(!client.IsConnected)
                    client.Connect();
                client.StartAdvise(edtTiker.Text, 1, true, 60000);
                btnStart.Enabled = false;
                btnStop.Enabled = true;

                fs = new FileStream(edtTiker.Text+".error", FileMode.Create, FileAccess.ReadWrite);
                sw = new StreamWriter(fs);
            }
            catch (Exception ex)
            {
                edtAdviceText.Text = string.Format("Ошибка : {0}", ex.Message);
            }
            timerForKeepAlive.Start();
        }

     
    }
}
Mikhail Sukhov
Mikhail Sukhov

Tauler: я качал из МТ4 через DDE используя Ndde библиотеку. Метак сам является сервером DDE, название сервера MT4

вот код формы

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

Tauler
Tauler

Лучше поздно, чем никогда :)

public MainForm() { InitializeComponent(); client = new DdeClient("MT4", "QUOTE", this); стартую DDE, указывая что мне нужны котировки client.Advise += client_Advise; - подписка на событие получения строки данных по DDE от MetaTrader client.Disconnected += client_Disconnected; client.StartAdvise(валютная_пара, 1, true, 60000); }

    private void client_Advise(object sender, DdeAdviseEventArgs args)
    {
        Обработчик события получения строки с данными от MetaTrader
        Из args.Text вытаскивается строка с данныпи 
        Парсится она так:
        string[] strings = advice.Remove(advice.Length-1).Replace('.',',').Split(' ');
        DateTime = Convert.ToDateTime(strings[0] + " " + strings[1]);
        Bid = Convert.ToDouble(strings[2]);
        Ask = Convert.ToDouble(strings[3]);
    }
Mikhail Sukhov
Mikhail Sukhov

Tauler: Лучше поздно, чем никогда :)

Да уж. И снова игнор по форматированию сообщения. Уже МТ5 под РТС засертифицировался. Его использовать желание есть?