Как создать библиотеку dll
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Хозяин - барин
Что тут скажешь, Александр?
Само собой, Вам решать.
Как говорится: "Хозяин - барин".
Само собой, Вам решать.
Как говорится: "Хозяин - барин".
Последний раз редактировалось Николай Тарасов Пт май 13, 2011 5:59 am, всего редактировалось 1 раз.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Здравствуйте всем!Николай Тарасов писал(а):Всё хорошо.FT Support писал(а):да, имею в виду, что можно "пробежать" по всем объектам и вывести их список в каком-то удобном виде. Чтобы это сделать используйте функции ObjectsTotal и ObjectNameЗдравствуйте.
Второй пункт поподробнее опишите, пожалуйста. Где и как смотреть?
Или вы имеете в виду, что можно запрограммировать перебор объектов?
возможно работа с объектами у нас "сыровата" по сравнению с терминалами, которые разрабатывают большие команды программистов (например МТ). Но мы не такая большая компания чтобы их "догнать и перегнать" хотя мы стараемся
Вы молодцы.
Главное - то, что вы делаете, нужно людям.
Поэтому у вас всё получится!
Обнаружил, что список графических объектов можно посмотреть вот здесь:
"C:\ForexTester2\data\TestingMode\desktop.dat"
Александр, Михаил, спасибо, вам большое!
Это очень удобно.
Я давно уже хотел проверить, что у меня получается на выходе.
Глянул, и сразу отловил у себя неточность.
PS
Не исключаю, что такая возможность у вас была и раньше.
Даже если это и так, всё равно - спасибо вам!
Последний раз редактировалось Николай Тарасов Чт апр 28, 2011 10:23 pm, всего редактировалось 3 раза.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
По поводу для кого-то недоступной функции Symbol предполагаю,FT Support писал(а):Здравствуйте, Николай,
Странно, но у нас функция Symbol в скриптах работает правильно...
возможно это зависит от региональных настроек или различий в компиляторах, пожалуйста скомпилируйте вот этот код и пришлите нам dll: ...
что временно можно выйти из положения, считывая его из файла (см. следующую за параметром 'CurrListSize' строчку):
"C:\ForexTester2\data\TestingMode\LastState.dat".
Подкупает название файла: "Last State" - последнее состояние (положение), - и действительно свежая дата обновления файла.
Хотя, так могло отметиться недавнее обновление FT до версии 2.7.7.
Можно поступить ещё проще - прочитать файл: "C:\ForexTester2\data\TestingMode\SymbolList.dat"
У меня там всего одна строчка (не уверен, что у всех так же).
Александр, как вы думаете, насколько приемлемо такое решение?
Может быть, вы подскажите другие варианты?
PS
Как считывать информацию из файлов, можно узнать здесь (см. пост 'Ср Мар 30, 2011 5:36 pm'):
http://forextester.ru/forum/viewtopic.p ... c&start=75
Придётся лишь немного подкорректировать функцию 'UserOptionGet'.
Последний раз редактировалось Николай Тарасов Вт май 03, 2011 2:09 am, всего редактировалось 1 раз.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Про индикаторы
Здравствуйте, Михаил.
Здравствуйте, Александр.
Нельзя ли сделать так, чтобы при пересчёте индикаторов на экране (графике цены) менялись (пересчитывались) не только численные, но и иные параметры индикаторов (цвет, стиль, толщина и имя линий)?
В общем - всё, что определяется в разделах кода 'Initialize' и 'Deinitialize':
Как я понимаю, пока что это возможно лишь при полной переустановке индикаторов на график.
Здравствуйте, Александр.
Нельзя ли сделать так, чтобы при пересчёте индикаторов на экране (графике цены) менялись (пересчитывались) не только численные, но и иные параметры индикаторов (цвет, стиль, толщина и имя линий)?
В общем - всё, что определяется в разделах кода 'Initialize' и 'Deinitialize':
Код: Выделить всё
//---------------------------------------------------------------------------
// Initialize indicator
//---------------------------------------------------------------------------
procedure Init; stdcall;
begin
end;
//---------------------------------------------------------------------------
// Deinitialize indicator
//---------------------------------------------------------------------------
procedure Done; stdcall;
begin
end;
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Access violation
Здравствуйте.
Столкнулся с тем, что не могу установить индикатор, который раньше устанавливался без проблем.
Скажите, что можно теперь сделать, кроме простой смены у индикатора имени? Переустановить FT2?
* * *
В индикаторе стоит запрос цвета из файла.
Запрос вставил недавно.
До него было явное указание цвета.
Может быть, именно это повлияло на такую вот реакцию FT2?
А может быть сказалось то, что файл с цветом был всё время открыт (см. следующее моё сообщение об ошибке окраски индикатора)?
Но я регулярно делаю так со скриптами. Держу открытыми файлы с параметрами. Но ничего подобного не замечал.
Сообщение об ошибке прилагается.
--
Заранее благодарю за помощь.
Столкнулся с тем, что не могу установить индикатор, который раньше устанавливался без проблем.
Скажите, что можно теперь сделать, кроме простой смены у индикатора имени? Переустановить FT2?
* * *
В индикаторе стоит запрос цвета из файла.
Запрос вставил недавно.
До него было явное указание цвета.
Может быть, именно это повлияло на такую вот реакцию FT2?
А может быть сказалось то, что файл с цветом был всё время открыт (см. следующее моё сообщение об ошибке окраски индикатора)?
Но я регулярно делаю так со скриптами. Держу открытыми файлы с параметрами. Но ничего подобного не замечал.
Сообщение об ошибке прилагается.
--
Заранее благодарю за помощь.
- Вложения
-
- Access violation.JPG
- (112.37 КБ) 36597 скачиваний
Последний раз редактировалось Николай Тарасов Вт май 03, 2011 11:12 pm, всего редактировалось 2 раза.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Ошибка окраски индикатора
Здравствуйте, уважаемые Михаил и Александр.
1. Столкнулся с неверным отображением индикатором стандартного цвета 'Lavender'.
Задавал его числом '15132410' = 'E6 E6 FA' (см. http://ru.wikipedia.org/wiki/Цвета_в_Web).
Получить этот цвет удалось перестановкой красного и синего цветов ('RGB' to 'BGR'):
'16443110' = 'FA E6 E6'.
2. Проверил то же самое (раскраску цветом) на текстовой метке, выставляемой скриптом.
Там всё в порядке. Первый вариант ('15132410') дал нужный цвет.
* * *
Предполагаю, что путаницу вносит мой системный модуль 'Graphics.pas' (прилагается).
Почему-то он указанный стандартный цвет (да и не только его) отождествляет с другим числом:Хотя какое-то странное распределение путаницы.
Не находите?
Михаил, Александр, посоветуйте, пожалуйста, как нам (пользователям FT2) быть. Неужели нам так придётся всё время применять легендарный метод "научного тыка"?
PS
Любопытно, что другой стандартный цвет 'Moccasin', заданный числом '16770229' = 'FF E4 B5', таких проблем не вызвал. И индикатор, и скрипт отражают его правильно!
1. Столкнулся с неверным отображением индикатором стандартного цвета 'Lavender'.
Задавал его числом '15132410' = 'E6 E6 FA' (см. http://ru.wikipedia.org/wiki/Цвета_в_Web).
Получить этот цвет удалось перестановкой красного и синего цветов ('RGB' to 'BGR'):
'16443110' = 'FA E6 E6'.
2. Проверил то же самое (раскраску цветом) на текстовой метке, выставляемой скриптом.
Там всё в порядке. Первый вариант ('15132410') дал нужный цвет.
* * *
Предполагаю, что путаницу вносит мой системный модуль 'Graphics.pas' (прилагается).
Почему-то он указанный стандартный цвет (да и не только его) отождествляет с другим числом:
Код: Выделить всё
clWebLavender = $FAE6E6;
...
clWebMoccasin = $B5E4FF;
Не находите?
Михаил, Александр, посоветуйте, пожалуйста, как нам (пользователям FT2) быть. Неужели нам так придётся всё время применять легендарный метод "научного тыка"?
PS
Любопытно, что другой стандартный цвет 'Moccasin', заданный числом '16770229' = 'FF E4 B5', таких проблем не вызвал. И индикатор, и скрипт отражают его правильно!
- Вложения
-
- Graphics.rar
- (52.83 КБ) 1228 скачиваний
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Ошибка установки индикатора
Здравствуйте.
Сегодня попробовал снова установить индикатор.
Опять ошибка, но уже другая (см. рисунок).
Сегодня попробовал снова установить индикатор.
Опять ошибка, но уже другая (см. рисунок).
- Вложения
-
- Access violation2.JPG
- (99.99 КБ) 35791 скачивание
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Утро вечера удрёнее!
Ха!
Закрыл файл с цветом, и индикатор установился!!!
Ура! Всё снова ожило!
Значит можно продолжить работу.
Благодарю за помощь!
Теперь будем знать, что:
"Перед установкой в FT2 индикаторов, скриптов и стратегий все файлы-корреспонденты надо закрывать!"
Во истину - утро вечера мудрёнее!
Закрыл файл с цветом, и индикатор установился!!!
Ура! Всё снова ожило!
Значит можно продолжить работу.
Благодарю за помощь!
Теперь будем знать, что:
"Перед установкой в FT2 индикаторов, скриптов и стратегий все файлы-корреспонденты надо закрывать!"
Во истину - утро вечера мудрёнее!
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Немаловажная мелочь
Здравствуйте.
Отловил такую немаловажную особенность FT2.
Оказывается, что для корректного сравнения некоего Double-числа с ds_Line-индикатором округлять (приводить к некоей точности) нужно не только число, но и значение самого индикатора.
Это нужно делать даже в том случае, когда индикатору присвоены заранее округлённые значения!!!
--
Про '5/9' и то, как правильно округлять числа, см. здесь (пост 'Вт Фев 22, 2011 11:14 pm'):
http://forextester.ru/forum/viewtopic.p ... c&start=60
Отловил такую немаловажную особенность FT2.
Оказывается, что для корректного сравнения некоего Double-числа с ds_Line-индикатором округлять (приводить к некоей точности) нужно не только число, но и значение самого индикатора.
Это нужно делать даже в том случае, когда индикатору присвоены заранее округлённые значения!!!
Код: Выделить всё
if Floor(
S1[index+1] // Число 1
* Exp(Ln(10)*Digits) + 5/9) / Exp(Ln(10)*Digits) // Округление до точности графика
= // Оператор сравнения
Floor(
S1[index ] // Число 2
* Exp(Ln(10)*Digits) + 5/9) / Exp(Ln(10)*Digits) // Округление до точности графика
then
begin
...
end;
Про '5/9' и то, как правильно округлять числа, см. здесь (пост 'Вт Фев 22, 2011 11:14 pm'):
http://forextester.ru/forum/viewtopic.p ... c&start=60
Я желаю всем счастья.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
- С праздником! - С каким таким праздником? /Что празднуем?/
Здравствуйте, здравствуйте, Александр.FT Support писал(а):Здравствуйте, Николай,
Извините за задержку, прадзники...
Интересно, что в Канаде празднуют первого мая?
Последний раз редактировалось Николай Тарасов Вс май 22, 2011 1:37 pm, всего редактировалось 6 раз.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Александр, надеюсь вы читаете не только хвостики (то есть крайние сообщения своих форумян-прихожан).FT Support писал(а):Здравствуйте, Николай,
...
похоже Вы уже со всем разобрались.
Хотелось бы получить от вас комментарии по ранее заданным вопросам.
PS
Недавно заметил, что в некоторых старых ваших ответах пропали иллюстрации!
Если можно, восстановите, пока первоисточники у вас не исчезли окончательно.
Например, вот здесь (посмотрите на ваш пост 'Пн Апр 04, 2011 7:28 pm'): http://forextester.ru/forum/viewtopic.p ... c&start=75
* * *
Ха!
Пока искал пример, увидел, что и в некоторых моих постах отсутствуют иллюстрации. Например, на той же странице посмотрите мой пост 'Сб Апр 02, 2011 8:36 am'.
Александр, как это понимать? Что, это вы так место на сервере подчищаете?
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
С праздником Победы!!!
Привет всем.
С праздником Победы нашей великой страны (СССР)
в Великой Отечественной войне 1941-1945 гг.!!!
С праздником Победы нашей великой страны (СССР)
в Великой Отечественной войне 1941-1945 гг.!!!
Последний раз редактировалось Николай Тарасов Вс май 22, 2011 1:36 pm, всего редактировалось 1 раз.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Здравствуйте, Михаил.
Здравствуйте, Александр.
У меня к вам вопрос:
"Меняется ли маркировка баров в ходе исполнения затяжного (по времени) скрипта?"
Могу предположить, что меняется, поскольку во время исполнения скрипта на графике появляются всё новые и новые бары (тики). Такое ощущение, что новый тик не дожидается исполнения скрипта, а "тикает" себе и "тикает" без оглядки на окружающих (скрипты, индикаторы, стратегии).
Если это так, то как, на ваш взгляд, нужно организовать работу, например, с функциями iOpen, iClose и т.п., чтобы в них можно было использовать индекс бара, выдаваемый функциями iHighest и iLowest?
Ведь иногда интервал поиска экстремума может быть довольно большим.
Предполагаю, что поиск бара нужно осуществлять прямо в указанных функциях (iOpen, iClose и т.п.). То есть каждый раз заново!
Чтобы иметь самую свежую информацию (о индексе). А это может заметно затянуть исполнение скрипта.
Хотя, возможно, упомянутые функции (iOpen, iClose и т.п.) быстроисполняемые, т.к. сами ничего не перебирают, а обращаются к конкретному бару с конкретным индексом. И беспокоиться о том, что их время исполнения как-то может повлиять на ход исполнения скрипта не стоит.
Михаил, Александр, прошу, внесите ясность и понимание относительно данного вопроса.
Заранее благодарю.
PS
Вожусь с ошибкой исполнения логической развилки типа "if-then-else".
Уже и не знаю, на что подумать?
Замучился выдвигать всякие безумные догадки.
Заданный вопрос как раз из таких.
Здравствуйте, Александр.
У меня к вам вопрос:
"Меняется ли маркировка баров в ходе исполнения затяжного (по времени) скрипта?"
Могу предположить, что меняется, поскольку во время исполнения скрипта на графике появляются всё новые и новые бары (тики). Такое ощущение, что новый тик не дожидается исполнения скрипта, а "тикает" себе и "тикает" без оглядки на окружающих (скрипты, индикаторы, стратегии).
Если это так, то как, на ваш взгляд, нужно организовать работу, например, с функциями iOpen, iClose и т.п., чтобы в них можно было использовать индекс бара, выдаваемый функциями iHighest и iLowest?
Ведь иногда интервал поиска экстремума может быть довольно большим.
Предполагаю, что поиск бара нужно осуществлять прямо в указанных функциях (iOpen, iClose и т.п.). То есть каждый раз заново!
Чтобы иметь самую свежую информацию (о индексе). А это может заметно затянуть исполнение скрипта.
Хотя, возможно, упомянутые функции (iOpen, iClose и т.п.) быстроисполняемые, т.к. сами ничего не перебирают, а обращаются к конкретному бару с конкретным индексом. И беспокоиться о том, что их время исполнения как-то может повлиять на ход исполнения скрипта не стоит.
Михаил, Александр, прошу, внесите ясность и понимание относительно данного вопроса.
Заранее благодарю.
PS
Вожусь с ошибкой исполнения логической развилки типа "if-then-else".
Уже и не знаю, на что подумать?
Замучился выдвигать всякие безумные догадки.
Заданный вопрос как раз из таких.
Последний раз редактировалось Николай Тарасов Ср май 18, 2011 11:43 am, всего редактировалось 3 раза.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Особенности работы функций iHighest и iLowest
Здравствуйте.
Давно хотел спросить.
Скажите, пожалуйста:
1. Можно ли в функциях iHighest и iLowest использовать минусовое число перебираемых баров (count<0)?
Если нет, то нельзя ли добавить такую возможность в будущем?
Ведь минуты часа (часы дня, дни недели или месяца, месяцы года и т.д.) для пользователей FT удобнее перебирать не справа налево (с 59 по 00 минуту включительно), а как раз наоборот (с 00 по 59 минуту).
2. Как работают эти формулы при нулевом значении счётчика баров (count=0)?
Можно ли считать, что в таком случае будет обработан всего 1 бар?
3. В связи с этим, скажите, надо ли делать предварительную проверку этого параметра на пригодность (count>0)?
Заранее благодарю.
Давно хотел спросить.
Скажите, пожалуйста:
1. Можно ли в функциях iHighest и iLowest использовать минусовое число перебираемых баров (count<0)?
Если нет, то нельзя ли добавить такую возможность в будущем?
Ведь минуты часа (часы дня, дни недели или месяца, месяцы года и т.д.) для пользователей FT удобнее перебирать не справа налево (с 59 по 00 минуту включительно), а как раз наоборот (с 00 по 59 минуту).
2. Как работают эти формулы при нулевом значении счётчика баров (count=0)?
Можно ли считать, что в таком случае будет обработан всего 1 бар?
3. В связи с этим, скажите, надо ли делать предварительную проверку этого параметра на пригодность (count>0)?
Заранее благодарю.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Александр, а где нужно округлять?FT Support писал(а):Здравствуйте, Николай,
Извините за задержку, прадзники...
похоже Вы уже со всем разобрались.
P.S. числа с плавающей запятой в любом языке лучше сравнивать округляя
Непосредственно при сравнивании (внутри конструкции сравнения: 'x < y')?
Или можно делать это загодя (непосредственно перед сравнением).
А, может, тогда стОит (для надёжности) временно переходить к целым числам и
заниматься уже их сравнением: 'Floor(x * Exp(Ln(10)*Digits) + 5/9) < Floor(y * Exp(Ln(10)*Digits) + 5/9)') ?
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Извините меня!
Здравствуйте, Александр.
Куда вы пропали?
Помогите мне, пожалуйста. Очень вас прошу.
Заранее благодарю.
--
С уважением - Николай Тарасов.
PS
Если бы я был бестактным, пожалуйста, извините меня!
Куда вы пропали?
Помогите мне, пожалуйста. Очень вас прошу.
Заранее благодарю.
--
С уважением - Николай Тарасов.
PS
Если бы я был бестактным, пожалуйста, извините меня!
Я желаю всем счастья.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
Здравствуйте, Николай,
Вы уж извините, иногда у нас бывает "запарка", тогда на форуме реже отвечаем.
Ответы на Ваши вопросы такие:
1) "Меняется ли маркировка баров в ходе исполнения затяжного (по времени) скрипта?"
Нет, не меняется, программа ждёт окончания выполнения скрипта.
2) Можно ли в функциях iHighest и iLowest использовать минусовое число перебираемых баров (count<0)?
Нет, минусовое число использовать нельзя. А разве это возможно в МТ?
3) Как работают эти формулы при нулевом значении счётчика баров (count=0)?
В этом случае функция не отработает, т.к. количество проверяемых баров будет равно 0, в итоге 0 баров будет просмотрено.
4) В связи с этим, скажите, надо ли делать предварительную проверку этого параметра на пригодность (count>0)?
Желательно сделать такую проверку
5) где нужно округлять?
Округлять нужно только в случае если Вы проверяете значения на равенство (не больше-меньше, а именно равенство). и совсем не обязательно округлять до целых чисел, можно просто округлить до N-ого знака после запятой.
Вы уж извините, иногда у нас бывает "запарка", тогда на форуме реже отвечаем.
Ответы на Ваши вопросы такие:
1) "Меняется ли маркировка баров в ходе исполнения затяжного (по времени) скрипта?"
Нет, не меняется, программа ждёт окончания выполнения скрипта.
2) Можно ли в функциях iHighest и iLowest использовать минусовое число перебираемых баров (count<0)?
Нет, минусовое число использовать нельзя. А разве это возможно в МТ?
3) Как работают эти формулы при нулевом значении счётчика баров (count=0)?
В этом случае функция не отработает, т.к. количество проверяемых баров будет равно 0, в итоге 0 баров будет просмотрено.
4) В связи с этим, скажите, надо ли делать предварительную проверку этого параметра на пригодность (count>0)?
Желательно сделать такую проверку
5) где нужно округлять?
Округлять нужно только в случае если Вы проверяете значения на равенство (не больше-меньше, а именно равенство). и совсем не обязательно округлять до целых чисел, можно просто округлить до N-ого знака после запятой.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
-
- Сообщения: 17
- Зарегистрирован: Сб сен 07, 2013 1:48 pm
Вопросики.
Здравствуйте.
Начинаю изучать применение Делфи в написании скриптов и индикаторов для ФТ и наткнулся на следующее. При компиляции примеров индикатора и стратегии из примеров выскакивают ошибки. Насколько я понимаю- не соответствие типов. Версия Делфи- 10.
Вопрос- с чем это связано и как устранить ?
Скриншоты почему-то не прикрепляются.
Начинаю изучать применение Делфи в написании скриптов и индикаторов для ФТ и наткнулся на следующее. При компиляции примеров индикатора и стратегии из примеров выскакивают ошибки. Насколько я понимаю- не соответствие типов. Версия Делфи- 10.
Вопрос- с чем это связано и как устранить ?
Скриншоты почему-то не прикрепляются.
-
- Сообщения: 567
- Зарегистрирован: Пн апр 01, 2013 11:44 am
-
- Сообщения: 17
- Зарегистрирован: Сб сен 07, 2013 1:48 pm
library Stochastic;
uses
SysUtils, classes, graphics, windows, IndicatorInterfaceUnit;
var
// внешние параметры
KPeriod: integer;
DPeriod: integer;
Slowing: integer;
ApplyTo: integer;
// индексные буферы
Kfast, Kslow, Dline: TIndexBuffer;
//---------------------------------------------------------------------------
// Инициализация
//---------------------------------------------------------------------------
procedure Init; stdcall;
begin
// настроить индикатор
IndicatorShortName('Stochastic'); // name Stochastic
SetOutputWindow(ow_SeparateWindow); // paint in separate window
SetFixedMinMaxValues(0, 100); // scale between 0 and 100
AddLevel(20, psDot, 1, clGray); // define level 20
AddLevel(80, psDot, 1, clGray); // define level 80
SetEmptyValue(105); // empty value 105
// регистрация внешних параметров
AddSeparator('Common');
RegOption('%K period', ot_Integer, KPeriod);
SetOptionRange('%K period', 1, MaxInt);
KPeriod := 8;
RegOption('%D period', ot_Integer, DPeriod);
SetOptionRange('%D period', 1, MaxInt);
DPeriod := 3;
RegOption('Slowing', ot_Integer, Slowing);
SetOptionRange('Slowing', 1, MaxInt);
Slowing := 3;
RegOption('Apply to', ot_EnumType, ApplyTo);
AddOptionValue('Apply to', 'High/Low');
AddOptionValue('Apply to', 'Close/Close');
ApplyTo := 0;
// Создать индексные буферы
Kfast := CreateIndexBuffer; // this buffer will be invisible
Kslow := CreateIndexBuffer;
Dline := CreateIndexBuffer;
IndicatorBuffers(2);
SetIndexBuffer(0, Kslow);
SetIndexBuffer(1, Dline);
SetIndexStyle(0, 0, psSolid, 1, RGB($1E, $90, $FF));
SetIndexStyle(1, 0, psDot, 1, clRed);
end;
//---------------------------------------------------------------------------
// Деинициализация
//---------------------------------------------------------------------------
procedure Done; stdcall;
begin
// do nothing
end;
//---------------------------------------------------------------------------
// Расчет одного бара
//---------------------------------------------------------------------------
procedure Calculate(index: integer); stdcall;
var
sum, Plow, Phigh, P: double;
i: integer;
function price(i: integer): double;
begin
if ApplyTo = 0 then
result := (Low(i) + High(i))/2
else
result := Close(i);
end;
begin
if (Bars < KPeriod) or (Bars < Slowing) or (Bars < DPeriod) then
exit;
// поиск высшей и наименьшей цены для KPeriod
Phigh := High(index);
Plow := Low(index);
for i:=1 to KPeriod - 1 do
begin
if High(index + i) > Phigh then
Phigh := High(index + i);
if Low(index + i) < Plow then
Plow := Low(index + i);
end;
// count Kfast line value
if Phigh <= Plow then
Kfast[index] := 50
else
Kfast[index] := 100*((price(index) - Plow)/(Phigh - Plow));
// get Kslow
sum := 0;
for i:=0 to Slowing - 1 do
sum := sum + Kfast[index + i];
Kslow[index] := sum/Slowing;
// get Dline
sum := 0;
for i:=0 to DPeriod - 1 do
sum := sum + Kslow[index + i];
Dline[index] := sum/DPeriod;
end;
exports
Init, Done, Calculate;
end.
Этот код взят из документации по написанию индикаторов. На строку,
выделенную красным цветом ругается компилятор.
Checking project dependencies...
Compiling Project1.dproj (Debug configuration)
[DCC Warning] IndicatorInterfaceUnit.pas(1246): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Error] Project1.dpr(118): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
[DCC Error] Project1.dpr(120): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
Failed
Получается, что существует какое-то отличие между настройками моего компилятора и тем, на котором производилась отладка данноо кода.
Elapsed time: 00:00:02.0
uses
SysUtils, classes, graphics, windows, IndicatorInterfaceUnit;
var
// внешние параметры
KPeriod: integer;
DPeriod: integer;
Slowing: integer;
ApplyTo: integer;
// индексные буферы
Kfast, Kslow, Dline: TIndexBuffer;
//---------------------------------------------------------------------------
// Инициализация
//---------------------------------------------------------------------------
procedure Init; stdcall;
begin
// настроить индикатор
IndicatorShortName('Stochastic'); // name Stochastic
SetOutputWindow(ow_SeparateWindow); // paint in separate window
SetFixedMinMaxValues(0, 100); // scale between 0 and 100
AddLevel(20, psDot, 1, clGray); // define level 20
AddLevel(80, psDot, 1, clGray); // define level 80
SetEmptyValue(105); // empty value 105
// регистрация внешних параметров
AddSeparator('Common');
RegOption('%K period', ot_Integer, KPeriod);
SetOptionRange('%K period', 1, MaxInt);
KPeriod := 8;
RegOption('%D period', ot_Integer, DPeriod);
SetOptionRange('%D period', 1, MaxInt);
DPeriod := 3;
RegOption('Slowing', ot_Integer, Slowing);
SetOptionRange('Slowing', 1, MaxInt);
Slowing := 3;
RegOption('Apply to', ot_EnumType, ApplyTo);
AddOptionValue('Apply to', 'High/Low');
AddOptionValue('Apply to', 'Close/Close');
ApplyTo := 0;
// Создать индексные буферы
Kfast := CreateIndexBuffer; // this buffer will be invisible
Kslow := CreateIndexBuffer;
Dline := CreateIndexBuffer;
IndicatorBuffers(2);
SetIndexBuffer(0, Kslow);
SetIndexBuffer(1, Dline);
SetIndexStyle(0, 0, psSolid, 1, RGB($1E, $90, $FF));
SetIndexStyle(1, 0, psDot, 1, clRed);
end;
//---------------------------------------------------------------------------
// Деинициализация
//---------------------------------------------------------------------------
procedure Done; stdcall;
begin
// do nothing
end;
//---------------------------------------------------------------------------
// Расчет одного бара
//---------------------------------------------------------------------------
procedure Calculate(index: integer); stdcall;
var
sum, Plow, Phigh, P: double;
i: integer;
function price(i: integer): double;
begin
if ApplyTo = 0 then
result := (Low(i) + High(i))/2
else
result := Close(i);
end;
begin
if (Bars < KPeriod) or (Bars < Slowing) or (Bars < DPeriod) then
exit;
// поиск высшей и наименьшей цены для KPeriod
Phigh := High(index);
Plow := Low(index);
for i:=1 to KPeriod - 1 do
begin
if High(index + i) > Phigh then
Phigh := High(index + i);
if Low(index + i) < Plow then
Plow := Low(index + i);
end;
// count Kfast line value
if Phigh <= Plow then
Kfast[index] := 50
else
Kfast[index] := 100*((price(index) - Plow)/(Phigh - Plow));
// get Kslow
sum := 0;
for i:=0 to Slowing - 1 do
sum := sum + Kfast[index + i];
Kslow[index] := sum/Slowing;
// get Dline
sum := 0;
for i:=0 to DPeriod - 1 do
sum := sum + Kslow[index + i];
Dline[index] := sum/DPeriod;
end;
exports
Init, Done, Calculate;
end.
Этот код взят из документации по написанию индикаторов. На строку,
выделенную красным цветом ругается компилятор.
Checking project dependencies...
Compiling Project1.dproj (Debug configuration)
[DCC Warning] IndicatorInterfaceUnit.pas(1246): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Error] Project1.dpr(118): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
[DCC Error] Project1.dpr(120): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
Failed
Получается, что существует какое-то отличие между настройками моего компилятора и тем, на котором производилась отладка данноо кода.
Elapsed time: 00:00:02.0
-
- Сообщения: 567
- Зарегистрирован: Пн апр 01, 2013 11:44 am
-
- Сообщения: 17
- Зарегистрирован: Сб сен 07, 2013 1:48 pm
сделал так
SetIndexStyle(0, 0, psSolid, 1, RGB(StrToInt('$1E'), StrToInt('$90'), StrToInt('$FF')));
ошибки
Compiling Project1.dproj (Debug configuration)
[DCC Error] Project1.dpr(118): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
[DCC Error] Project1.dpr(120): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
Failed
Elapsed time: 00:00:00.2
SetIndexStyle(0, 0, psSolid, 1, RGB(StrToInt('$1E'), StrToInt('$90'), StrToInt('$FF')));
ошибки
Compiling Project1.dproj (Debug configuration)
[DCC Error] Project1.dpr(118): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
[DCC Error] Project1.dpr(120): E2010 Incompatible types: 'TDrawStyle' and 'Integer'
Failed
Elapsed time: 00:00:00.2