Страница 2 из 7

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

Добавлено: 04 ноя 2016, 00:20
evge
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 раз");

}

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

Добавлено: 04 ноя 2016, 00:37
evge
Хотя нет, обманул я

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

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

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

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

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

Добавлено: 04 ноя 2016, 22:41
YUBA
Вопрос по экспорту ист данных решился так.

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

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.))) Параметры передать? - точно так же, ну м.б. чуть сложнее.
Ждем будней, чтобы это окончательно проверить.)

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

Добавлено: 05 ноя 2016, 09:09
evge
В стратегиях (роботах) есть команда:

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

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

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

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

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

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

Добавлено: 07 ноя 2016, 12:22
evge
Andre писал(а):Хорошая идея с файлами


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

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;
}
}


Спасибо!!
С помощью такой конструкции удалось передать индикатор старшего ТФ на ммладший.

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

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

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

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.
Осталось только привести пример чтения из файла различных типов данных, т.к. для этого, в общем случае, необходимо явное преобразования строки к заданному типу данных.

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

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