Общие вопросы по разработке > Вылезти из песочницы
Вылезти из песочницы
Нравился мне АД 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.
Давайте попробуем. Может исхитримся как?
Так и работаю с 3.5, жду API на 4.0, но, похоже, дождемся не скоро. Так бы и работал дальше, но 1 декабря 3.5 благополучно скончается.
В целом АД 4 неплох, но язык типа JScript, но даже без возможности создать свою функцию оч напрягает. Однако есть лазейка - поддержка стандартной функциональности NET. Скажем файлы писать можно (где-то на этом форуме видел).
Появилась идея выбраться из песочницы на простор С++ - C# через эту возможность. Файлы, в принципе, можно писать-читать на RAM-диск, Скажем, в формате csv, и дальше уже можно писать на обычном языке программирования и взаимодействовать с АД4.
Но хочется большего, напрмер сделать тоже самое через WCF. Но вот как сделать по простому, без использования функций - ума не приложу. Да и WCF знаю не настолько, чтобы запихнуть все это в ложе языка АД 4.
Давайте попробуем. Может исхитримся как?
- evge
- Администратор
- Сообщения: 1807
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 365 раз
- Контактная информация:
Re: Вылезти из песочницы
С файлами работа есть. Есть ещё и HTTP, но это для передать \ принять данные.
Я написал себе небольшой советник, который отсылает по HTTP запрос на мой сервер с параметрами (GET запроса)
1. email
2. время таймаута
т.е. советник посылает сигнал и там он обновляется уже на сервере в бд или файле (это уже не так важно). Сохраняются: время сигнала, email, таймаут.
и если сервер по истечении некоторого времени (параметр время таймаута) не получает новых GET-запросов отсылается письмо на email (указанный в параметре GET-запроса).
вообщем получился советник, который помогает мне при моем отсутствии за терминалом получать письмо в случае проблем с терминалом (завис или другая причина) или проблем со связью.
Т.е. я смогу среагировать и узнать оперативно о проблеме.
Это актуально если запущены роботы.
Так вот сам АД4 и советник это небольшой скрипт с отправкой этого запроса. А вся остальная логика на PHP на сервере: обработка запросов, отправка почты, cron.
Можно конечно реализовать и другие задачи с помощью отправки и получения данных по HTTP на внешний сервер или локально через файлы.
Например торговлю двух роботов в арбитраж
обмен текущими позициями через файлы.
Но конечно хочется от самого АД4 такой функционал. Работа с несколькими источниками (инструментами), возможно работать с разными таймфремами в одном роботе и при этом же с разными инструментами.
А так да, это всё костыли и лазейки![Улыбается :)](./images/smilies/icon_e_smile.gif)
Я написал себе небольшой советник, который отсылает по HTTP запрос на мой сервер с параметрами (GET запроса)
1. email
2. время таймаута
т.е. советник посылает сигнал и там он обновляется уже на сервере в бд или файле (это уже не так важно). Сохраняются: время сигнала, email, таймаут.
и если сервер по истечении некоторого времени (параметр время таймаута) не получает новых GET-запросов отсылается письмо на email (указанный в параметре GET-запроса).
вообщем получился советник, который помогает мне при моем отсутствии за терминалом получать письмо в случае проблем с терминалом (завис или другая причина) или проблем со связью.
Т.е. я смогу среагировать и узнать оперативно о проблеме.
Это актуально если запущены роботы.
Так вот сам АД4 и советник это небольшой скрипт с отправкой этого запроса. А вся остальная логика на PHP на сервере: обработка запросов, отправка почты, cron.
Можно конечно реализовать и другие задачи с помощью отправки и получения данных по HTTP на внешний сервер или локально через файлы.
Например торговлю двух роботов в арбитраж
![Улыбается :)](./images/smilies/icon_e_smile.gif)
Но конечно хочется от самого АД4 такой функционал. Работа с несколькими источниками (инструментами), возможно работать с разными таймфремами в одном роботе и при этом же с разными инструментами.
А так да, это всё костыли и лазейки
![Улыбается :)](./images/smilies/icon_e_smile.gif)
никогда такого не было и вот опять
Re: Вылезти из песочницы
Файлы я пробовал через RAM диск (не через АД, но для него). Скорость ~ >1ГБ/с. Хороши тем, что можно организовать обратную связь с АД. Типа - читаем-затираем-пишем. CSV - потому как парсить просто.
HTTP - в одну сторону, и, кажется, нужен IIS. Вообще не знаю как с этим из ПО работать. Хотя, помнится, из простенького JScript запрос можно отправить.
Остаются TCP и pipes. WCF смотрю, все вроде и несложно, но реализации в АДScript не просматривается.
Хотя, есть мысль, вдруг Альфа API сделает.) Тогда все это вообще не нужно. Там изначально лежит API-DLL оч неплохая изнутри.) Ох еще давно писал, что вроде к новому году.
Кстати, Какая нибудь инфа есть о планах по развитию АД-Скрипт? Куда хоть движемся?
Да, и непонятка с опционами. Искал официальной инфы на сайте - отсутствует. Только на форуме АД, опять-таки от Ох.
HTTP - в одну сторону, и, кажется, нужен IIS. Вообще не знаю как с этим из ПО работать. Хотя, помнится, из простенького JScript запрос можно отправить.
Остаются TCP и pipes. WCF смотрю, все вроде и несложно, но реализации в АДScript не просматривается.
Хотя, есть мысль, вдруг Альфа API сделает.) Тогда все это вообще не нужно. Там изначально лежит API-DLL оч неплохая изнутри.) Ох еще давно писал, что вроде к новому году.
Кстати, Какая нибудь инфа есть о планах по развитию АД-Скрипт? Куда хоть движемся?
Да, и непонятка с опционами. Искал официальной инфы на сайте - отсутствует. Только на форуме АД, опять-таки от Ох.
Re: Вылезти из песочницы
В общем, так. Для обмена с внешним ПО Буду все-таки использовать файлы. Попробую через System.IO.File, т.к. класс позволяет создавать, читать, и удалять файлы.
Re: Вылезти из песочницы
В итоге получился вот такой код. Особо не заморачивался, собрал нужное из 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;
}
}
Re: Вылезти из песочницы
Иногда нам нужна история, и не в роботе, а на стороне - в БД, Excel, внешних ТС и пр. Приведенный скрипт "выкачивает" историю котировок из АД4 на глубину 2000 1мин баров в файл csv. Дальше АД4 не позволяет.
Пример открытого файла в блокноте. 0-я свеча текущая.
А это ограничения терминала ~2000 баров, хотя на графике эти свечи присутствуют.
![Грустный :(](./images/smilies/icon_e_sad.gif)
Код: Выделить всё
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
- Администратор
- Сообщения: 1807
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 365 раз
- Контактная информация:
Re: Вылезти из песочницы
YUBA писал(а):Приведенный скрипт "выкачивает" историю котировок из АД4 на глубину 2000 1мин баров в файл csv. Дальше АД4 не позволяет.
может попробовать в параметре указать длину истории?
добавив, например так
Код: Выделить всё
AddParameter("P1", 1000, "", 5); //т.е. 1000*5 или другой множитель (не 5), хотя не проверял, может действительно не прочитает больше 2000
никогда такого не было и вот опять
Re: Вылезти из песочницы
Не влияет.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.
- evge
- Администратор
- Сообщения: 1807
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 365 раз
- Контактная информация:
Re: Вылезти из песочницы
evge писал(а):Откуда 4-й параметр, который -"", и что бы он мог значить?
Это описание параметра в стратегиях. В конструкторе, добавляя параметры, есть поле "Описание". Если это описание заполнить и перейти в исходный код, то (3-й) параметр в AddParameter будет заполнен им.
никогда такого не было и вот опять
Re: Вылезти из песочницы
Спасибо. Хотя я его дубль-описание в разделе стратегий и смотрел.evge писал(а):Это описание параметра в стратегиях. В конструкторе, добавляя параметры, есть поле "Описание". Если это описание заполнить и перейти в исходный код, то (3-й) параметр в AddParameter будет заполнен им.
Есть еще одна засада. Переменная I - защищающий от множественной записи файла. При остановке и повторном запуске скрипта I не сбрасывается в 0. В итоге файл при повторном запуске не пишется, и надо удалять скрипт из диспетчера и повторно вводить.
Можно конечно проверять наличие файла History.csv, но интереснее как-то сбросить I в 0.
Явно не хватает события типа OnDeinit().
![Грустный :(](./images/smilies/icon_e_sad.gif)
Последний раз редактировалось YUBA 04 ноя 2016, 00:26, всего редактировалось 1 раз.
Вернуться в «Общие вопросы по разработке»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 29 гостей