C++ API 4 FT
-
- Сообщения: 6
- Зарегистрирован: Пн окт 09, 2006 9:53 am
C++ API 4 FT
Привет всем)
Итак С++ интерфейс в процессе...
Те вопросы что обсуждались на пауке решены)
Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL
и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас
Итак С++ интерфейс в процессе...
Те вопросы что обсуждались на пауке решены)
Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL
и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: C++ API 4 FT
Функция с OleVariant уже устарела и нигде не используется, ее можно пропустить. Функция замены строк была специально вынесена в модуль чтобы память была независимой от основной программы. Если программе нужно поменять строку внутри индикатора/стратегии она вызывает эту функцию.skaat писал(а):Привет всем)
Итак С++ интерфейс в процессе...
Те вопросы что обсуждались на пауке решены)
Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL
и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас
Asta la vista
Mike
Mike
-
- Сообщения: 6
- Зарегистрирован: Пн окт 09, 2006 9:53 am
импорт/экспорт - как это правильно сказать по ...
Вот это самое трудное - признаться что не получается), но увы...не выходит пока ничего с ентим апи.
В связи с этим такие есть вопросы: нафиг там эта структура InterfaceProcsRec, и нельзя ли эти функции просто экспортировать... то есть перечислить их в секции export в ForexTester.exe?
Далее функции эти объявлены со словом 'of Object', что есть резервация места под указатель на абстрактный объект, если я правильно понял, так вот в С++ нет аналога такому. Правда в С++билдере есть затычка __closure специально для совместимости с объектным паскалем, но это опять же привязка к VCL(.
Итак нам нужен указатель на определенный клас - контейнер для этих функций, затем этот же класс(указатель) и экспортировать, либо эти функции должны быть глобальными.
В общем необходимо переписать интерфейс так, что бы обеспечить непосредственный импорт функий АПИ или же импорт класса-контейнера.
Вообще-то есть еще вариант(непроверенный пока), попробую реализовать такой импорт из этих же модулей - IndicatorInterfaceUnit - так наверное будет лучше всего. В результате получится комплект из либы IndicatorInterfaceUnit.o и заголовочного файла IndicatorInterfaceUnit.H... в общем будем пробовать.
Терранин, а у тебя есть какие то наработки в этом направлении? Поделись) а то вдруг я велосипед изобретаю......
В связи с этим такие есть вопросы: нафиг там эта структура InterfaceProcsRec, и нельзя ли эти функции просто экспортировать... то есть перечислить их в секции export в ForexTester.exe?
Далее функции эти объявлены со словом 'of Object', что есть резервация места под указатель на абстрактный объект, если я правильно понял, так вот в С++ нет аналога такому. Правда в С++билдере есть затычка __closure специально для совместимости с объектным паскалем, но это опять же привязка к VCL(.
Итак нам нужен указатель на определенный клас - контейнер для этих функций, затем этот же класс(указатель) и экспортировать, либо эти функции должны быть глобальными.
В общем необходимо переписать интерфейс так, что бы обеспечить непосредственный импорт функий АПИ или же импорт класса-контейнера.
Вообще-то есть еще вариант(непроверенный пока), попробую реализовать такой импорт из этих же модулей - IndicatorInterfaceUnit - так наверное будет лучше всего. В результате получится комплект из либы IndicatorInterfaceUnit.o и заголовочного файла IndicatorInterfaceUnit.H... в общем будем пробовать.
Терранин, а у тебя есть какие то наработки в этом направлении? Поделись) а то вдруг я велосипед изобретаю......
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: импорт/экспорт - как это правильно сказать по ...
Гораздо проще иметь дело с одной структурой чем с кучей отдельных функций. Потом интерфейс уже устоялся и переписывать ничего я не буду.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);
Asta la vista
Mike
Mike
-
- Сообщения: 6
- Зарегистрирован: Пн окт 09, 2006 9:53 am
Неа, так ничего не выйдет.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Правильно 8 байт. Я ж тебе написал как эти 8 байт будут выглядеть: сначала указатель на объект потом адрес функции. А при вызове функции этот указатель надо передать перед всеми остальными параметрами вот и все. Сегодня сделаю пример и пришлю.skaat писал(а):Неа, так ничего не выйдет.Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Asta la vista
Mike
Mike
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Короче все работает единственно указатель на объект идет после указателя на функцию, смотри пример:Terranin писал(а):Правильно 8 байт. Я ж тебе написал как эти 8 байт будут выглядеть: сначала указатель на объект потом адрес функции. А при вызове функции этот указатель надо передать перед всеми остальными параметрами вот и все. Сегодня сделаю пример и пришлю.skaat писал(а):Неа, так ничего не выйдет.Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Код: Выделить всё
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.
Возвращаясь к нашим модулям запись:
Код: Выделить всё
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;
Asta la vista
Mike
Mike
-
- Сообщения: 6
- Зарегистрирован: Пн окт 09, 2006 9:53 am
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
API
Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
- Вложения
-
- MovingAverage_C.zip
- (57.51 КБ) 2558 скачиваний
Asta la vista
Mike
Mike
-
- Сообщения: 80
- Зарегистрирован: Пн окт 23, 2006 9:30 am
Re: API
судя по аттачу писался на dev-C++ . а лазарь - это фрипаскаль (альтернатива делфи). Тут не причем.Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: API
Вышел новый билд кстати, все молчат почему-то... Сейчас работаю над интерфейсом доступа к объектам и линиям из стратегий и индикаторов.wellx писал(а):судя по аттачу писался на dev-C++ . а лазарь - это фрипаскаль (альтернатива делфи). Тут не причем.Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Asta la vista
Mike
Mike
-
- Сообщения: 6
- Зарегистрирован: Пн окт 09, 2006 9:53 am
Re: API
Давненько сюда не заглядывал....а жизь кипит:)
Аднака А ты сам то проверял? У меня это не работает, да и не советник тут вовсе....Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: API
Да, я уже понял. Он застрял на том что не смог сделать переменную IntrfProcsRec видимой из dll. В С там какие-то проблемы с этим. Но в целом он полностью модуль индикаторов портировал. Я с ним уже связался будем продолжать.skaat писал(а):Давненько сюда не заглядывал....а жизь кипит:)
Аднака А ты сам то проверял? У меня это не работает, да и не советник тут вовсе....Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Asta la vista
Mike
Mike
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
API готово
Вобщем сделали уже апи для стратегий на С++ сижу пишу документацию и примеры.
Asta la vista
Mike
Mike
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
АПИ готово
Вот наконец-то долгожданное АПИ на С++, проверено на Microsoft Visual C++ платформе. Обновил документацию. Качайте.
- Вложения
-
- api+example.zip
- АПИ с примером стратегии использующей объекты
- (30.18 КБ) 2332 скачивания
-
- StrategiesHelp.zip
- Документация по стратегиям
- (89.7 КБ) 2328 скачиваний
Asta la vista
Mike
Mike
- RickD
- Сообщения: 5
- Зарегистрирован: Чт мар 08, 2007 2:12 pm
- Откуда: Крыша Мира
- Контактная информация:
-
- Сообщения: 2
- Зарегистрирован: Пт июн 01, 2007 7:57 am
Помогите переписать индикаторы под программу Forex Tester(индикаторы работают в мт4).Моё мыло oscal.79@mail.ru
-
- Сообщения: 10
- Зарегистрирован: Сб фев 17, 2007 8:30 am
-
- Сообщения: 10
- Зарегистрирован: Чт мар 12, 2009 7:17 pm
Где взять C++ API для индикаторов?
Так все-таки, есть ли API для написания индикаторов? Все что нашел на форуме, это MovingAverage_C.zip. Но при компиляции и установки dll в ForexTester build 12, он вываливается без предупреждения и далее отказывается запускаться пока не удалю эту dll. А в api+example.zip нет API для индикаторов, только для стратегий. Как быть?
-
- Сообщения: 10
- Зарегистрирован: Чт мар 12, 2009 7:17 pm
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 pm
Скачал из этой ветки файл api+example.zip, там есть TFT.dll - закинул в соответствующую папку - форекстестер стратегию увидел.
Поставил с++6.0 , взял исходные файлы (Graphics.h ; StrategyInterfaceUnit.h ; TechnicalFunctions.h ; TFT.h ; TFT.cpp), попытался сам создать dll - все создалось (правда ругнулось что переменная x два раза в одном из файлов определена как int - я в одном месте поправил), но dll, который сделал я, не видит форекстестер - отказывается его показывать в списке и перезапуски не помогают.
Вот думаю что я не так делаю? В с++ создавал проект Win32DLL, туда добавил указанные файлы и запустил на компиляцию и создание - м.б. еще чего сделать надо? М.б. я не так компилирую - подскажите?
Поставил с++6.0 , взял исходные файлы (Graphics.h ; StrategyInterfaceUnit.h ; TechnicalFunctions.h ; TFT.h ; TFT.cpp), попытался сам создать dll - все создалось (правда ругнулось что переменная x два раза в одном из файлов определена как int - я в одном месте поправил), но dll, который сделал я, не видит форекстестер - отказывается его показывать в списке и перезапуски не помогают.
Вот думаю что я не так делаю? В с++ создавал проект Win32DLL, туда добавил указанные файлы и запустил на компиляцию и создание - м.б. еще чего сделать надо? М.б. я не так компилирую - подскажите?
Последний раз редактировалось duh Вс окт 24, 2010 12:22 pm, всего редактировалось 1 раз.
zzz
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Надо в свойствах проекта указать один файлик, посмотрите здесь http://www.forextester.com/forum/viewtopic.php?t=1013 тут подробно написано с картинками.duh писал(а):Скачал из этой ветки файл api+example.zip, там есть TFT.dll - закинул в соответствующую папку - форекстестер стратегию увидел.
Поставил с++6.0 , взял исходные файлы (Graphics.h ; StrategyInterfaceUnit.h ; TechnicalFunctions.h ; TFT.h ; TFT.cpp), попытался сам создать dll - все создалось (правда ругнулось что переменная x два раза в одном из файлов определена как int - я в одном месте поправил), но dll, который сделал я, не видит форекстестер - отказывается его показывать в списке и перезапуски не помогают.
Вот думаю что я не так делаю? В с++ создавал проект Win32DLL, туда добавил указанные файлы и запустил на компиляцию и создание - м.б. еще чего сделать надо? М.б. я не так компилирую - подскажите?
Asta la vista
Mike
Mike
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 pm
А я то думал зачем этот файл Test.def нужен !
В общем у меня MSDev98 и соответственно такого: "And add it to Project -> Options -> Configuration Properties -> Linker -> Input -> Module Definition File ..." я там не нашел.
Я этот файлик просто добавил в проект и сделал dll - форекс тестер ее увидел. Достаточно ли этого в MSDev98 или кроме добавления файла в проект его еще в какие-нибудь настройки надо прописать?
Запустил тест, включил эту стратегию - никакие сделки так и не открылись - так и должно быть (т.е. это просто пустой демо файл) или все таки сделки должны какие-то происходить (это и с оригинальной дллкой тоже)?
И еще такой вопрос - этот файл будет всегда одинаковый для всех стратегий? Что этим файлом задается - для чего он нужен (на простом языке для чайников)?
В общем у меня MSDev98 и соответственно такого: "And add it to Project -> Options -> Configuration Properties -> Linker -> Input -> Module Definition File ..." я там не нашел.
Я этот файлик просто добавил в проект и сделал dll - форекс тестер ее увидел. Достаточно ли этого в MSDev98 или кроме добавления файла в проект его еще в какие-нибудь настройки надо прописать?
Запустил тест, включил эту стратегию - никакие сделки так и не открылись - так и должно быть (т.е. это просто пустой демо файл) или все таки сделки должны какие-то происходить (это и с оригинальной дллкой тоже)?
И еще такой вопрос - этот файл будет всегда одинаковый для всех стратегий? Что этим файлом задается - для чего он нужен (на простом языке для чайников)?
Последний раз редактировалось duh Вс окт 24, 2010 12:23 pm, всего редактировалось 1 раз.
zzz
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
В этом файле описываются процедуры которые должны быть видны из длл. Когда тестер подключает эту длл то он смотрит а есть ли там нужные процедуры, типа Init, Done, Calculate. Если нет он считает это не индикатор. Файлик в принципе одинаковый для всех должен быть но я не специалист по С++. Может в некоторых компилляторах он не нужен.duh писал(а):А я то думал зачем этот файл Test.def нужен !
В общем у меня MSDev98 и соответственно такого: "And add it to Project -> Options -> Configuration Properties -> Linker -> Input -> Module Definition File ..." я там не нашел.
Я этот файлик просто добавил в проект и сделал dll - форекс тестер ее увидел. Достаточно ли этого в MSDev98 или кроме добавления файла в проект его еще в какие-нибудь настройки надо прописать?
Запустил тест, включил эту стратегию - никакие сделки так и не открылись - так и должно быть (т.е. это просто пустой демо файл) или все таки сделки должны какие-то происходить (это и с оригинальной дллкой тоже)?
И еще такой вопрос - этот файл будет всегда одинаковый для всех стратегий? Что этим файлом задается - для чего он нужен (на простом языке для чайников)?
Asta la vista
Mike
Mike
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 pm
Ладно, разберусь думаю, если что, то поставлю новый MSDevSt и буду делать как в инструкции.
Только один уточняющий вопрос остался - dll, которую можно в этой ветке скачать (готовую) должна какие-нибудь ордера открывать или нет? А то я запустил тест - стратегию подключил, кнопку стратегий нажал, валюту указал, а ничего не происходит (при этом если стратегию по средним запускать, то она работает, т.е. вроде все правильно сделал).
Только один уточняющий вопрос остался - dll, которую можно в этой ветке скачать (готовую) должна какие-нибудь ордера открывать или нет? А то я запустил тест - стратегию подключил, кнопку стратегий нажал, валюту указал, а ничего не происходит (при этом если стратегию по средним запускать, то она работает, т.е. вроде все правильно сделал).
Последний раз редактировалось duh Вс окт 24, 2010 12:24 pm, всего редактировалось 1 раз.
zzz