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

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

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

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

YUBA писал(а):Есть еще одна засада.


YUBA писал(а):множественной записи файла


Решение есть

Пример:

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

/**проверка запуска 1 раз
Developed by evge;**/

function Initialize()
{
   StrategyName = "TestOneRun";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 0;
   ShortLimit = 0;
}

function OnUpdate()
{

if (CurrentIndex == MaxIndex) ShowMessage("Я запустился 1 раз");

}
никогда такого не было и вот опять

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

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

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

Хотя нет, обманул я

он исполнятся будет всегда, при новой свечке.

А вариант с пересозданием советника \ робота - нормальный вариант.
никогда такого не было и вот опять

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

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

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

evge писал(а):Хотя нет, обманул я
он исполнятся будет всегда, при новой свечке.
А вариант с пересозданием советника \ робота - нормальный вариант.
Сейчас тиков нет, он и сработал. :D
Пересоздание - оч. плохой вариант, т.к. мы движемся (пытаемся двигаться) (в этой теме)) к всеобщему единению и согласию.)) Решение уже есть, осталось реализовать.
Судя по индикаторам д.б. CurrentIndex==0, но что там в советниках происходит, м.б и по другому. Завтра распечатаю их, посмотрю, что представляют из себя. Из доков непонятно, что в какую сторону движется.

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

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

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

Вопрос по экспорту ист данных решился так.

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

function Initialize()
{
   StrategyName = "HistorySave";
   //AddParameter("P1", 0, "", 1);
   AddParameter("P1", 1000, 5);


   AddInput("Input1", Inputs.Candle, 1, true, ""); //инструмент и таймфрейм
   LongLimit = 0;
   ShortLimit = 0;
   AddGlobalVariable("I", Types.Int, 0);
   AddGlobalVariable("path", Types.String, @"c:\\dell\\History.csv");//папка в кот пишется файл
   AddGlobalVariable("Control", Types.String, @"c:\\dell\\StartHistory");//файл управления советником
}

function OnUpdate()
{

ShowMessage("Значение I=" + I);
string candle ="OHLS " + Input1.Open[-1000] + "," + Input1.High[-1000];
ShowMessage(candle);
if(System.IO.File.Exists(Control+".csv"))
   {
      I=0;
      System.IO.File.Move(Control+".csv",Control+"1.csv");
      //System.IO.File.Delete(Control+".csv")
   }

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<=3000;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]+","+
}
sw.Close(); sw.Dispose();
ShowMessage("Запись в файл History.csv выполнена");
}
}
I=1;
}
Нам не нужно вновь создавать робот, и после создания в диспетчере он проработает один раз, а далее он находится в дежурном режиме, и без команды он не начнет свое черное дело - теперь он полностью управляем нами.
Мы создаем где то файл - StartHistory.csv - это командный файл. Одно наличие этого файла -это сигнал роботу начать свою деятельность.

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

if(System.IO.File.Exists(Control+".csv"))
   {
      I=0;
      System.IO.File.Move(Control+".csv",Control+"1.csv");
      //System.IO.File.Delete(Control+".csv")
   }
Это все, что мы добавили к предыдущему варианту. И по этому сигналу робот выдает нам историю, переименовывает (или, в другом варианте, удаляет) командный файл. Последний вариант особенно удобен при вызове из другого ПО.
Итак, мы уже управляем роботами, советниками и индикаторвми в АД4.))) Параметры передать? - точно так же, ну м.б. чуть сложнее.
Ждем будней, чтобы это окончательно проверить.)
Последний раз редактировалось YUBA 05 ноя 2016, 15:07, всего редактировалось 4 раза.

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

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

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

В стратегиях (роботах) есть команда:

Stop() – остановить стратегию.

т.е. для разового выполнения кода, достаточно добавить в конце скрипта Stop();

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

Andre
Сообщения: 1
Зарегистрирован: 07 ноя 2016, 11:41

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

Непрочитанное сообщение Andre » 07 ноя 2016, 12:21

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

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

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

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

Andre писал(а):Хорошая идея с файлами


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

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

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

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

YUBA писал(а):В итоге получился вот такой код. Особо не заморачивался, собрал нужное из 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 » 08 ноя 2016, 14:37

Тема непосредственно работы с файлами в общем-то практически исчерпана. Для полноты картины осталось привести пару примеров передачи данных в робот/индикатор.
Код целиком в этот раз приводить не будем. Приведем только часть подвергшуюся изменениям из предыдущего робота и дополнительные строки для ориентации при вставлении кода, выводящего в файл исторические данные.

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

AddGlobalVariable("Control", Types.String, @"c:\\dell\\StartHistory");//файл управления советником
   AddGlobalVariable("N", Types.Int, 500);
}

function OnUpdate()
{

ShowMessage("Значение I=" + I);
string candle ="OHLS " + Input1.Open[-1000] + "," + Input1.High[-1000];
ShowMessage(candle);
if(System.IO.File.Exists(Control+".csv"))
   {
    using (System.IO.StreamReader sr = System.IO.File.OpenText(Control+".csv"))
   {
   string s = "";
      s = sr.ReadLine();
       
        ShowMessage("Строка "+s);
        N=Int32.Parse(s);
      ShowMessage("Число в строке, преобразованное в целое = " + N);

   sr.Close(); sr.Dispose();
   }
      I=0;
      System.IO.File.Move(Control+".csv",Control+"1.csv");
      //System.IO.File.Delete(Control+".csv")
   }

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<N;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");
}
В этом виде наш робот будет читать число и з файла StartHistory.csv, записывать его в переменную N и выводить в файл History.csv заданное количество строк.
Создадим в папке из которой читает робот файл StartHistory1.csv и запишем в него целое число
После числа надо обязательно нажать Enter, чтобы курсор переместился на вторую строку.
После запуска робот выведет в файл первый раз число строк по умолчанию, заданное переменной N.
Удялим файл History.csv и затем переименуем файл StartHistory1.csv в StartHistory.csv.
Наш робот обнаружит наличие файла и выведет заданное нами число строк истории в файл History.csv.
Осталось только привести пример чтения из файла различных типов данных, т.к. для этого, в общем случае, необходимо явное преобразования строки к заданному типу данных.

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

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

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

А я столкнулся с проблемкой.
В индикаторе "А" на графике большего ТФ я записываю значения индикатора в файл.
На графике индикатором "Б" малого ТФ (3с/5с/10с) я считываю эти значения.
Оба графика должны быть открыты, тогда все работает корректно, но...
график малого ТФ ЗАВИСАЕТ.! иногда на несколько десятков секунд.
Через файл передается всего 4 значения.
Робот будет работать с индикатором "Б" малого ТФ
Вопрос к знающим, если кто сталкивался:
Отразится ли зависание графика Малого ТФ на работе робота??


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

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

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