Общие вопросы по разработке > Вылезти из песочницы

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Вылезти из песочницы

Непрочитанное сообщение YUBA » 02 ноя 2016, 18:11

Нравился мне АД 3.5. Особенно API. Ни у одного брокера такого не было. И вот, когда я только собрался менять свое ПО для работы с АД 3.5, сказали, что будет АД 4 несовместимая по API c 3.5. Новость неплохая, но строить новый двигатель для старой телеги - это нонсенс.
Так и работаю с 3.5, жду API на 4.0, но, похоже, дождемся не скоро. Так бы и работал дальше, но 1 декабря 3.5 благополучно скончается.
В целом АД 4 неплох, но язык типа JScript, но даже без возможности создать свою функцию оч напрягает. Однако есть лазейка - поддержка стандартной функциональности NET. Скажем файлы писать можно (где-то на этом форуме видел).
Появилась идея выбраться из песочницы на простор С++ - C# через эту возможность. Файлы, в принципе, можно писать-читать на RAM-диск, Скажем, в формате csv, и дальше уже можно писать на обычном языке программирования и взаимодействовать с АД4.
Но хочется большего, напрмер сделать тоже самое через WCF. Но вот как сделать по простому, без использования функций - ума не приложу. Да и WCF знаю не настолько, чтобы запихнуть все это в ложе языка АД 4.
Давайте попробуем. Может исхитримся как?

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Вылезти из песочницы

Непрочитанное сообщение evge » 02 ноя 2016, 18:22

С файлами работа есть. Есть ещё и HTTP, но это для передать \ принять данные.

Я написал себе небольшой советник, который отсылает по HTTP запрос на мой сервер с параметрами (GET запроса)
1. email
2. время таймаута

т.е. советник посылает сигнал и там он обновляется уже на сервере в бд или файле (это уже не так важно). Сохраняются: время сигнала, email, таймаут.
и если сервер по истечении некоторого времени (параметр время таймаута) не получает новых GET-запросов отсылается письмо на email (указанный в параметре GET-запроса).

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

Т.е. я смогу среагировать и узнать оперативно о проблеме.

Это актуально если запущены роботы.

Так вот сам АД4 и советник это небольшой скрипт с отправкой этого запроса. А вся остальная логика на PHP на сервере: обработка запросов, отправка почты, cron.

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

Например торговлю двух роботов в арбитраж :) обмен текущими позициями через файлы.

Но конечно хочется от самого АД4 такой функционал. Работа с несколькими источниками (инструментами), возможно работать с разными таймфремами в одном роботе и при этом же с разными инструментами.

А так да, это всё костыли и лазейки :)
никогда такого не было и вот опять

YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Re: Вылезти из песочницы

Непрочитанное сообщение YUBA » 02 ноя 2016, 20:40

Файлы я пробовал через RAM диск (не через АД, но для него). Скорость ~ >1ГБ/с. Хороши тем, что можно организовать обратную связь с АД. Типа - читаем-затираем-пишем. CSV - потому как парсить просто.
HTTP - в одну сторону, и, кажется, нужен IIS. Вообще не знаю как с этим из ПО работать. Хотя, помнится, из простенького JScript запрос можно отправить.
Остаются TCP и pipes. WCF смотрю, все вроде и несложно, но реализации в АДScript не просматривается.
Хотя, есть мысль, вдруг Альфа API сделает.) Тогда все это вообще не нужно. Там изначально лежит API-DLL оч неплохая изнутри.) Ох еще давно писал, что вроде к новому году.
Кстати, Какая нибудь инфа есть о планах по развитию АД-Скрипт? Куда хоть движемся?
Да, и непонятка с опционами. Искал официальной инфы на сайте - отсутствует. Только на форуме АД, опять-таки от Ох.

YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Re: Вылезти из песочницы

Непрочитанное сообщение YUBA » 02 ноя 2016, 22:30

