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

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

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

Непрочитанное сообщение YUBA » 26 янв 2017, 14:34

Leeuwenhoek писал(а):Можно попробовать в OnUpdate сделать Thread.Sleep(). Больше чем уверен на терминал не повлияет.
Но тоже не хотелось бы долго в OnUpdate() зависать. Следующий бар вызовет тот же метод. Если бары будут
приходить чаще чем отрабатывает метод, думаю ничего хорошего не будет. Хотя если торговать H1, M15, M5
то доп затраты в 1-2-3 сек вообще никак не повлияют...
В общем, впихнуть while со Sleep на 15-20 мин со всяческой измериловкой, покрутить поток OnUpdate(), и выяснить как это все функционирует. В т.ч. приход новой свечи. На днях займусь.

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

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

Непрочитанное сообщение YUBA » 26 янв 2017, 15:22

Подключение DLL в AD-Script

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

//Загружаем DLL
string path =@"c:\\NetDLL\\ClassLibrary.dll";
System.Reflection.Assembly  assem;
ShowMessage("Создана переменная assem");
assem = System.Reflection.Assembly.LoadFrom(path);
ShowMessage("Файл ДЛЛ загружен");
Object Cl1 = assem.CreateInstance("ClassLibrary.Class1");
Type t = assem.GetType("ClassLibrary.Class1");

//метод Add(x,y)
System.Reflection.MethodInfo Add = t.GetMethod("Add");
Object[] param = new Object[2];
            param[0] = 4.55;
            param[1] = 3.14;

ShowMessage(Add.Invoke(Cl1, param));

//Метод Hello()
System.Reflection.MethodInfo Hello = t.GetMethod("Hello");
ShowMessage(Hello.Invoke(Cl1, null));

ShowMessage("End of Programm");


Код DLL. Создаем как библиотеку классов.

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

//Class1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary
{
    public class Class1
    {
        public static string Hello()
        {
            return "Привет AD4-Script из NetDLL!";
        }
       
        public static double Add(double a,double b)
        { return a + b; }
    }
}

А это результат работы DLL.
DLL.png
DLL.png (8.31 КБ) 8726 просмотров
Последний раз редактировалось YUBA 18 апр 2017, 21:01, всего редактировалось 1 раз.

Сергей
Сообщения: 34
Зарегистрирован: 01 апр 2016, 17:03

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

Непрочитанное сообщение Сергей » 26 янв 2017, 17:37

YUBA писал(а):
Сергей писал(а):..проблема у меня такая что при создании робота который писал бы исторические данные
для экселя чтото не получается(((
В Ексель напрямую не получится. Наиболее просто в файлы формата CSV. Из этого формата можно уже открыть в Екселе.

Ну а как прописать это в роботе чтоб писал файлы формата CSV??

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

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

Непрочитанное сообщение YUBA » 26 янв 2017, 17:46

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

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

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

Непрочитанное сообщение YUBA » 18 апр 2017, 21:09

Нашел способ не перезагружать DLL при каждом вызове OnUpdate().
Все просто. В Initialize() объявляем переменные, необходимые для работы DLL, в OnUpdate() их инициализируем. При следующих вызовах OnUpdate() только проверяем, что они инициализированы. Больше никаких повторных инициализаций DLL не требуется.
Таким образом, сразу, при в ходе в OnUpdate() вызывать функции DLL, и всю обработку информации АД4 проводить во внешнем ПО. Это уже, практически, полноценное API.

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение Владимир » 15 май 2017, 13:53

Добрый день! YUBA можно более развёрнуто пример кода робота продемонстрировать? С длл всё ясно а как её подключить в роботе тут не совсем понятно компилятор ругается!

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

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

Непрочитанное сообщение YUBA » 16 май 2017, 18:55

Владимир писал(а):Добрый день! YUBA можно более развёрнуто пример кода робота продемонстрировать? С длл всё ясно а как её подключить в роботе тут не совсем понятно компилятор ругается!
На что конкретно ругается? Вначале подключаете простую ДЛЛ - рабочий код выше в примере и добиваетесь ее работоспособности. Там есть и прием и передача данных. Какие данные в последующем вы будете передавать через ДЛЛ и получать из нее - зависит от конкретной стратегии.
Решалась конкретная задача связи с внешним ПО C#. Она решена. Робота под АД4 у меня нет и не будет, т.к скрипт имеет оч небольшие возможности. Постоянно я работаю с Quik, где возможностей получения рыночной информации и работы с ордерами несоизмеримо больше.

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение Владимир » 17 май 2017, 11:32

YUBA писал(а):Нашел способ не перезагружать DLL при каждом вызове OnUpdate().
Все просто. В Initialize() объявляем переменные, необходимые для работы DLL, в OnUpdate() их инициализируем. При следующих вызовах OnUpdate() только проверяем, что они инициализированы. Больше никаких повторных инициализаций DLL не требуется.
Таким образом, сразу, при в ходе в OnUpdate() вызывать функции DLL, и всю обработку информации АД4 проводить во внешнем ПО. Это уже, практически, полноценное API.

Добрый день! Ошибки возникали по причине того, что я в блоке Initialize() объявлял переменные

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

string path =@"c:\\NetDLL\\ClassLibrary.dll";
System.Reflection.Assembly  assem;
ShowMessage("Создана переменная assem");
assem = System.Reflection.Assembly.LoadFrom(path);
ShowMessage("Файл ДЛЛ загружен");

Потом переделал заработало, но может чего то опять сделал не так?

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

function Initialize()
{
   StrategyName = "Conect_Dll";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 0;
   ShortLimit = 0;
   AddGlobalVariable("path", Types.String, @"c:\\NetDLL\\ClassLibrary.dll");//папка с dll
}

function OnUpdate()
{   //Загружаем DLL
//string path =@"c:\\NetDLL\\ClassLibrary.dll";
System.Reflection.Assembly  assem;
ShowMessage("Создана переменная assem");
assem = System.Reflection.Assembly.LoadFrom(path);
ShowMessage("Файл ДЛЛ загружен");
Object Cl1 = assem.CreateInstance("ClassLibrary.Class1");
Type t = assem.GetType("ClassLibrary.Class1");
//метод Add(x,y)
System.Reflection.MethodInfo Add = t.GetMethod("Add");
Object[] param = new Object[2];
            param[0] = 4.5;
            param[1] = 3;
ShowMessage(Add.Invoke(Cl1, param));
//Метод Hello()
System.Reflection.MethodInfo Hello = t.GetMethod("Hello");
ShowMessage(Hello.Invoke(Cl1, null));

ShowMessage("End of Programm");
   /// ПРАВИЛО 1
   if ( (Input1.Open < Input1.Close) )
   {
      EnterLong();
   }
}

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

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

Непрочитанное сообщение YUBA » 17 май 2017, 18:07

Владимир писал(а):Добрый день! Ошибки возникали по причине того, что я в блоке Initialize() объявлял переменные
Потом переделал заработало, но может чего то опять сделал не так?

Если заработало, то все правильно. Для стратегии: теперь Open и Close в ДЛЛ и по ее ответу открываем или закрываем сделку.
Теперь о путях не подгружать ДЛЛ при каждом вызове.
1. На компе организовать небольшой, несколько МБ, RAM-диск (http://www.radeonramdisk.com/software_downloads.php - качаем бесплатную версию) и на него сунуть ДЛЛ. Загрузка осталась, но она будет мгновенной. Способ хорош тем, что оч. прост.
2. Сложнее. В Initialize() нужно через AddGlobalVariable() объявить переменные и присвоить им значения типа long и в них хранить указатели на нужные объекты, и при входе в OnUpdate() присваивать эти значения указателям переменных ДЛЛ, через преобразования типов long -> указатель на объект.

И наконец, если Вы будете подгружать ДЛЛ при каждом вызове OnUpdate(), то нужно озаботиться явным уничтожением созданных объектов перед выходом из OnUpdate() - см. MSDN. Я это не делал, т.к. это демо.

ЗЫ Я, в итоге этой деятельности, отказался от этого решения, и от использования АД4 для стратегий тоже.))

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение Владимир » 19 май 2017, 01:46

Я пока не определился для своей стратегии, что лучше использовать DLL или текстовые файлы? В сего скорей мне больше подойдет описанный Вами пример выше с текстовыми файлами.
В стратегии хочу использовать:
1 Робот работающий на 5 секундном таймфрейме;
2 Данные с дневного графика;
3 Данные с 5 минутного графика и синхронизацию робота по нему. Так как позицию хочу открывать в конце формирования свечи (последние 5-15 секунд). Есть такая нехорошая функция OnUpdate() она не даёт открывать позицию тогда когда хочешь, вот и получается сигнал с индикатора получаешь и теряещь время на ожидание повторного выполнения функции. Открытие позиции происходит на 2 свечи. Вот поэтому есть мысль взять таймфрейм 5 секунд поставить счётчик и периодически его синхронизировать!
4 Управлять числом открытых позиций.
Вот такая идея, вопрос как лучше её реализовать буду думать!
Спасибо за приведённые примеры!


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

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

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