C++ API 4 FT

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
skaat
Сообщения: 6
Зарегистрирован: Пн окт 09, 2006 9:53 am

C++ API 4 FT

#1 Сообщение skaat » Вт окт 10, 2006 8:53 am

Привет всем)
Итак С++ интерфейс в процессе...

Те вопросы что обсуждались на пауке решены)

Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL

и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас

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

Re: C++ API 4 FT

#2 Сообщение Terranin » Ср окт 11, 2006 5:58 am

skaat писал(а):Привет всем)
Итак С++ интерфейс в процессе...

Те вопросы что обсуждались на пауке решены)

Возможно, еще прийдется поколдовать с типами данных, например такой как OleVariant напрягает, это как раз привязка к Builder/VCL

и надо будет уточнить кое какие детали по совместной работе с памятью, в часности функция замены строк replacestr усли не ошибаюсь, об это позже, некогда сейчас
Функция с OleVariant уже устарела и нигде не используется, ее можно пропустить. Функция замены строк была специально вынесена в модуль чтобы память была независимой от основной программы. Если программе нужно поменять строку внутри индикатора/стратегии она вызывает эту функцию.
Asta la vista
Mike

skaat
Сообщения: 6
Зарегистрирован: Пн окт 09, 2006 9:53 am

импорт/экспорт - как это правильно сказать по ...

#3 Сообщение skaat » Вт окт 17, 2006 7:21 am

Вот это самое трудное - признаться что не получается), но увы...не выходит пока ничего с ентим апи.
В связи с этим такие есть вопросы: нафиг там эта структура InterfaceProcsRec, и нельзя ли эти функции просто экспортировать... то есть перечислить их в секции export в ForexTester.exe?
Далее функции эти объявлены со словом 'of Object', что есть резервация места под указатель на абстрактный объект, если я правильно понял, так вот в С++ нет аналога такому. Правда в С++билдере есть затычка __closure специально для совместимости с объектным паскалем, но это опять же привязка к VCL(.
Итак нам нужен указатель на определенный клас - контейнер для этих функций, затем этот же класс(указатель) и экспортировать, либо эти функции должны быть глобальными.
В общем необходимо переписать интерфейс так, что бы обеспечить непосредственный импорт функий АПИ или же импорт класса-контейнера.

Вообще-то есть еще вариант(непроверенный пока), попробую реализовать такой импорт из этих же модулей - IndicatorInterfaceUnit - так наверное будет лучше всего. В результате получится комплект из либы IndicatorInterfaceUnit.o и заголовочного файла IndicatorInterfaceUnit.H... в общем будем пробовать.

Терранин, а у тебя есть какие то наработки в этом направлении? Поделись) а то вдруг я велосипед изобретаю......

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

Re: импорт/экспорт - как это правильно сказать по ...

#4 Сообщение Terranin » Вт окт 17, 2006 2:54 pm

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

skaat
Сообщения: 6
Зарегистрирован: Пн окт 09, 2006 9:53 am

#5 Сообщение skaat » Ср окт 18, 2006 11:43 am

Неа, так ничего не выйдет.
Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.

Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)

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

#6 Сообщение Terranin » Ср окт 18, 2006 2:58 pm

skaat писал(а):Неа, так ничего не выйдет.
Приставка в конце функции object просто указывает что первым параметром в функцию неявно передастся указатель на объект.
Видишь ли это теория, а на практике это значит что адрес функции в памяти(в структуре) занимает 8 байт, а количество и тип параметров вообще ни как на это дело не влияют.

Короче я попробую по своему - сделаю отдельную dll для экспорта, и от нее уже будем плясать)
Правильно 8 байт. Я ж тебе написал как эти 8 байт будут выглядеть: сначала указатель на объект потом адрес функции. А при вызове функции этот указатель надо передать перед всеми остальными параметрами вот и все. Сегодня сделаю пример и пришлю.
Asta la vista
Mike

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

#7 Сообщение Terranin » Ср окт 18, 2006 7:47 pm

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;

Т.е. функция/указатель, функция/указатель и т.д.
Asta la vista
Mike

skaat
Сообщения: 6
Зарегистрирован: Пн окт 09, 2006 9:53 am

#8 Сообщение skaat » Чт окт 19, 2006 5:47 pm

Ок, попробую так сделать. Вопрос только - поверит ли нам линкер))))

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

API

#9 Сообщение Terranin » Чт ноя 30, 2006 5:52 am

Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Вложения
MovingAverage_C.zip
(57.51 КБ) 1817 скачиваний
Asta la vista
Mike

wellx
Сообщения: 79
Зарегистрирован: Пн окт 23, 2006 9:30 am

Re: API

#10 Сообщение wellx » Чт ноя 30, 2006 4:43 pm

Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
судя по аттачу писался на dev-C++ . а лазарь - это фрипаскаль (альтернатива делфи). Тут не причем.

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

Re: API

#11 Сообщение Terranin » Чт ноя 30, 2006 7:47 pm

wellx писал(а):
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
судя по аттачу писался на dev-C++ . а лазарь - это фрипаскаль (альтернатива делфи). Тут не причем.
Вышел новый билд кстати, все молчат почему-то... Сейчас работаю над интерфейсом доступа к объектам и линиям из стратегий и индикаторов.
Asta la vista
Mike

skaat
Сообщения: 6
Зарегистрирован: Пн окт 09, 2006 9:53 am

Re: API

#12 Сообщение skaat » Ср дек 27, 2006 5:01 pm

Давненько сюда не заглядывал....а жизь кипит:)
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Аднака :roll: А ты сам то проверял? У меня это не работает, да и не советник тут вовсе.... :?

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

Re: API

#13 Сообщение Terranin » Ср дек 27, 2006 5:18 pm

