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

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

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

Непрочитанное сообщение YUBA » 08 ноя 2016, 15:28

Владимир Валерьевич писал(а):Отразится ли зависание графика Малого ТФ на работе робота??
В общем случае конечно отразится. Но вот как отразится зависит от конкретной стратегии, например, для стратегии задержки в десятки секунд м.б. совершенно некритичны. Но если это скальпинг, то такие задержки могут привести к полной неработоспособности стратегии.
Было ли подвисание младшего ТФ до использования файлов для передачи данных?

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

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

if(System.IO.File.Exists(File_Name))
{
//открываем и читаем файл
// не забываем закрыть потоки и очистить ресурсы
System.IO.File.Delete(File_Name);
}

Попытка присвоить строку из файла переменной также приведет к ошибке. Поэтому делаем так:

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

 string str ="10";
 int a = Int32.Parse(str) // если в строке целое число
 str="10.27";
 double b=Double.Parse(str); //Если число дробное

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

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

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

Непрочитанное сообщение Владимир Валерьевич » 08 ноя 2016, 21:17

Стратегия не скальперская, но мальньки Тф нужен, чтобы цена не успела выйти из заданого диапазона. Файл не удаляется. Я думаю, что подвисание связано с одновременной попыткой записи и чтения файла, т.к. обращение к нему происходит при каждом изменении цены сразу в двух индикаторах. Надо сделать так, чтобы запись в файл происходила 1 раз в момент формирования нового бара на старшем ТФ. А вот на младшем ТФ именно в момент формирования нового бара обращения к файлу не было. Теперь думаю как это сделать.
....
Раз уж есть у кого спросить, то FileAttributes ?
я в программировании не силен. Имеется ввиду такая проверка FileAttributes?:

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

 FileAttributes attributes = File.GetAttributes("c:/Temp/testfile.txt");
if ((attributes & FileAttributes.Device) <> FileAttributes.Device)
{ чтение файла
} // содрано с msdn

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

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

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

Владимир Валерьевич писал(а): Имеется ввиду такая проверка FileAttributes?:

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

 FileAttributes attributes = File.GetAttributes("c:/Temp/testfile.txt");
if ((attributes & FileAttributes.Device) <> FileAttributes.Device)
{ чтение файла
} // содрано с msdn
Да, имеется в виду нечто в этом роде. Но не FileAttributes.Device - кажется этого аттрибута нет. Возможно -FileAttributes.Offline. Точно не скажу. Конкретно этим вопросом еще не занимался.

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

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

Непрочитанное сообщение Владимир Валерьевич » 09 ноя 2016, 13:43

Пришел к выводу, что зависания связаны с попыткой одномоментного доступа чтения/записи к файлу. Из индикатора малого ТФ чтение перенес в робот. Теперь графики не зависают, зато робот периодически останавливается.
Возможно поможет следующая реализация:
1). какое условие и как прописать в индикаторе большего ТФ, чтобы запись в файл происходила в момент начала формирования нового бара и только один раз.
формально как-то так:
ЕСЛИ (ТекущееВремя < BarTime()+1(2)сек) ТО запись

2).соответственно какое условие и как прописать в индикаторе малого ТФ, чтобы в момент формирования бара обращения к файлу не было, но затем можно считывать его каждый раз при изменении цены.
формально как-то так:
ЕСЛИ (ТекущееВремя > BarTime()+1(2)сек) ТО чтение

Как это закодировать, я увы, не знаю :(

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

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

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

Владимир Валерьевич писал(а):какое условие и как прописать в индикаторе


Завести глобальную переменную

в function Initialize() {...}

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

AddGlobalVariable("LastBarIndex", Types.Int, 0);


в function Evaluate() {...}

прописываем условие для записи

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

if (CurrentIndex != LastBarIndex && CurrentIndex == MaxIndex)
{
//Производим запись
//...
LastBarIndex = CurrentIndex; //запоминаем индекс текущего бара
}


Условие

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

CurrentIndex == MaxIndex


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

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

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

Непрочитанное сообщение YUBA » 09 ноя 2016, 16:53

Владимир Валерьевич писал(а):Пришел к выводу, что зависания связаны с попыткой одномоментного доступа чтения/записи к файлу. Из индикатора малого ТФ чтение перенес в робот. Теперь графики не зависают, зато робот периодически останавливается.
К сожалению не смог напрямую решить задачу передачи файлов без их блокировки средствами АД-Скрипт. Не может он этого, нет у него таких конструкций. (
Пришлось прибегнуть к старому дедовскому способу - семафорам.
Суть в том, что мы пишем файл DataFile, и после завершения записи и закрытия файла выставляем флаг - файл FlagFile.
Приемник обнаруживает флаг и наличие файла данных, что является сигналом, разрешающим чтение даннных из DataFile. С приемной стороны выглядит это так:

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

if(System.IO.File.Exists(FlagFile)& System.IO.File.Exists(DataFile))
{
using (System.IO.StreamReader sr = System.IO.File.OpenText(DataFile))
{
//читаем файл DataFile
sr.Close(); sr.Dispose();
}
System.IO.File.Delete(DataFile); // обязательно удаляем DataFile
}
С приемной стороны оч. мало что изменилось.
С передающей стороны выглядит так:

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

if(System.IO.File.Exists(FlagFile)& !System.IO.File.Exists(DataFile))// обнаруживаем отсутствие DataFile, что означает, что он прочитан приемником
{
System.IO.File.Delete(FlagFile); //удаляем FlagFile, чтобы предотвратить попытки чтения приемником во время записи данных
//создаем DataFile
using (System.IO.StreamWriter sw = System.IO.File.CreateText(DataFile))
{
//b записываем информацию в DataFile
sw.Close(); sw.Dispose();
}
//теперь создаем FlagFile
using (System.IO.StreamWriter sw = System.IO.File.CreateText(FlagFile))
{
//записываем информацию в FlagFile
sw.Write("0" +"\n");
sw.Close(); sw.Dispose();
}
}

Теперь все работает асинхронно, и никто никому не мешает.
PS Первые строчки передатчика лучше переписать так:

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

if(!System.IO.File.Exists(DataFile))// обнаруживаем отсутствие DataFile, что означает, что он прочитан приемником
{
if(System.IO.File.Exists(FlagFile)) System.IO.File.Delete(FlagFile); //удаляем FlagFile, чтобы предотвратить попытки чтения приемником во время записи данных

PS2 Для записи FlagFail можно использовать конструкцию:

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

System.IO.File.WriteAllText(FlagFaile, "0"+"\n");

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

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

Непрочитанное сообщение Владимир Валерьевич » 10 ноя 2016, 10:21

Уважаемые evge и YUBA! Огромное Вам спасибо за участие и помощь!!!
Пока нет времени опробовать Ваши советы, на выходных сделаю.
..
А между прочим знаете, какой побочный эффект, Вы помогли мне наворотить? Исполнение заявки внутри еще формирующегося бара - функционал который отсутствует в AD4. Еще раз спасибо.

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

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

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

Владимир Валерьевич писал(а):А между прочим знаете, какой побочный эффект, Вы помогли мне наворотить? Исполнение заявки внутри еще формирующегося бара - функционал который отсутствует в AD4. Еще раз спасибо.
Даже тему специально прочитал -Анонсированное исполнение внутри бара не состоялось и, признаться, не оч разобрался в теме.
У нас что - заявка робота не выставляется на рынок (брокеру) пока бар не закончился? Объясните вкратце, в чем дело и в чем проблема?

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

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

Непрочитанное сообщение Владимир Валерьевич » 10 ноя 2016, 18:19

Если вкратце, то ф-я OnUpdate() срабатывает после закрытия текущего бара. К примеру, если ТФ -1 час, то целый час никаких действий не будет, пока полностью не сформируется текущий бар. Если ошибаюсь, evge меня поправит, он в этом вопросе лучше разобрался, конкретно с логикой работы OnUpdate() я буду на выходных разбираться. т.к. глядя на сигналы, которые у меня при тестировании возникает вопрос "это вообще откуда". У меня вопросов много.. , так что не прощаюсь.....

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

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

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

Владимир Валерьевич писал(а):Если вкратце, то ф-я OnUpdate() срабатывает после закрытия текущего бара. К примеру, если ТФ -1 час, то целый час никаких действий не будет, пока полностью не сформируется текущий бар.
Спасибо. Сейчас проверил на 1 мин ТФ - срабатывает 1 раз в начале каждой минуты. Изменения графика на OnUpdate() никак не отражаются.
Вообще, это удар ниже пояса. Я искренне полагал, что OnUpdate() срабатывает на каждом тике. Для меня минута - это все равно что бесконечность.)


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

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

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