В общем, так. Для обмена с внешним ПО Буду все-таки использовать файлы. Попробую через System.IO.File, т.к. класс позволяет создавать, читать, и удалять файлы.

YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Re: Вылезти из песочницы

Непрочитанное сообщение YUBA » 03 ноя 2016, 14:32

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

Код: Выделить всё

function Initialize()
{
   StrategyName = "FileSave";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 0;
   ShortLimit = 0;
   AddGlobalVariable("I", Types.Int, 0);
   AddGlobalVariable("path", Types.String, @"c:\\dell\\MyTest.txt");
}

function OnUpdate()
{

ShowMessage("aaa " + I);
if(I==0)
{
//string path = @"c:\dell\MyTest.txt";
using (System.IO.StreamWriter sw = System.IO.File.CreateText(path))
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
sw.Close(); sw.Dispose();
}
using (System.IO.StreamReader sr = System.IO.File.OpenText(path))
{
string s = "";
   while ((s = sr.ReadLine()) != null)
       {
        ShowMessage(s);
        }
sr.Close(); sr.Dispose();
}
I=1;
}
}

YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Re: Вылезти из песочницы

Непрочитанное сообщение YUBA » 03 ноя 2016, 20:56

Иногда нам нужна история, и не в роботе, а на стороне - в БД, Excel, внешних ТС и пр. Приведенный скрипт "выкачивает" историю котировок из АД4 на глубину 2000 1мин баров в файл csv. Дальше АД4 не позволяет. :(

Код: Выделить всё

function Initialize()
{
   StrategyName = "HistorySave";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "SIZ6=ФОРТС"); //инструмент и таймфрейм
   LongLimit = 0;
   ShortLimit = 0;
   AddGlobalVariable("I", Types.Int, 0);
   AddGlobalVariable("path", Types.String, @"c:\\dell\\History.csv");//папка в кот пишется файл
}

function OnUpdate()
{

ShowMessage("Значение I=" + I);
string candle ="OHLS " + Input1.Open[-1000] + "," + Input1.High[-1000];
ShowMessage(candle);
if(I==0)
{
//string path = @"c:\dell\History.csv";
using (System.IO.StreamWriter sw = System.IO.File.CreateText(path))
{
ShowMessage("Производится запись в файл History.csv");
sw.WriteLine("Num,Date,Time,Open,High,Low,Close,Volume,VolumeAsk,VolumeBid,OpenInterest");
for(int i=0;i<=2000;i++)
{
sw.Write(""+i+","+BarDate(-i)+","+BarTime(-i)+"," +Input1.Open[-i] +","+Input1.High[-i]+","+Input1.Low[-i]+","+
Input1.Close[-i]+","+Input1.Volume[-i]+","+ Input1.VolumeAsk[-i]+","+Input1.VolumeBid[-i]+","+
Input1.OpenInterest[-i]+ "\n");
}
sw.Close(); sw.Dispose();
ShowMessage("Запись в файл History.csv выполнена");
}
}
I=1;
}

Пример открытого файла в блокноте. 0-я свеча текущая.

Код: Выделить всё

Num,Date,Time,Open,High,Low,Close,Volume,VolumeAsk,VolumeBid,OpenInterest
0,03.11.2016 00:00:00,22:15:00,64243,64247,64234,64247,1817,766,1051,3461842
1,03.11.2016 00:00:00,22:14:00,64250,64251,64240,64240,545,221,324,3462982
2,03.11.2016 00:00:00,22:13:00,64247,64251,64245,64250,701,354,347,3462674
3,03.11.2016 00:00:00,22:12:00,64242,64248,64235,64247,708,256,452,3462802
4,03.11.2016 00:00:00,22:11:00,64251,64255,64241,64241,649,248,401,3462728
5,03.11.2016 00:00:00,22:10:00,64252,64258,64248,64249,978,452,526,3462804

А это ограничения терминала ~2000 баров, хотя на графике эти свечи присутствуют.

Код: Выделить всё

