Обмен данными между двумя советниками, работающими в разных терминалах - страница 2

 

Поскольку советник обрабатывает событие по тику, то и остановился на этом направлении.

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

 

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

Такое кому-нибудь в голову приходило ? Только это работает для терминалов находящихся на одной машине.

Буду копать в этом направлении :-).

 
Andres писал(а) >>

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

Такое кому-нибудь в голову приходило ? Только это работает для терминалов находящихся на одной машине.

Буду копать в этом направлении :-).

Дайте, пожалуйста, ссылочку на API для работы с реестром.

Я пока что рассматриваю вариант, основанный на обмене информацией через файлы на диске. Оба терминала конечно же работают на одном компе.

Я пока предварительно потестировал и мне показалось что скорости более чем достаточно для того чтобы осуществлять обмен информацией между терминалами за время не более 1 секунды, что думаю вполне достаточно для оперативного управления обоими счетами (счёт BUY и счёт SELL).

Правда на работе очень много дел в последнее время и поэтому последние пару недель этой проблемой не занимался.

Хотя я спрашивал у одного своего коллеги-программиста раньше, но он предостерёг меня от баловства с реестром ради решения поставленной задачи. Он мне настоятельно рекомендовал использовать обмен информацией через файл на жёстком диске.

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

 

http://yandex.ru/yandsearch?text=CreateFileMapping&stpar2=%2Fh0%2Ftm123%2Fs1&stpar4=%2Fs1

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

этот адрес можно использовать как адрес структуры. далее, вас ограничивает только фантазия :)

 
solandr >>:

Дайте, пожалуйста, ссылочку на API для работы с реестром.

Пример чтения из реестра.

 

Так я уже библиотеку маленькую написал, уже и советники у меня инфой во всю меняются через реестр. По факту они меняются через оперативку, никаких чтений-записей на диск не наблюдаю. В MSDN написано что лучше не пихать в реестр данные больше пары сотен Кб.

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

Одно НО - библиотека работает только со строковыми параметрами, не более 255 символов длинной (ограничение в MQL). Но этого вполне хватает. Вообще параметры в реестре могут быть разных типов, а не только строки, но пока другие типы на мой взгляд не нужны. Сейчас через реестр у меня меняются два советника, но можно и больше :-). Плюс ёщё в том, что в Win API есть возможнть подключаться к сетевому реесту. Если кому нужен обмен инфой между советниками запущенными на разных машинах в одной сети, то можно посмотреть и в этом направлении. На мой взгляд - быстро, просто и надёжно, и без всяких длл и файлов. Строку загнал - строку получил.

#include "RegLib.mqh"

int hKey;

int init()
{
   // инициализируем дефайны
   InitRegDefines();

   // создаём тестовый ключ
   hKey = CreateKey( HKEY_CURRENT_USER, "!MT4TestKey" );

   // создаём поля по умолчанию
   SetStringValue( hKey, "Bid", "0.0" );
   SetStringValue( hKey, "Ask", "0.0" );

   return( 0 );
}

int start()
{
   // записываем цены в реестр
   SetStringValue( hKey, "Bid", DoubleToStr( Bid, Digits ) );
   SetStringValue( hKey, "Ask", DoubleToStr( Ask, Digits ) );

   // получаем цены в виде строк из реестра
   string BidStr = GetStringValue( hKey, "Bid" );
   string AskStr = GetStringValue( hKey, "Ask" );

   // выводим цены из реестра
   Print( "Bid = ", BidStr, " ", "Ask = ", AskStr );
}

int deinit()
{
   // закрываем ключ
   CloseKey( hKey );
   
   return( 0 );
}
Файлы:
reglib.zip  4 kb
 
Andres писал(а) >>

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

Такое кому-нибудь в голову приходило ? Только это работает для терминалов находящихся на одной машине.

Буду копать в этом направлении :-).

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

 
Integer >>:

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

Но красиво, согласитесь. Еще можно попробовать через переменные ОС.

 
granit77 писал(а) >>

Но красиво, согласитесь. Еще можно попробовать через переменные ОС.

Еще можно через установку системного времени.

 
:))))))))))))))
Причина обращения: