Как создать библиотеку dll

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
Эдуард
Сообщения: 1
Зарегистрирован: Пт мар 19, 2010 11:20 am

Как создать библиотеку dll

#1 Сообщение Эдуард » Пт мар 19, 2010 11:47 am

Подскажите как создать библиотеку dll и прикрепить ее к FT на примере простого индикатора для Delphi7, интересен не код индикатора или советника, а порядок установки библиотеки.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Как создать библиотеку dll

#2 Сообщение Terranin » Пт мар 19, 2010 5:43 pm

Эдуард писал(а):Подскажите как создать библиотеку dll и прикрепить ее к FT на примере простого индикатора для Delphi7, интересен не код индикатора или советника, а порядок установки библиотеки.
После создания библиотеки заходите в тестере в меню Файл -> Установить новый индикатор/стратегию.
Asta la vista
Mike

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

Чёй-то я не допонял малёхо

#3 Сообщение Николай Тарасов » Вт ноя 23, 2010 6:19 pm

Чёй-то я не допонял малёхо

1. Здравствуйте, Михаил (он же Terranin).
Подробности о вас нашёл здесь:
- http://blog.swrus.com/users/1340/
- http://www.youtube.com/user/Terranin#p/u
// Похоже, вы, Михаил, и впрямь из Канады.
То-то я смотрю, у вас такие достойные англоязычные сайты (www.forextester.com и www.fx-metropolis.com), видео-приложения, озвучка и всё такое. Хороший промоушен.
Надо будет изучить книжку, что вы рекомендовали создателям игр вот здесь: http://content.mail.ru/arch/11320/535165.html
Вообще было интересно узнать о вас больше, чем может дать фото. Так сказать познакомиться с вами поближе. //

2. Здравствуйте, Александр (он же FT Support). Простите, не нашёл о вас никаких сведений.

3. На днях купил таки ваш тестировщик. Целый год тянул с этим.
// Радуют значительные подвижки в возможностях вашей программы, произошедшие за это время. Отдельное: «СПАСИБО ВАМ ЗА ЭТО!» Надеюсь, что и впредь будет так.
Не сомневаюсь, у этого вашего проекта впечатляющие перспективы. Желаю вам и ему долгих лет процветания! //

4. Теперь о деле. Хочу прицепить к графикам свои индикаторы и скрипты (в перспективе – стратегии).

а) стал разбираться, как это у вас делается…

б) установил Delphi7…

в) за основу своего индикатора взял схожий индикатор из вашей копилки:
C:\ForexTester2\Examples\Indicators\Delphi\IndicatorsSrc\ PriceChannel.dpr.
// Так удобнее, когда ещё не знаком с языком. Думаю, все так делают. //

г) переименовал его, внёс лёгкие поправки в текст кода (в среде Delphi7, конечно).

д) хотел, было, создать dll-файл, чтобы прикрепить его к тестировщику (как это вами было описано выше). Но не тут-то было – создать dll-файл сходу у меня не получилось.
// Для чистоты эксперимента попытался проделать тоже самое с исходным (неизменённым) dpr-файлом. Результат прежний. Delphi7 раз за разом выдаёт ошибку… //

е) просмотрел форум, в надежде, что кто-то уже сталкивался с подобной проблемой, но не встретил подходящих рекомендаций. Многие юзеры либо в бессилии просто «опускают руки», либо как два известных генерала ищут «мужика-умельца», который решит все их проблемы, либо начинают «бычиться» и «гнать волну»…

ё) стал искать в сети, как создать библиотеку dll. Полистал несколько публикаций – всё не то, да и сложно как-то. И не мудрено – ведь обучают в основном тому, как написать программу с нуля… :(
А мне надо-то – лишь узнать/научиться, как из готового рабочего Delphi-проекта (взятого из вашей копилки) получить dll-файл. И всё (пока что).

5. Помогите, пожалуйста. Разъясните на пальцах, как, и что надо делать. Какие разделы меню открывать, и/или какие кнопки нажимать в этом самом Delphi7, чтобы из dpr-файла получился dll-файл?

Заранее благодарю.
Последний раз редактировалось Николай Тарасов Вт ноя 23, 2010 6:32 pm, всего редактировалось 1 раз.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#4 Сообщение Николай Тарасов » Вт ноя 23, 2010 6:30 pm

А ларчик просто открывался

«...А ларчик просто открывался.»
Из басни Крылова
(http://www.stihi-rus.ru/1/krylov/13.htm)



Ха!

1. Готовил предыдущий пост. Для конкретики решил процитировать текст ошибки:
«[Fatal Error] PriceChannel.dpr(9): File not found: 'IndicatorInterfaceUnit.dcu'»
Внимательно вчитался и понял, что файл 'IndicatorInterfaceUnit.dcu' уже видел. Стал искать. Оказалось, он был у меня под самым носом – в той же папке, где лежат исходники индикаторов!

2. Скопировал 'IndicatorInterfaceUnit.dcu' в папку со своим новым проектом. На всякий случай ещё и ‘TechnicalFunctions.dcu’ с ‘readme.txt’ туда же бросил.

3. Снова попробовал скомпилировать (в Delphi7 за это отвечает процедура «Build <my indicator>» из раздела меню «Project»): //См. рис. в конце. //
И («О, Чудо!») – всё получилось: столь долгожданный ‘<my indicator>.dll’ готов! :)

4. Скопировал ‘<my indicator>.dll’ в папку: «C:\ForexTester2\Indicators\». Запустил тестировщик. И сразу же (без специальной установки) прикрепил к графику свой новый индикатор, выбрав его из списка. Вот и всё.

5. Ура!!! Теперь я знаю, как это делается!
Оказывается, создать свой индикатор в Forex Tester 2 очень и очень просто! С помощью Delphi7 делается это легко и непринуждённо – в одно-два касание! :)
Не сложнее, чем в столь любимом публике MetaTrader4 (MT4)!

// Как тут не вспомнить Пушкина?!
«эMTэ, я думал о тебе!
эMTэ... как много в этом звуке
Для сердца русского слилось!
Как много в нем отозвалось!»
:)//

Надеюсь, остальные задачи в FT2 будут решаться также легко.

4. Ну вот, на данный момент это, пожалуй, всё, чем я хотел поделиться со всеми.
Разрешите откланяться.
Спасибо всем.
Аплодисментов не надо…
;)
Буду рад, если мой пока ещё небольшой опыт работы с Forex Tester’ом пригодится ещё кому-то.
Вложения
Build to PriceChannel+.JPG
(131.13 КБ) 7800 скачиваний
Я желаю всем счастья.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#5 Сообщение Terranin » Вт ноя 23, 2010 6:54 pm

Глубоко копаете однако. :)

Для создания индикатора нужно рядом с ним положить файлики IndicatorInterfaceUnit.pas (и TechnicalFunctions.pas если нужно использовать дополнительные функции). При компилляции из них будут созданы *.dcu файлы и как результат *.dll файл библиотеки. (можно не класть их а держать в одном месте и просто добавлять в проект через Project -> Add to project , тогда дельфи будет знать где их искать).

После создании dll не рекомендуется вручную ее кидать в Indicators (для этого прийдется перезапускать тестер, кроме того копии этого файла могут остаться висеть на графиках и их прийдется удалять вручную). Вместо этого надо зайти в меню Файл -> Установить -> Индикатор (стратегию/скрипт). Эта процедура все сама сделает корректно и перезапускать программу не прийдется. Особенно это удобно когда в индикатор вносятся изменения и тут же тестируются в тестере.
Asta la vista
Mike

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#6 Сообщение Николай Тарасов » Чт ноя 25, 2010 1:01 pm

Не получается скрипт

Михаил, доброе утро.

1. У меня не получается «Установить новый скрипт».
FT2 ругается: ‘Can not install script, file will be deleted.’

// Сделал две попытки.
Один пробный скрипт переделал из индикатора ‘ObjectsTest.dpr’, другой – из одноимённой стратегии ‘ObjectsTest.dpr’.
Делал по-тупому – просто все слова ‘Indicator’ и ‘Strategy’ заменил на ‘Script’.
Проблем при создании dll-файлов не возникало. //


2. Опубликуйте, пожалуйста, хоть один образец скрипта.
Для наглядности желательно с тем же наполнением, что и индикатор/стратегия ‘ObjectsTest.dpr’.

Заранее благодарю.
Я желаю всем счастья.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#7 Сообщение Terranin » Чт ноя 25, 2010 5:03 pm

Николай Тарасов писал(а):Не получается скрипт

Михаил, доброе утро.

1. У меня не получается «Установить новый скрипт».
FT2 ругается: ‘Can not install script, file will be deleted.’

// Сделал две попытки.
Один пробный скрипт переделал из индикатора ‘ObjectsTest.dpr’, другой – из одноимённой стратегии ‘ObjectsTest.dpr’.
Делал по-тупому – просто все слова ‘Indicator’ и ‘Strategy’ заменил на ‘Script’.
Проблем при создании dll-файлов не возникало. //


2. Опубликуйте, пожалуйста, хоть один образец скрипта.
Для наглядности желательно с тем же наполнением, что и индикатор/стратегия ‘ObjectsTest.dpr’.

Заранее благодарю.
Скрипт из индикатора не получится. Структура скрипта:

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

library <Script name>;

uses
  // интерфейсный модуль
  ScriptInterfaceUnit;

var
  // внешние параметры
  ...

  // внутренние переменные
  ...
 
//-------------------------------------------
// процедура инициализации
//-------------------------------------------
procedure Init; stdcall;
begin
  // определяем внешние параметры и внутренние переменные
  // тоже самое что и в стратегии/индикаторе
  ...
end;
 
//-------------------------------------------
// процедура деинициализации
//-------------------------------------------
procedure Done; stdcall;
begin
  // освобождаем память если ее занимали для некоторых переменных
  ...
end;

//-------------------------------------------
// Выполнить скрипт
//-------------------------------------------
procedure Execute; stdcall;
begin
  // что-то делаем
  ...
end;

exports
  Init, Done, Execute;

end.
скрипты вобщем работают точно также как и стратегии (не индикаторы). Только стратегия вызывается на каждом тике а скрипты по комбинации клавиш. То что не удавалось установить скрипт - это потому что в нем небыло процедур init, done, execute.

Я еще не успел написать примеры скриптов, будут попозже.
Asta la vista
Mike

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#8 Сообщение Николай Тарасов » Чт ноя 25, 2010 6:32 pm

Вопрс 1.
Terranin писал(а): Скрипт из индикатора не получится.
Странно. Неужели скрипт не сможет один раз нарисовать несколько объектов, как это делают ваши индикатор ObjectsTest и стратегия ObjectsTest?

Вопрос 2.
Terranin писал(а): ... скрипты вызывается по комбинации клавиш.
А что, разве в FT2 скриптом нельзя "капнуть" на график? В МТ4 эту функцию очень удобно использовать - ведь снимается информация о баре, на который "упала капля" (технология "drag and drop"). И уже потом, опираясь на этот опорный бар, можно делать всё что пожелаешь.
Я желаю всем счастья.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#9 Сообщение Terranin » Чт ноя 25, 2010 7:07 pm

Николай Тарасов писал(а):Вопрс 1.
Terranin писал(а): Скрипт из индикатора не получится.
Странно. Неужели скрипт не сможет один раз нарисовать несколько объектов, как это делают ваши индикатор ObjectsTest и стратегия ObjectsTest?

Вопрос 2.
Terranin писал(а): ... скрипты вызывается по комбинации клавиш.
А что, разве в FT2 скриптом нельзя "капнуть" на график? В МТ4 эту функцию очень удобно использовать - ведь снимается информация о баре, на который "упала капля" (технология "drag and drop"). И уже потом, опираясь на этот опорный бар, можно делать всё что пожелаешь.
1. Сможет, я имел ввиду что он работает как стратегия (можно использовать все теже функции что и в стратегии кроме создания индикаторов) но не как индикатор.

2. Капнуть на график нельзя, скрипт исполняется по горячей клавиши или двойному щелчку мыши на скрипте. При этом в скрипте будет установлен контекст текущего графика (т.е. Symbol, bid, ask и т.д. по выделенному графику).
Asta la vista
Mike

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#10 Сообщение Николай Тарасов » Чт ноя 25, 2010 9:21 pm

Terranin писал(а): Капнуть на график нельзя...
А жаль!
Теперь придётся как-то изворачиваться...
// Ну да ничего, что-нибудь придумаю...
"Что не делается - к лучшему", - говорят. :) //


И всё-таки, Михаил, может быть, в дальнейшем добавите технологию "капли"?
У вас, вроде, всё для этого готово. Я тут просматривал файл 'IndicatorInterfaceUnit.pas' и в перечне новшеств версии 1.10 увидел шесть функций для работы с экранными координатами X-Y? Это же очень близкие вещи. Почти одно и тоже…
// Хотя, что тут говорить – в любом случае вам решать. Хозяин, как известно – он же барин. //

PS
Решил узнать, что же на самом деле означает ваша подпись... :?
// Подробности об этой легендарной фразе см. здесь: http://forum.lingvo.ru/actualthread.aspx?tid=4037 //
Всё просто: "До встречи. Михаил".
Выходит, никакой "Амерки" я не открыл, "глубоко копАя". :)
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#11 Сообщение Николай Тарасов » Вс ноя 28, 2010 12:17 pm

Образец скрипта

Здравствуйте, Михаил.

Вот то, о чём я вас недавно просил (см. код ниже).
Это скрипт по имени ObjectsTest. Делает то же самое, что и ваши одноимённые индикатор и стратегия, потому как сделан на их основе.

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

//--------------------------------------------------------------------------
// Objects test - Example how to work with objects from Script
//--------------------------------------------------------------------------
library ObjectsTest;

uses
  ScriptInterfaceUnit;

//-------------------------------------------
// Initialize Script
//-------------------------------------------
procedure Init; stdcall;
begin
  ScriptShortName('ObjectsTest');
  ScriptDescription('Objects'' interface test');
end;

//-------------------------------------------
// Deinitialize Script
//-------------------------------------------
procedure Done; stdcall;
begin

end;

//-------------------------------------------
// Execute Script
//------------------------------------------- 
procedure Execute; stdcall;
var
  i: integer;
const
  names: array[0..8] of string = ('Line0', 'Line1', 'Line2', 'Line3', 'Fibo1',
    'Fibo2', 'Fibo3', 'Fibo4', 'Text1');

begin

  if Bars < 80 then
    exit;

  // create vertical line
  if not(ObjectExists(names[0])) then
    begin
      ObjectCreate(names[0], obj_VLine, 0, Time(0), 0);
///      ObjectSet(names[0], OBJPROP_STYLE, integer(psDot));
///      ObjectSet(names[0], OBJPROP_COLOR, clYellow);
      ObjectSet(names[0], OBJPROP_WIDTH, 1);
    end;

  // create horizontal line
  if not(ObjectExists(names[1])) then
    ObjectCreate(names[1], obj_HLine, 0, 0, Close(0));

  // create trend line
  if not(ObjectExists(names[2])) then
    ObjectCreate(names[2], obj_TrendLine, 0, Time(10), Close(10),
      Time(0), Close(0));

  // create ray
  if not(ObjectExists(names[3])) then
    ObjectCreate(names[3], obj_Ray, 0, Time(10), Open(10),
      Time(0), Open(0));

  // create fibo retracement
  if not(ObjectExists(names[4])) then
    begin
      ObjectCreate(names[4], obj_FiboRetracement, 0, Time(40), Close(40),
        Time(10), Close(10));
      ObjectSet(names[4], OBJPROP_FIBOCLOSEDENDS, 1);
      ObjectSet(names[4], OBJPROP_FIBOSHOWPRICE, 0);
      ObjectSet(names[4], OBJPROP_FIBOENDWIDTH, 40);

      // define 3 levels
      ObjectSet(names[4], OBJPROP_FIBOLEVELS, 3);
      for i:=0 to 2 do
        begin
          ObjectSet(names[4], OBJPROP_FIBOLEVELN, i);
          ObjectSet(names[4], OBJPROP_LEVELVALUE, i*50);
///          ObjectSet(names[4], OBJPROP_LEVELCOLOR, clBlue);
///          ObjectSet(names[4], OBJPROP_LEVELSTYLE, integer(psDot));
          ObjectSet(names[4], OBJPROP_LEVELWIDTH, 1);
        end;
    end;

  // create fibo fan
  if not(ObjectExists(names[5])) then
    begin
      ObjectCreate(names[5], obj_FiboFan, 0, Time(80), Close(80),
        Time(50), Close(50));

      // define 3 levels
      ObjectSet(names[5], OBJPROP_FIBOLEVELS, 3);
      for i:=0 to 2 do
        begin
          ObjectSet(names[5], OBJPROP_FIBOLEVELN, i);
          ObjectSet(names[5], OBJPROP_LEVELVALUE, i*30);
///          ObjectSet(names[5], OBJPROP_LEVELCOLOR, clGreen);
///          ObjectSet(names[5], OBJPROP_LEVELSTYLE, integer(psSolid));
          ObjectSet(names[5], OBJPROP_LEVELWIDTH, 1);
        end;
    end;

  // create text
  if not(ObjectExists(names[8])) then
    begin
      ObjectCreate(names[8], obj_Text, 0, Time(10), Close(0));
///      ObjectSetText(names[8], 'Test text', 12, 'Arial', clYellow);
      ObjectSet(names[8], OBJPROP_VALIGNMENT, tlBottom);
      ObjectSet(names[8], OBJPROP_HALIGNMENT, taLeftJustify);
    end;


  // set vertical line props
  ObjectSet(names[0], OBJPROP_TIME1, Time(0));

  // set horizontal line props
  ObjectSet(names[1], OBJPROP_PRICE1, Close(0));

  // set trend line props
  ObjectSet(names[2], OBJPROP_TIME1, Time(10));
  ObjectSet(names[2], OBJPROP_PRICE1, Close(10));
  ObjectSet(names[2], OBJPROP_TIME2, Time(0));
  ObjectSet(names[2], OBJPROP_PRICE2, Close(0));

  // set ray props
  ObjectSet(names[3], OBJPROP_TIME1, Time(10));
  ObjectSet(names[3], OBJPROP_PRICE1, Open(10));
  ObjectSet(names[3], OBJPROP_TIME2, Time(0));
  ObjectSet(names[3], OBJPROP_PRICE2, Open(0));

  // set fibo retracement props
  ObjectSet(names[4], OBJPROP_TIME1, Time(40));
  ObjectSet(names[4], OBJPROP_PRICE1, Close(40));
  ObjectSet(names[4], OBJPROP_TIME2, Time(10));
  ObjectSet(names[4], OBJPROP_PRICE2, Close(10));

  // set fibo fan props
  ObjectSet(names[5], OBJPROP_TIME1, Time(80));
  ObjectSet(names[5], OBJPROP_PRICE1, Close(80));
  ObjectSet(names[5], OBJPROP_TIME2, Time(50));
  ObjectSet(names[5], OBJPROP_PRICE2, Close(50));

  // set text props
  ObjectSet(names[8], OBJPROP_TIME1, Time(10));
  ObjectSet(names[8], OBJPROP_PRICE1, Close(0));
end;
exports 

Init, Done, Execute; 

end.
Привожу код для того, чтобы у пользователей FT2 появился хоть один живой обрзец скрипта.

Обратите ВНИМАНИЕ!
Скрипт ObjectsTest начинает рисовать объекты только лишь, когда отрисовано хотя бы 80 баров (в режиме "Тестирование")!!!
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#12 Сообщение Николай Тарасов » Пн ноя 29, 2010 8:25 am

Да, чуть не забыл.
Семь строчек кода (см. строчки с тройными наклонными разделителями в начале строки), устанавливающие некоторые свойства объектов, пришлось исключить, чтобы компилятор не ругался.

Вот сообщение об ошибках:
[Error] ObjectsTest.dpr(45): Undeclared identifier: 'psDot'
[Error] ObjectsTest.dpr(46): Undeclared identifier: 'clYellow'
[Error] ObjectsTest.dpr(79): Undeclared identifier: 'clBlue'
[Error] ObjectsTest.dpr(97): Undeclared identifier: 'clGreen'
[Error] ObjectsTest.dpr(98 ): Undeclared identifier: 'psSolid'


В целом это мелочи. Но всё-таки, в чём тут дело? Что я делал не так?
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#13 Сообщение FT Support » Пн ноя 29, 2010 8:57 am

Здравствуйте, Николай,

Скорее всего нужно подключить библиотеку TechnicalFunctions чтобы исправить эти ошибки.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#14 Сообщение Николай Тарасов » Ср дек 01, 2010 12:52 am

Здравствуйте, Александр.

Из скрипта не могу сменить стиль, толщину и цвет у объекта ‘TrendLine’ (как, впрочем, и цвет у объекта ‘Text’). В том числе - через явное указание числового значения стиля, толщины и цвета.

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

  // create  trend
  if not(ObjectExists(name[0])) then
    begin
      ObjectCreate(name[0], obj_TrendLine, 0,
                    time1, price1,
                    time2, price2);
//      ObjectSet(name[0], OBJPROP_LEVELCOLOR,        clGreen); 
//      ObjectSet(name[0], OBJPROP_LEVELCOLOR,      'clGreen'); 
//      ObjectSet(name[0], OBJPROP_LEVELCOLOR,        'Green'); 
//      ObjectSet(name[0], OBJPROP_LEVELCOLOR,        clGreen); 
//      ObjectSet(name[0], OBJPROP_LEVELCOLOR, integer(clGreen));
//      ObjectSet(name[0], OBJPROP_LEVELCOLOR,             64);
      ObjectSet(name[0], OBJPROP_LEVELCOLOR,      $01000000);
//      ObjectSet(name[0], OBJPROP_LEVELSTYLE, integer(psDot));
      ObjectSet(name[0], OBJPROP_LEVELSTYLE,              4);
      ObjectSet(name[0], OBJPROP_LEVELWIDTH,              4);
    end;
Скажите, пожалуйста, как можно ещё, числами например, задать параметры объектов? Можно ли ознакомиться с таблицей явной кодировки цветов, стилей и толщин объектов?

Подключение библиотеки 'TechnicalFunctions' не помогло. Ошибки компиляции не исчезли. :(
Последний раз редактировалось Николай Тарасов Ср дек 01, 2010 1:38 am, всего редактировалось 2 раза.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#15 Сообщение Николай Тарасов » Ср дек 01, 2010 1:23 am

Да, вот ещё что.

1. У объекта 'Text' я не смог поменять/установить только лишь цвет. :!:
Остальные параметры (в том числе размер шрифта) регулируются. Но для этого мне пришлось в функции установки отбросить непослушный параметр "Цвет":

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

      ObjectCreate(name[0], obj_Text, 0, Time(40), Close(40));
///      ObjectSetText(names[0], 'Text1', 10, 'Arial', clYellow);
      ObjectSetText(names[0], 'Text1', 10, 'Arial');
2. При любых параметрах (цвет, стиль и толщина) вышеуказанного объекта 'TrendLine' он рисуется сплошной красной линией минимальной толщины...

Как-то это всё странно. Может быть, вы проверите у себя тестовый скрипт?
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#16 Сообщение Николай Тарасов » Ср дек 01, 2010 2:17 am

Как присвоить текстовой надписи цифровое значение?

Понимаю, что мимо главной темы, но всё же спрошу. :?
В файле 'TechnicalFunctions' (для скриптов) нашёл функцию 'StrPriceType'. Решил применить:

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

      ObjectSetText(name[0], StrPriceType(Time(40)), 10, 'Arial');
Но столкнулся с теми же проблемами, что описаны выше - компилятор ругается:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
Здесь-то что не так? :?:


PS
Впору переносить эту ветку в отдельную тему "Вопросы по скрипту" или что-то в этом роде.
:arrow:
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#17 Сообщение FT Support » Ср дек 01, 2010 7:14 am

Здравствуйте, Николай, скрипт у себя проверили, оказывается нужно просто добавить библиотеку graphics и всё будет работать.

Кстати обратите внимание на то, что пунктирные линии будут рисоваться только при толщине 1, если сделать линию толще, то она будет сплошной, это ограничения Windows, в МетаТрейдере например та же ситуация.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#18 Сообщение FT Support » Ср дек 01, 2010 7:21 am

По поводу ошибки с вот этим кодом:

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

ObjectSetText(name[0], StrPriceType(Time(40)), 10, 'Arial');
Код неверный потому что функция StrPriceType принимает тип цены, а Вы передаёте туда дату/время, и вот несоответствие типов.

Пример использования функции StrPriceType такой:

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

Print(StrPriceType(pt_Close));
// в этом случае функция вернёт "Close"
Чтобы присвоить текстовому объекту числовое значение нужно использовать стандартные функции дельфи например IntToStr чтобы перевести число в строку

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#19 Сообщение Николай Тарасов » Ср дек 01, 2010 7:37 pm

Как добавить библиотеку 'graphics'
FT Support писал(а):Здравствуйте, Николай, скрипт у себя проверили, оказывается нужно просто добавить библиотеку graphics и всё будет работать...
Замечательно! :)
А я, уж было, свой Delphi7 начал подозревать.
Вот бы ещё узнать, как это делается... :D
Александр, если вас не затруднит, опишите, пожалуйста, как добавить библиотеку 'graphics'. :?:
А то я, пока что в Delphi7 "не ухо не рыло". Боюсь, как бы ни навредить. А вы в этом деле, не сомневаюсь, уж не одну "собаку съели". :)

Как водится - заранее благодарю вас за помощь.
FT Support писал(а):... Кстати обратите внимание на то, что пунктирные линии будут рисоваться только при толщине 1, если сделать линию толще, то она будет сплошной, это ограничения Windows, в МетаТрейдере например та же ситуация.
Да, да. Это нам, скромным любителям МТ4, известно. :)
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#20 Сообщение FT Support » Ср дек 01, 2010 8:11 pm

добавить библиотеку очень просто, нужно дописать её в блок uses, например вот так:

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

uses
  ScriptInterfaceUnit, TechnicalFunctions, graphics;

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#21 Сообщение Николай Тарасов » Ср дек 01, 2010 8:37 pm

1. Простите - я допустил опечатку
FT Support писал(а):По поводу ошибки с вот этим кодом:

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

ObjectSetText(name[0], StrPriceType(Time(40)), 10, 'Arial');
Код неверный потому что функция StrPriceType принимает тип цены, а Вы передаёте туда дату/время, и вот несоответствие типов...
Ох, простите, в своём вопросе я допустил опечатку.
Дело было так:

1) Сначала я действительно написал код с явной ошибкой в типе данных ('time' вместо 'double'):

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

ObjectSetText(PointName[0], StrPriceType(Time(40)), 10, 'Arial');
Но после того, как компилятор выдал:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'TDateTime'

2) Я исправился:

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

ObjectSetText(PointName[0], StrPriceType(Close(40)), 10, 'Arial');
Но компилятор по-прежнему не хотел воспринимать данную функцию, вернее - тип параметра ему не нравился:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'

Резюме: В моём вопросе середина пропала, а остался первый вариант кода и сообщение об ошибке на второй вариант кода. Извините за неточность.


2. Как подписать цену прямо на графике?
FT Support писал(а):...Пример использования функции StrPriceType такой:

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

Print(StrPriceType(pt_Close));
// в этом случае функция вернёт "Close"
После вашего первого совета я попробовал сделать так:

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

ObjectSetText(PointName[0], Print(StrPriceType(Close(40))), 12, 'Arial');
Хотя, знаю, процедура Print для отображения сообщений пользователя в журнале тестировщика. Мне же нужно подписать цену прямо на графике.
Результат прежний:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'


3. Надо будет попробовать
FT Support писал(а):...Чтобы присвоить текстовому объекту числовое значение нужно использовать стандартные функции дельфи например IntToStr чтобы перевести число в строку
Вот. Это уже кое-что.
Была у меня такая версия, что программу (скрипт) можно/нужно писать некими стандартными средствами.
А то ваш арсенал довольно скуден для самовыражения. :?
Надо будет попробовать.
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#22 Сообщение FT Support » Ср дек 01, 2010 9:51 pm

С точки зрения программирования конвертация типов это очень даже стандартные средства.

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

1) Добавить библиотеку SysUtils

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

uses
  ScriptInterfaceUnit, TechnicalFunctions, graphics, SysUtils;
2) Использовать функцию FloatToStr из этой библиотеки:

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

ObjectSetText(name[0], FloatToStr(Close(40)), 10, 'Arial'); 
3) Если компилятор будет выдавать ошибки вида:
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#23 Сообщение Николай Тарасов » Чт дек 30, 2010 9:27 pm

FT Support писал(а):... Если компилятор будет выдавать ошибки вида:
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)
Благодарю за помощь.
Вот полностью работающая версия скрипта ObjectsTest:

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

//--------------------------------------------------------------------------
// Objects test - Example how to work with objects from Script
//--------------------------------------------------------------------------
library ObjectsTest;

//-------------------------------------------
// Initialize Script
//-------------------------------------------
uses
  ScriptInterfaceUnit,
  TechnicalFunctions,
  graphics;
  
procedure Init; stdcall;
begin
  ScriptShortName('ObjectsTest');
  ScriptDescription('Objects'' interface test');
end;

//-------------------------------------------
// Deinitialize Script
//-------------------------------------------
procedure Done; stdcall;
begin

end;

//-------------------------------------------
// Execute Script
//------------------------------------------- 
procedure Execute; stdcall;
var
  i: integer;
const
  names: array[0..8] of string = ('Line0', 'Line1', 'Line2', 'Line3', 'Fibo1',
    'Fibo2', 'Fibo3', 'Fibo4', 'Text1');

begin

  if Bars < 80 then
    exit;

  // create vertical line
  if not(ObjectExists(names[0])) then
    begin                                              
      ObjectCreate(names[0], obj_VLine, 0,
        ScriptInterfaceUnit.Time(0), 0);
      ObjectSet(names[0], OBJPROP_STYLE, integer(psDot));
      ObjectSet(names[0], OBJPROP_COLOR, clYellow);
      ObjectSet(names[0], OBJPROP_WIDTH, 1);
    end;

  // create horizontal line
  if not(ObjectExists(names[1])) then
    ObjectCreate(names[1], obj_HLine, 0, 0, Close(0));

  // create trend line
  if not(ObjectExists(names[2])) then
    ObjectCreate(names[2], obj_TrendLine, 0,
      ScriptInterfaceUnit.Time(10), Close(10),
      ScriptInterfaceUnit.Time(0), Close(0));

  // create ray
  if not(ObjectExists(names[3])) then
    ObjectCreate(names[3], obj_Ray, 0,
      ScriptInterfaceUnit.Time(10), Open(10),
      ScriptInterfaceUnit.Time(0), Open(0));

  // create fibo retracement
  if not(ObjectExists(names[4])) then
    begin
      ObjectCreate(names[4], obj_FiboRetracement, 0,
        ScriptInterfaceUnit.Time(40), Close(40),
        ScriptInterfaceUnit.Time(10), Close(10));
      ObjectSet(names[4], OBJPROP_FIBOCLOSEDENDS, 1);
      ObjectSet(names[4], OBJPROP_FIBOSHOWPRICE, 0);
      ObjectSet(names[4], OBJPROP_FIBOENDWIDTH, 40);

      // define 3 levels
      ObjectSet(names[4], OBJPROP_FIBOLEVELS, 3);
      for i:=0 to 2 do
        begin
          ObjectSet(names[4], OBJPROP_FIBOLEVELN, i);
          ObjectSet(names[4], OBJPROP_LEVELVALUE, i*50);
          ObjectSet(names[4], OBJPROP_LEVELCOLOR, clBlue);
          ObjectSet(names[4], OBJPROP_LEVELSTYLE, integer(psDot));
          ObjectSet(names[4], OBJPROP_LEVELWIDTH, 1);
        end;
    end;

  // create fibo fan
  if not(ObjectExists(names[5])) then
    begin
      ObjectCreate(names[5], obj_FiboFan, 0,
        ScriptInterfaceUnit.Time(80), Close(80),
        ScriptInterfaceUnit.Time(50), Close(50));

      // define 3 levels
      ObjectSet(names[5], OBJPROP_FIBOLEVELS, 3);
      for i:=0 to 2 do
        begin
          ObjectSet(names[5], OBJPROP_FIBOLEVELN, i);
          ObjectSet(names[5], OBJPROP_LEVELVALUE, i*30);
          ObjectSet(names[5], OBJPROP_LEVELCOLOR, clGreen);
          ObjectSet(names[5], OBJPROP_LEVELSTYLE, integer(psSolid));
          ObjectSet(names[5], OBJPROP_LEVELWIDTH, 1);
        end;
    end;

  // create text
  if not(ObjectExists(names[8])) then
    begin
      ObjectCreate(names[8], obj_Text, 0,
        ScriptInterfaceUnit.Time(10), Close(0));
      ObjectSetText(names[8], 'Test text', 12, 'Arial', clYellow);
      ObjectSet(names[8], OBJPROP_VALIGNMENT, tlBottom);
      ObjectSet(names[8], OBJPROP_HALIGNMENT,
        ScriptInterfaceUnit.taLeftJustify);
    end;


  // set vertical line props
  ObjectSet(names[0], OBJPROP_TIME1, ScriptInterfaceUnit.Time(0));

  // set horizontal line props
  ObjectSet(names[1], OBJPROP_PRICE1, Close(0));

  // set trend line props            
  ObjectSet(names[2], OBJPROP_TIME1, ScriptInterfaceUnit.Time(10));
  ObjectSet(names[2], OBJPROP_PRICE1, Close(10));
  ObjectSet(names[2], OBJPROP_TIME2, ScriptInterfaceUnit.Time(0));
  ObjectSet(names[2], OBJPROP_PRICE2, Close(0));

  // set ray props
  ObjectSet(names[3], OBJPROP_TIME1, ScriptInterfaceUnit.Time(10));
  ObjectSet(names[3], OBJPROP_PRICE1, Open(10));
  ObjectSet(names[3], OBJPROP_TIME2, ScriptInterfaceUnit.Time(0));
  ObjectSet(names[3], OBJPROP_PRICE2, Open(0));

  // set fibo retracement props
  ObjectSet(names[4], OBJPROP_TIME1, ScriptInterfaceUnit.Time(40));
  ObjectSet(names[4], OBJPROP_PRICE1, Close(40));
  ObjectSet(names[4], OBJPROP_TIME2, ScriptInterfaceUnit.Time(10));
  ObjectSet(names[4], OBJPROP_PRICE2, Close(10));

  // set fibo fan props
  ObjectSet(names[5], OBJPROP_TIME1, ScriptInterfaceUnit.Time(80));
  ObjectSet(names[5], OBJPROP_PRICE1, Close(80));
  ObjectSet(names[5], OBJPROP_TIME2, ScriptInterfaceUnit.Time(50));
  ObjectSet(names[5], OBJPROP_PRICE2, Close(50));

  // set text props
  ObjectSet(names[8], OBJPROP_TIME1, ScriptInterfaceUnit.Time(10));
  ObjectSet(names[8], OBJPROP_PRICE1, Close(0));
end;
exports 

Init, 
Done, 

Execute; 

end.
Если у кого-то компилятор будет ругаться на строчке с цветом, добавте перед названием цвета фразу "graphics".
Например, вместо "clYellow" запишите "graphics.clYellow".
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#24 Сообщение Николай Тарасов » Чт дек 30, 2010 11:36 pm

FT Support писал(а):С точки зрения программирования конвертация типов это очень даже стандартные средства.

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

1) Добавить библиотеку SysUtils

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

uses
  ScriptInterfaceUnit, TechnicalFunctions, graphics, SysUtils;
2) Использовать функцию FloatToStr из этой библиотеки:

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

ObjectSetText(name[0], FloatToStr(Close(40)), 10, 'Arial'); 
3) Если компилятор будет выдавать ошибки вида:
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)
Подписать цену на графике можно так:

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

// create point1
  if not(ObjectExists(name[0])) then
    ObjectCreate(name[0], obj_Text, 0, ScriptInterfaceUnit.Time(40), Close(40));

  // set point1 props
  ObjectSet(name[0], OBJPROP_TIME1,  ScriptInterfaceUnit.Time(40));
  ObjectSet(name[0], OBJPROP_PRICE1, Close(40));
  ObjectSetText(Name[0], '<1: '+FloatToStrF(Close(40),ffFixed,Digits+1,Digits),
    12, 'Arial', graphics.clOrangeRed);
  ObjectSet(name[0], OBJPROP_VALIGNMENT, tlCenter);
  ObjectSet(name[0], ScriptInterfaceUnit.OBJPROP_HALIGNMENT,
    ScriptInterfaceUnit.taLeftJustify);
Последний раз редактировалось Николай Тарасов Ср фев 02, 2011 12:20 am, всего редактировалось 1 раз.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#25 Сообщение Николай Тарасов » Пт дек 31, 2010 1:39 am

Как задать нужный цвет

Кстати говоря, научился задавать цвет с помощью трёхбитовой функции RGB($RR: byte, $GG: byte, $BB: byte). Выглядит это вот так:

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

  color1 := RGB($FF, $45, $00); // OrangeRed
  color2 := RGB($32, $CD, $32); // LimeGreen
  color3 := RGB($00, $BF, $FF); // DeepSkyBlue
  color4 := RGB($1E, $90, $FF); // DodgerBlue
  color5 := RGB($BA, $55, $D3); // MediumOrchid
Таблицу "Цвета HTML" смотрите здесь: http://ru.wikipedia.org/wiki/Цвета_в_Web


PS
Шестнадцатеричные числа $RR, $GG и $BB, лежащие в диапазоне 0...255 легко получить, например, с помощью встроенного в компьютер калькулятора. Надо лишь переставлять флажок с "Hex" на "Dec" и обратно.
Так можно получить любой цвет и оттенок.
Я желаю всем счастья.

Ответить