1996,01.11.2016 00:00:00,15:44:00,63795,63802,63788,63788,1977,1007,970,3529376
1997,01.11.2016 00:00:00,15:43:00,63795,63802,63794,63794,983,622,361,3529732
1998,01.11.2016 00:00:00,15:42:00,63802,63804,63790,63797,2437,939,1498,3529630
1999,01.01.0001 00:00:00,00:00:00,не число,не число,не число,не число,не число,не число,не число,не число
2000,01.01.0001 00:00:00,00:00:00,не число,не число,не число,не число,не число,не число,не число,не число

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Вылезти из песочницы

Непрочитанное сообщение evge » 03 ноя 2016, 23:01

YUBA писал(а):Приведенный скрипт "выкачивает" историю котировок из АД4 на глубину 2000 1мин баров в файл csv. Дальше АД4 не позволяет.


может попробовать в параметре указать длину истории?

добавив, например так

Код: Выделить всё

AddParameter("P1", 1000, "", 5); //т.е. 1000*5 или другой множитель (не 5), хотя не проверял, может действительно не прочитает больше 2000
никогда такого не было и вот опять

YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Re: Вылезти из песочницы

Непрочитанное сообщение YUBA » 03 ноя 2016, 23:37

evge писал(а):может попробовать в параметре указать длину истории?
добавив, например так

Код: Выделить всё

AddParameter("P1", 1000, "", 5); //т.е. 1000*5 или другой множитель (не 5), хотя не проверял, может действительно не прочитает больше 2000
Не влияет.
Кстати, что за? В скрипте (это строилось автоматом)

Код: Выделить всё

AddParameter("P1", 1000,"", 5);
В документации:

Код: Выделить всё

AddParameter(Name,  Value)
AddParameter(Name,  Value, Length) – функция добавление в индикатор параметра, который можно задавать через форму настройки.
Параметры:
•   Name – имя параметра, должно удовлетворять требованиям описания переменной содержать латинские символы и цифры.
•   Value – значение по умолчанию   
•   Length – опциональный параметр, определяющий масштабный коэффициент (опциональный параметр), позволяющий определять требуемую длину истории для правильного расчета индикатора.
o   Length = 0 или нет данного параметра – параметр не влияет на загрузку требуемой истории по инструменту;
o   Length > 1 – в качестве требуемой длины истории  для расчета индикатора берется значение равное Length * Value.
Откуда 4-й параметр, который -"", и что бы он мог значить?

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Вылезти из песочницы

Непрочитанное сообщение evge » 03 ноя 2016, 23:54

evge писал(а):Откуда 4-й параметр, который -"", и что бы он мог значить?


Это описание параметра в стратегиях. В конструкторе, добавляя параметры, есть поле "Описание". Если это описание заполнить и перейти в исходный код, то (3-й) параметр в AddParameter будет заполнен им.
никогда такого не было и вот опять

YUBA
Сообщения: 43
Зарегистрирован: 02 ноя 2016, 16:38
Поблагодарили: 4 раза

Re: Вылезти из песочницы

Непрочитанное сообщение YUBA » 04 ноя 2016, 00:06

evge писал(а):Это описание параметра в стратегиях. В конструкторе, добавляя параметры, есть поле "Описание". Если это описание заполнить и перейти в исходный код, то (3-й) параметр в AddParameter будет заполнен им.
Спасибо. Хотя я его дубль-описание в разделе стратегий и смотрел.
Есть еще одна засада. Переменная I - защищающий от множественной записи файла. При остановке и повторном запуске скрипта I не сбрасывается в 0. В итоге файл при повторном запуске не пишется, и надо удалять скрипт из диспетчера и повторно вводить.
Можно конечно проверять наличие файла History.csv, но интереснее как-то сбросить I в 0.
Явно не хватает события типа OnDeinit(). :(
Последний раз редактировалось YUBA 04 ноя 2016, 00:26, всего редактировалось 1 раз.


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей