Страница 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 писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Аднака :roll: А ты сам то проверял? У меня это не работает, да и не советник тут вовсе.... :?

Re: API

Добавлено: Ср дек 27, 2006 5:18 pm
Terranin
skaat писал(а):Давненько сюда не заглядывал....а жизь кипит:)
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Аднака :roll: А ты сам то проверял? У меня это не работает, да и не советник тут вовсе.... :?
Да, я уже понял. Он застрял на том что не смог сделать переменную 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 нужен :D !

В общем у меня 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 нужен :D !

В общем у меня 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, которую можно в этой ветке скачать (готовую) должна какие-нибудь ордера открывать или нет? А то я запустил тест - стратегию подключил, кнопку стратегий нажал, валюту указал, а ничего не происходит (при этом если стратегию по средним запускать, то она работает, т.е. вроде все правильно сделал).