Страница 1 из 2
C++ API 4 FT
Добавлено: Вт окт 10, 2006 8:53 am
skaat
Привет всем)
Итак С++ интерфейс в процессе...
Те вопросы что обсуждались на пауке решены)
Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL
и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас
Re: C++ API 4 FT
Добавлено: Ср окт 11, 2006 5:58 am
Terranin
skaat писал(а):Привет всем)
Итак С++ интерфейс в процессе...
Те вопросы что обсуждались на пауке решены)
Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL
и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас
Функция с OleVariant уже устарела и нигде не используется, ее можно пропустить. Функция замены строк была специально вынесена в модуль чтобы память была независимой от основной программы. Если программе нужно поменять строку внутри индикатора/стратегии она вызывает эту функцию.
импорт/экспорт - как это правильно сказать по ...
Добавлено: Вт окт 17, 2006 7:21 am
skaat
Вот это самое трудное - признаться что не получается), но увы...не выходит пока ничего с ентим апи.
В связи с этим такие есть вопросы: нафиг там эта структура InterfaceProcsRec, и нельзя ли эти функции просто экспортировать... то есть перечислить их в секции export в ForexTester.exe?
Далее функции эти объявлены со словом 'of Object', что есть резервация места под указатель на абстрактный объект, если я правильно понял, так вот в С++ нет аналога такому. Правда в С++билдере есть затычка __closure специально для совместимости с объектным паскалем, но это опять же привязка к VCL(.
Итак нам нужен указатель на определенный клас - контейнер для этих функций, затем этот же класс(указатель) и экспортировать, либо эти функции должны быть глобальными.
В общем необходимо переписать интерфейс так, что бы обеспечить непосредственный импорт функий АПИ или же импорт класса-контейнера.
Вообще-то есть еще вариант(непроверенный пока), попробую реализовать такой импорт из этих же модулей - IndicatorInterfaceUnit - так наверное будет лучше всего. В результате получится комплект из либы IndicatorInterfaceUnit.o и заголовочного файла IndicatorInterfaceUnit.H... в общем будем пробовать.
Терранин, а у тебя есть какие то наработки в этом направлении? Поделись) а то вдруг я велосипед изобретаю......
Re: импорт/экспорт - как это правильно сказать по ...
Добавлено: Вт окт 17, 2006 2:54 pm
Terranin
skaat писал(а):Вот это самое трудное - признаться что не получается), но увы...не выходит пока ничего с ентим апи.
В связи с этим такие есть вопросы: нафиг там эта структура InterfaceProcsRec, и нельзя ли эти функции просто экспортировать... то есть перечислить их в секции export в ForexTester.exe?
Далее функции эти объявлены со словом 'of Object', что есть резервация места под указатель на абстрактный объект, если я правильно понял, так вот в С++ нет аналога такому. Правда в С++билдере есть затычка __closure специально для совместимости с объектным паскалем, но это опять же привязка к VCL(.
Итак нам нужен указатель на определенный клас - контейнер для этих функций, затем этот же класс(указатель) и экспортировать, либо эти функции должны быть глобальными.
В общем необходимо переписать интерфейс так, что бы обеспечить непосредственный импорт функий АПИ или же импорт класса-контейнера.
Вообще-то есть еще вариант(непроверенный пока), попробую реализовать такой импорт из этих же модулей - IndicatorInterfaceUnit - так наверное будет лучше всего. В результате получится комплект из либы IndicatorInterfaceUnit.o и заголовочного файла IndicatorInterfaceUnit.H... в общем будем пробовать.
Терранин, а у тебя есть какие то наработки в этом направлении? Поделись) а то вдруг я велосипед изобретаю......
Гораздо проще иметь дело с одной структурой чем с кучей отдельных функций. Потом интерфейс уже устоялся и переписывать ничего я не буду.
Ты сделал структуру видимой? Если да, то какие там проблемы? Просто объявляешь вместо функции в структуре пару указатель и ссылка на функцию. В функции вместо object просто указываешь первым параметром указатель и при вызове подставляешь этот указатель как первый параметр. Вот и все. Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
procedure blabla(index: integer) of object; stdcall; = procedure blabla(ptr: pointer; index: integer); stdcall; по идее.
а ссылка на функцию объекта:
Код: Выделить всё
type
TFunc = procedure(index: integer) of object; stdcall;
MyRecord = record
func1: TFunc;
end;
MyRecord.func1(10);
должно быть равно:
type
TFunc = procedure(ptr: pointer; index: integer); stdcall;
MyRecord = record
ObjPtr: pointer;
func1: TFunc;
end;
MyRecord.func1(MyRecord.ObjPtr, 10);
Насчет порядка следования указателя и ссылки на функцию я не уверен, проверю как это работает седня. Повторить это на С думаю нет никаких проблем.
Добавлено: Ср окт 18, 2006 11:43 am
skaat
Неа, так ничего не выйдет.
Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Добавлено: Ср окт 18, 2006 2:58 pm
Terranin
skaat писал(а):Неа, так ничего не выйдет.
Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Правильно 8 байт. Я ж тебе написал как эти 8 байт будут выглядеть: сначала указатель на объект потом адрес функции. А при вызове функции этот указатель надо передать перед всеми остальными параметрами вот и все. Сегодня сделаю пример и пришлю.
Добавлено: Ср окт 18, 2006 7:47 pm
Terranin
Terranin писал(а):skaat писал(а):Неа, так ничего не выйдет.
Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Правильно 8 байт. Я ж тебе написал как эти 8 байт будут выглядеть: сначала указатель на объект потом адрес функции. А при вызове функции этот указатель надо передать перед всеми остальными параметрами вот и все. Сегодня сделаю пример и пришлю.
Короче все работает единственно указатель на объект идет после указателя на функцию, смотри пример:
Код: Выделить всё
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
function Test(index: integer): double; stdcall;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TFunc1 = function(index: integer): double of object; stdcall;
TFunc2 = function(ptr: pointer; index: integer): double; stdcall;
TRecord1 = packed record
func: TFunc1;
end;
TRecord2 = packed record
func: TFunc2;
ptr: pointer;
end;
var
rec1: TRecord1;
rec2: TRecord2 absolute rec1;
function TForm1.Test(index: integer): double;
begin
result := index;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
rec1.func := Test;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := IntToStr(round(rec2.func(rec2.ptr, 20)));
end;
end.
Записи rec1 и rec2 занимают одну и туже память. Как видишь устанавливаем в rec1 адрес функции Test которая является функцией объекта а потом вызываем ее из rec2 передавая указатель на объект как первый параметр. В поле Edit1 выводится 20.
Возвращаясь к нашим модулям запись:
Код: Выделить всё
type
// indicator interface procedures
TGetCurrencyInfoFunc = function(Symbol: PChar; var info: PCurrencyInfo): boolean of object; stdcall;
....
// pointers to interface procedures
PInterfaceProcRec = ^TInterfaceProcRec;
TInterfaceProcRec = packed record
dwSize: longword;
GetCurrencyInfo: TGetCurrencyInfoFunc;
...
end;
Будет выглядеть как:
Код: Выделить всё
type
// indicator interface procedures
TGetCurrencyInfoFunc = function(ptr: pointer; Symbol: PChar; var info: PCurrencyInfo): boolean; stdcall;
....
// pointers to interface procedures
PInterfaceProcRec = ^TInterfaceProcRec;
TInterfaceProcRec = packed record
dwSize: longword;
GetCurrencyInfo: TGetCurrencyInfoFunc;
ptr1: pointer;
...
end;
Т.е. функция/указатель, функция/указатель и т.д.
Добавлено: Чт окт 19, 2006 5:47 pm
skaat
Ок, попробую так сделать. Вопрос только - поверит ли нам линкер))))
API
Добавлено: Чт ноя 30, 2006 5:52 am
Terranin
Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Re: API
Добавлено: Чт ноя 30, 2006 4:43 pm
wellx
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
судя по аттачу писался на dev-C++ . а лазарь - это фрипаскаль (альтернатива делфи). Тут не причем.
Re: API
Добавлено: Чт ноя 30, 2006 7:47 pm
Terranin
wellx писал(а):Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
судя по аттачу писался на dev-C++ . а лазарь - это фрипаскаль (альтернатива делфи). Тут не причем.
Вышел новый билд кстати, все молчат почему-то... Сейчас работаю над интерфейсом доступа к объектам и линиям из стратегий и индикаторов.
Re: API
Добавлено: Ср дек 27, 2006 5:01 pm
skaat
Давненько сюда не заглядывал....а жизь кипит:)
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Аднака
А ты сам то проверял? У меня это не работает, да и не советник тут вовсе....
Re: API
Добавлено: Ср дек 27, 2006 5:18 pm
Terranin
skaat писал(а):Давненько сюда не заглядывал....а жизь кипит:)
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Аднака
А ты сам то проверял? У меня это не работает, да и не советник тут вовсе....
Да, я уже понял. Он застрял на том что не смог сделать переменную IntrfProcsRec видимой из dll. В С там какие-то проблемы с этим. Но в целом он полностью модуль индикаторов портировал. Я с ним уже связался будем продолжать.
API готово
Добавлено: Пт мар 16, 2007 10:09 pm
Terranin
Вобщем сделали уже апи для стратегий на С++ сижу пишу документацию и примеры.
АПИ готово
Добавлено: Пн мар 19, 2007 11:07 pm
Terranin
Вот наконец-то долгожданное АПИ на С++, проверено на Microsoft Visual C++ платформе. Обновил документацию. Качайте.
Добавлено: Сб мар 24, 2007 9:32 pm
RickD
Приветствую уважаемых форумян.
Рад сообщить, что перевод API на С++ и тест прошли успешно.
Вариант для MS VC++ доступен для скачивания.
Все замечания, пожелания и предложения по улучшению приветствуются.
Добавлено: Вс июн 03, 2007 11:58 am
Павел
Помогите переписать индикаторы под программу Forex Tester(индикаторы работают в мт4).Моё мыло
oscal.79@mail.ru
Добавлено: Вс июн 03, 2007 6:44 pm
Salim
Павел, если найдешь скинь мне тоже пожалуйста на salim0707rambler.ru
Где взять C++ API для индикаторов?
Добавлено: Чт мар 12, 2009 7:24 pm
serrrega
Так все-таки, есть ли API для написания индикаторов? Все что нашел на форуме, это MovingAverage_C.zip. Но при компиляции и установки dll в ForexTester build 12, он вываливается без предупреждения и далее отказывается запускаться пока не удалю эту dll. А в api+example.zip нет API для индикаторов, только для стратегий. Как быть?
Добавлено: Чт мар 12, 2009 7:41 pm
serrrega
А все, разобрался. Надо было взять из папки Examples установленной программы
Добавлено: Сб мар 14, 2009 9:40 pm
duh
Скачал из этой ветки файл api+example.zip, там есть TFT.dll - закинул в соответствующую папку - форекстестер стратегию увидел.
Поставил с++6.0 , взял исходные файлы (Graphics.h ; StrategyInterfaceUnit.h ; TechnicalFunctions.h ; TFT.h ; TFT.cpp), попытался сам создать dll - все создалось (правда ругнулось что переменная x два раза в одном из файлов определена как int - я в одном месте поправил), но dll, который сделал я, не видит форекстестер - отказывается его показывать в списке и перезапуски не помогают.
Вот думаю что я не так делаю? В с++ создавал проект Win32DLL, туда добавил указанные файлы и запустил на компиляцию и создание - м.б. еще чего сделать надо? М.б. я не так компилирую - подскажите?
Добавлено: Сб мар 14, 2009 11:34 pm
Terranin
duh писал(а):Скачал из этой ветки файл api+example.zip, там есть TFT.dll - закинул в соответствующую папку - форекстестер стратегию увидел.
Поставил с++6.0 , взял исходные файлы (Graphics.h ; StrategyInterfaceUnit.h ; TechnicalFunctions.h ; TFT.h ; TFT.cpp), попытался сам создать dll - все создалось (правда ругнулось что переменная x два раза в одном из файлов определена как int - я в одном месте поправил), но dll, который сделал я, не видит форекстестер - отказывается его показывать в списке и перезапуски не помогают.
Вот думаю что я не так делаю? В с++ создавал проект Win32DLL, туда добавил указанные файлы и запустил на компиляцию и создание - м.б. еще чего сделать надо? М.б. я не так компилирую - подскажите?
Надо в свойствах проекта указать один файлик, посмотрите здесь
http://www.forextester.com/forum/viewtopic.php?t=1013 тут подробно написано с картинками.
Добавлено: Вс мар 15, 2009 6:39 am
duh
А я то думал зачем этот файл Test.def нужен
!
В общем у меня MSDev98 и соответственно такого: "And add it to Project -> Options -> Configuration Properties -> Linker -> Input -> Module Definition File ..." я там не нашел.
Я этот файлик просто добавил в проект и сделал dll - форекс тестер ее увидел. Достаточно ли этого в MSDev98 или кроме добавления файла в проект его еще в какие-нибудь настройки надо прописать?
Запустил тест, включил эту стратегию - никакие сделки так и не открылись - так и должно быть (т.е. это просто пустой демо файл) или все таки сделки должны какие-то происходить (это и с оригинальной дллкой тоже)?
И еще такой вопрос - этот файл будет всегда одинаковый для всех стратегий? Что этим файлом задается - для чего он нужен (на простом языке для чайников)?
Добавлено: Вс мар 15, 2009 6:21 pm
Terranin
duh писал(а):А я то думал зачем этот файл Test.def нужен
!
В общем у меня MSDev98 и соответственно такого: "And add it to Project -> Options -> Configuration Properties -> Linker -> Input -> Module Definition File ..." я там не нашел.
Я этот файлик просто добавил в проект и сделал dll - форекс тестер ее увидел. Достаточно ли этого в MSDev98 или кроме добавления файла в проект его еще в какие-нибудь настройки надо прописать?
Запустил тест, включил эту стратегию - никакие сделки так и не открылись - так и должно быть (т.е. это просто пустой демо файл) или все таки сделки должны какие-то происходить (это и с оригинальной дллкой тоже)?
И еще такой вопрос - этот файл будет всегда одинаковый для всех стратегий? Что этим файлом задается - для чего он нужен (на простом языке для чайников)?
В этом файле описываются процедуры которые должны быть видны из длл. Когда тестер подключает эту длл то он смотрит а есть ли там нужные процедуры, типа Init, Done, Calculate. Если нет он считает это не индикатор. Файлик в принципе одинаковый для всех должен быть но я не специалист по С++. Может в некоторых компилляторах он не нужен.
Добавлено: Вс мар 15, 2009 9:06 pm
duh
Ладно, разберусь думаю, если что, то поставлю новый MSDevSt и буду делать как в инструкции.
Только один уточняющий вопрос остался - dll, которую можно в этой ветке скачать (готовую) должна какие-нибудь ордера открывать или нет? А то я запустил тест - стратегию подключил, кнопку стратегий нажал, валюту указал, а ничего не происходит (при этом если стратегию по средним запускать, то она работает, т.е. вроде все правильно сделал).