skaat писал(а):Давненько сюда не заглядывал....а жизь кипит:)
Terranin писал(а):Хм, оказывается давным давно один человек уже портировал мой модуль индикаторов на С++ и написал советник с его помощью и все прекрасно работало. Исходники прикрепил. Он писал для Лазаруса (не знаю что за зверь но С++).
Аднака :roll: А ты сам то проверял? У меня это не работает, да и не советник тут вовсе.... :?
Да, я уже понял. Он застрял на том что не смог сделать переменную IntrfProcsRec видимой из dll. В С там какие-то проблемы с этим. Но в целом он полностью модуль индикаторов портировал. Я с ним уже связался будем продолжать.
Asta la vista
Mike

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

API готово

#14 Сообщение Terranin » Пт мар 16, 2007 10:09 pm

Вобщем сделали уже апи для стратегий на С++ сижу пишу документацию и примеры.
Asta la vista
Mike

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

АПИ готово

#15 Сообщение Terranin » Пн мар 19, 2007 11:07 pm

Вот наконец-то долгожданное АПИ на С++, проверено на Microsoft Visual C++ платформе. Обновил документацию. Качайте.
Вложения
api+example.zip
АПИ с примером стратегии использующей объекты
(30.18 КБ) 1597 скачиваний
StrategiesHelp.zip
Документация по стратегиям
(89.7 КБ) 1599 скачиваний
Asta la vista
Mike

Аватара пользователя
RickD
Сообщения: 5
Зарегистрирован: Чт мар 08, 2007 2:12 pm
Откуда: Крыша Мира
Контактная информация:

#16 Сообщение RickD » Сб мар 24, 2007 9:32 pm

Приветствую уважаемых форумян.
Рад сообщить, что перевод API на С++ и тест прошли успешно.
Вариант для MS VC++ доступен для скачивания.
Все замечания, пожелания и предложения по улучшению приветствуются.

Павел
Сообщения: 2
Зарегистрирован: Пт июн 01, 2007 7:57 am

#17 Сообщение Павел » Вс июн 03, 2007 11:58 am

Помогите переписать индикаторы под программу Forex Tester(индикаторы работают в мт4).Моё мыло oscal.79@mail.ru

Salim
Сообщения: 10
Зарегистрирован: Сб фев 17, 2007 8:30 am

#18 Сообщение Salim » Вс июн 03, 2007 6:44 pm

Павел, если найдешь скинь мне тоже пожалуйста на salim0707rambler.ru

serrrega
Сообщения: 10
Зарегистрирован: Чт мар 12, 2009 7:17 pm

Где взять C++ API для индикаторов?

#19 Сообщение serrrega » Чт мар 12, 2009 7:24 pm

Так все-таки, есть ли API для написания индикаторов? Все что нашел на форуме, это MovingAverage_C.zip. Но при компиляции и установки dll в ForexTester build 12, он вываливается без предупреждения и далее отказывается запускаться пока не удалю эту dll. А в api+example.zip нет API для индикаторов, только для стратегий. Как быть?

serrrega
Сообщения: 10
Зарегистрирован: Чт мар 12, 2009 7:17 pm

#20 Сообщение serrrega » Чт мар 12, 2009 7:41 pm

А все, разобрался. Надо было взять из папки Examples установленной программы :)

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#21 Сообщение duh » Сб мар 14, 2009 9:40 pm

Скачал из этой ветки файл api+example.zip, там есть TFT.dll - закинул в соответствующую папку - форекстестер стратегию увидел.

Поставил с++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

#22 Сообщение Terranin » Сб мар 14, 2009 11:34 pm

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 тут подробно написано с картинками.
Asta la vista
Mike

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#23 Сообщение duh » Вс мар 15, 2009 6:39 am

А я то думал зачем этот файл Test.def нужен :D !

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

#24 Сообщение Terranin » Вс мар 15, 2009 6:21 pm

duh писал(а):А я то думал зачем этот файл Test.def нужен :D !

В общем у меня MSDev98 и соответственно такого: "And add it to Project -> Options -> Configuration Properties -> Linker -> Input -> Module Definition File ..." я там не нашел.

Я этот файлик просто добавил в проект и сделал dll - форекс тестер ее увидел. Достаточно ли этого в MSDev98 или кроме добавления файла в проект его еще в какие-нибудь настройки надо прописать?

Запустил тест, включил эту стратегию - никакие сделки так и не открылись - так и должно быть (т.е. это просто пустой демо файл) или все таки сделки должны какие-то происходить (это и с оригинальной дллкой тоже)?

И еще такой вопрос - этот файл будет всегда одинаковый для всех стратегий? Что этим файлом задается - для чего он нужен (на простом языке для чайников)?
В этом файле описываются процедуры которые должны быть видны из длл. Когда тестер подключает эту длл то он смотрит а есть ли там нужные процедуры, типа Init, Done, Calculate. Если нет он считает это не индикатор. Файлик в принципе одинаковый для всех должен быть но я не специалист по С++. Может в некоторых компилляторах он не нужен.
Asta la vista
Mike

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#25 Сообщение duh » Вс мар 15, 2009 9:06 pm

Ладно, разберусь думаю, если что, то поставлю новый MSDevSt и буду делать как в инструкции.

Только один уточняющий вопрос остался - dll, которую можно в этой ветке скачать (готовую) должна какие-нибудь ордера открывать или нет? А то я запустил тест - стратегию подключил, кнопку стратегий нажал, валюту указал, а ничего не происходит (при этом если стратегию по средним запускать, то она работает, т.е. вроде все правильно сделал).
Последний раз редактировалось duh Вс окт 24, 2010 12:24 pm, всего редактировалось 1 раз.
zzz

Ответить