| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687 |
- //+------------------------------------------------------------------+
- //| MetaTrader 5 API Gateway |
- //| Copyright 2000-2019, MetaQuotes Software Corp. |
- //| http://www.metaquotes.net |
- //+------------------------------------------------------------------+
- #pragma once
- #include <wincrypt.h>
- #include "MT5APIConstants.h"
- #include "MT5APITools.h"
- #include "MT5APILogger.h"
- #include "MT5APIPublicKey.h"
- #include "Config\MT5APIConfigFeeder.h"
- #include "Config\MT5APIConfigGateway.h"
- #include "Config\MT5APIConfigSymbol.h"
- #include "Config\MT5APIConfigGroup.h"
- #include "Config\MT5APIConfigNetwork.h"
- #include "Config\MT5APIConfigTime.h"
- #include "Config\MT5APIConfigSpread.h"
- #include "Bases\MT5APIAccount.h"
- #include "Bases\MT5APIBook.h"
- #include "Bases\MT5APIConfirm.h"
- #include "Bases\MT5APIExecution.h"
- #include "Bases\MT5APIMail.h"
- #include "Bases\MT5APIOrder.h"
- #include "Bases\MT5APIPosition.h"
- #include "Bases\MT5APIRequest.h"
- #include "Bases\MT5APITick.h"
- #include "Bases\MT5APIUser.h"
- #include "Bases\MT5APIChart.h"
- //+------------------------------------------------------------------+
- //| Include necessary library |
- //+------------------------------------------------------------------+
- #pragma comment(lib,"advapi32.lib")
- //+------------------------------------------------------------------+
- //| Gateway API version |
- //+------------------------------------------------------------------+
- #define MTGatewayAPIVersion 2190
- #define MTGatewayAPIDate L"18 Oct 2019"
- //+------------------------------------------------------------------+
- //| Gateway description info |
- //+------------------------------------------------------------------+
- #pragma pack(push,1)
- struct MTGatewayInfo
- {
- //--- gateway modes flags
- enum EnModes
- {
- GATEWAY_MODE_QUOTES =1, // receive quotes
- GATEWAY_MODE_NEWS =2, // receive news
- GATEWAY_MODE_POSITIONS =4, // gateway can process requests of trade positions
- //--- enumeration borders
- GATEWAY_MODE_NONE =0,
- GATEWAY_MODE_ALL =GATEWAY_MODE_QUOTES|GATEWAY_MODE_NEWS|GATEWAY_MODE_POSITIONS
- };
- //--- necessary fields flags
- enum EnFields
- {
- GATEWAY_FIELD_SERVER =1, // server field
- GATEWAY_FIELD_LOGIN =2, // login field
- GATEWAY_FIELD_PASSWORD =4, // password field
- GATEWAY_FIELD_PARAMS =8, // parameters
- //--- enumeration borders
- GATEWAY_FIELD_NONE =0,
- GATEWAY_FIELD_ALL =GATEWAY_FIELD_SERVER|GATEWAY_FIELD_LOGIN|GATEWAY_FIELD_PASSWORD|GATEWAY_FIELD_PARAMS
- };
- //--- data
- UINT version; // gateway version
- UINT version_api; // gateway API version
- wchar_t name_default[128]; // gateway default name
- wchar_t copyright[128]; // copyright
- wchar_t server_default[128]; // default dataserver address:port
- wchar_t login_default[64]; // gateway default login
- wchar_t password_default[64]; // gateway default password
- wchar_t parameters_default[512]; // additional parameters
- UINT mode; // EnModes
- UINT fields; // EnFields
- wchar_t description[512]; // description
- wchar_t module_id[16]; // gateway module id
- wchar_t build_date[16]; // datafeed\gateway build date
- wchar_t build_api_date[16]; // Gateway API build date
- UINT reserved[32]; // reserved
- };
- #pragma pack(pop)
- //+------------------------------------------------------------------+
- //| News structure |
- //+------------------------------------------------------------------+
- #pragma pack(push,1)
- struct MTNews
- {
- //--- constants
- enum constants
- {
- MAX_NEWS_BODY_LEN=15*1024*1024 // max. body len
- };
- //--- news topic flags
- enum EnNewsFlags
- {
- FLAG_PRIORITY =1, // priority flag
- FLAG_CALENDAR =2, // calendar item flag
- FLAG_MIME =4, // MIME content flag
- FLAG_ALLOW_DEMO =8 // allow news body for 'topic only' accounts
- };
- UINT language; // news language (WinAPI LANGID)
- wchar_t subject[256]; // news subject
- wchar_t category[256]; // news category
- UINT flags; // EnNewsFlags
- wchar_t *body; // body
- UINT body_len; // body length
- UINT languages_list[32]; // list of languages available for news
- INT64 datetime; // datetime
- UINT reserved[30]; // reserved
- };
- #pragma pack(pop)
- //+------------------------------------------------------------------+
- //| Economic event structure |
- //+------------------------------------------------------------------+
- #pragma pack(push,1)
- struct MTEconomicEvent
- {
- //--- news topic flags
- enum EnEconomicEventPriority
- {
- PRIORITY_LOW =0, // low priority of event
- PRIORITY_NORMAL =1, // normal priority of event
- PRIORITY_HIGH =2 // high priority of event
- };
- INT64 eventtime; // event time
- wchar_t name[128]; // event name
- wchar_t currency[32]; // event currency
- UINT priority; // event priority
- wchar_t period[128]; // event period
- wchar_t val_previous[32]; // event previous value
- wchar_t val_forecast[32]; // event forecast value
- wchar_t val_actual[32]; // event actual value
- UINT language; // news language (WinAPI LANGID)
- UINT languages_list[32]; // list of languages available for news
- UINT reserved[31]; // reserved
- };
- #pragma pack(pop)
- //+------------------------------------------------------------------+
- //| Gateway events notification interface |
- //+------------------------------------------------------------------+
- class IMTGatewaySink
- {
- public:
- //--- connection type
- enum EnConnectType
- {
- CONNECT_TYPE_TRADE =1, // Trade server
- CONNECT_TYPE_HISTORY =2, // History server
- CONNECT_TYPE_ECN =3, // ECN
- CONNECT_TYPE_BACKUP =4, // Backup server
- };
- public:
- //--- MetaTrader Server's connection events and hooks
- virtual MTAPIRES HookServerConnect(LPCWSTR /*address*/,
- const UINT /*type*/,
- const UINT64 /*login*/) { return(MT_RET_OK); }
- virtual void OnServerDisconnect(LPCWSTR /*address*/,
- const UINT /*type*/,
- const UINT64 /*login*/) { }
- //--- gateway events
- virtual void OnGatewayConfig(const UINT64 /*login*/,const IMTConGateway* /*config*/) { }
- virtual void OnGatewayConfig(const UINT64 /*login*/,const IMTConFeeder* /*config*/) { }
- virtual void OnGatewayStart(void) { }
- virtual void OnGatewayStop(void) { }
- virtual void OnGatewayShutdown(const UINT64 /*login*/) { }
- //--- asynchronous methods notifications
- //--- DealerLock result notification
- virtual void OnDealerLock(const MTAPIRES /*retcode*/,
- const IMTRequest* /*request*/,
- const IMTUser* /*user*/,
- const IMTAccount* /*account*/,
- const IMTOrder* /*order*/,
- const IMTPosition* /*position*/) { }
- //--- DealerAnswer result notification
- virtual void OnDealerAnswer(const MTAPIRES /*retcode*/,
- const IMTConfirm* /*confirm*/) { }
- virtual void OnDealerAnswer(const UINT64 /*login*/,
- const MTAPIRES /*retcode*/,
- const IMTExecution* /*execution*/) { }
- //--- external trading system positions control hooks
- virtual MTAPIRES HookGatewayPositionsRequest(void) { return(MT_RET_ERR_NOTIMPLEMENT); }
- virtual MTAPIRES HookGatewayPositionsCheck(void) { return(MT_RET_ERR_NOTIMPLEMENT); }
- virtual MTAPIRES HookGatewayOrdersRequest(void) { return(MT_RET_ERR_NOTIMPLEMENT); }
- virtual MTAPIRES HookGatewayAccountRequest(UINT64 /*login*/,
- LPCWSTR /*account_id*/) { return(MT_RET_ERR_NOTIMPLEMENT); }
- virtual void OnGatewayAccountAnswer(const MTAPIRES /*retcode*/,
- const INT64 /*request_id*/,
- const IMTUser* /*user*/,
- const IMTAccount* /*account*/,
- const IMTOrderArray* /*orders*/,
- const IMTPositionArray* /*positions*/) { }
- virtual void OnGatewayAccountSet(const MTAPIRES /*retcode*/,
- const INT64 /*request_id*/,
- const IMTUser* /*user*/,
- const IMTAccount* /*account*/,
- const IMTOrderArray* /*orders*/,
- const IMTPositionArray* /*positions*/) { }
- //--- quotes symbols changes
- virtual void OnServerSymbolAdd(LPCWSTR /*symbol*/) { }
- virtual void OnServerSymbolDelete(LPCWSTR /*symbol*/) { }
- //--- MetaTrader Server's synchronization event
- virtual void OnServerSynchronized(LPCWSTR /*address*/,
- const UINT /*type*/,
- const UINT64 /*id*/) { }
- };
- //+------------------------------------------------------------------+
- //| Gateway API interface |
- //+------------------------------------------------------------------+
- class IMTGatewayAPI
- {
- public:
- //--- dealer flags
- enum EnDealerRequestFlags
- {
- DEALER_FLAG_NONE =0x00000000, // zero flags
- DEALER_FLAG_AUTOLOCK =0x00000001, // automatically lock new requests from request queue
- DEALER_FLAG_USER =0x00000002, // get IMTUser data on each request
- DEALER_FLAG_ACCOUNT =0x00000004, // get IMTAccount data on each request
- DEALER_FLAG_ORDER =0x00000008, // get IMTOrder data on each request
- DEALER_FLAG_POSITION =0x00000010, // get IMTPosition data on each request
- DEALER_FLAG_EXTERNAL_ACC =0x00000020, // fill ExternalAccount field on each request
- DEALER_FLAG_MARKUP_TRADES =0x00000040 // allow modify trading prices according to markup settings
- };
- //--- interface release
- virtual void Release(void)=0;
- //--- gateway license check
- virtual MTAPIRES LicenseCheck(MTLicenseCheck &check)=0;
- //--- gateway server start-stop
- virtual MTAPIRES Start(IMTGatewaySink *sink,LPCWSTR address=NULL)=0;
- virtual MTAPIRES Stop(void)=0;
- //--- gateway external connection state
- virtual MTAPIRES StateConnect(const UINT state)=0;
- virtual MTAPIRES StateTraffic(const UINT received_bytes,const UINT sent_bytes)=0;
- virtual MTAPIRES StateReserved1(void)=0;
- virtual MTAPIRES StateReserved2(void)=0;
- virtual MTAPIRES StateReserved3(void)=0;
- virtual MTAPIRES StateReserved4(void)=0;
- //--- client connection management
- virtual MTAPIRES ClientAdd(const UINT64 login,LPCWSTR password)=0;
- virtual MTAPIRES ClientAllowIP(LPCWSTR address)=0;
- virtual MTAPIRES ClientReserved1(void)=0;
- virtual MTAPIRES ClientReserved2(void)=0;
- virtual MTAPIRES ClientReserved3(void)=0;
- virtual MTAPIRES ClientReserved4(void)=0;
- //--- gateway server data access
- virtual MTAPIRES ServerIP(MTAPISTR &ip)=0;
- virtual UINT ServerPort(void)=0;
- virtual UINT ServerConnections(void)=0;
- virtual MTAPIRES ServerReserved1(void)=0;
- virtual MTAPIRES ServerReserved2(void)=0;
- virtual MTAPIRES ServerReserved3(void)=0;
- virtual MTAPIRES ServerReserved4(void)=0;
- //--- log functions
- virtual MTAPIRES LoggerOut(const UINT code,LPCWSTR format,...)=0;
- virtual void LoggerFlush(void)=0;
- virtual LPCWSTR LoggerPath(MTAPISTR& ip)=0;
- virtual MTAPIRES LoggerReserved2(void)=0;
- virtual MTAPIRES LoggerReserved3(void)=0;
- virtual MTAPIRES LoggerReserved4(void)=0;
- //--- send data functions
- virtual MTAPIRES SendTickStats(MTTickStat *stats,const UINT stats_total)=0;
- virtual MTAPIRES SendTicks(MTTick *ticks,const UINT ticks_total)=0;
- virtual MTAPIRES SendBookDiffs(MTBookDiff *bookdiffs,const UINT bookdiffs_total)=0;
- virtual MTAPIRES SendNews(MTNews *news,const UINT news_total)=0;
- virtual MTAPIRES SendEconomicEvents(MTEconomicEvent *events,const UINT events_total)=0;
- virtual MTAPIRES SendBooks(MTBook *books,const UINT books_total)=0;
- virtual MTAPIRES SendReserved1(void)=0;
- virtual MTAPIRES SendReserved2(void)=0;
- //--- feeder configuration
- virtual IMTConFeeder* FeederCreate(void)=0;
- virtual IMTConParam* FeederParamCreate(void)=0;
- virtual IMTConFeederTranslate* FeederTranslateCreate(void)=0;
- //--- gateway configuration
- virtual IMTConGateway* GatewayCreate(void)=0;
- virtual IMTConParam* GatewayParamCreate(void)=0;
- virtual IMTConGatewayTranslate* GatewayTranslateCreate(void)=0;
- //--- clients group configuration
- virtual IMTConGroup* GroupCreate(void)=0;
- virtual IMTConGroupSymbol* GroupSymbolCreate(void)=0;
- virtual IMTConCommission* GroupCommissionCreate(void)=0;
- virtual IMTConCommTier* GroupTierCreate(void)=0;
- virtual MTAPIRES GroupSubscribe(IMTConGroupSink *sink)=0;
- virtual MTAPIRES GroupUnsubscribe(IMTConGroupSink *sink)=0;
- virtual UINT GroupTotal(void)=0;
- virtual MTAPIRES GroupNext(const UINT pos,IMTConGroup *group)=0;
- virtual MTAPIRES GroupGet(LPCWSTR name,IMTConGroup *group)=0;
- virtual MTAPIRES GroupReserved1(void)=0;
- virtual MTAPIRES GroupReserved2(void)=0;
- virtual MTAPIRES GroupReserved3(void)=0;
- virtual MTAPIRES GroupReserved4(void)=0;
- //--- trade server symbol configuration access
- virtual IMTConSymbol* SymbolCreate(void)=0;
- virtual IMTConSymbolSession* SymbolSessionCreate(void)=0;
- virtual MTAPIRES SymbolSubscribe(IMTConSymbolSink *sink)=0;
- virtual MTAPIRES SymbolUnsubscribe(IMTConSymbolSink *sink)=0;
- virtual MTAPIRES SymbolAddPreliminary(IMTConSymbol *symbol)=0;
- virtual UINT SymbolTotal(void)=0;
- virtual MTAPIRES SymbolNext(const UINT pos,IMTConSymbol *symbol)=0;
- virtual MTAPIRES SymbolGet(LPCWSTR name,IMTConSymbol *symbol)=0;
- virtual MTAPIRES SymbolGet(LPCWSTR name,LPCWSTR name_group,IMTConSymbol *symbol)=0;
- virtual MTAPIRES SymbolUpdate(IMTConSymbol *symbol)=0;
- virtual MTAPIRES SymbolDelete(LPCWSTR name)=0;
- virtual MTAPIRES SymbolReserved1(void)=0;
- //--- time config
- virtual IMTConTime* TimeCreate(void)=0;
- virtual MTAPIRES TimeSubscribe(IMTConTimeSink *sink)=0;
- virtual MTAPIRES TimeUnsubscribe(IMTConTimeSink *sink)=0;
- virtual INT64 TimeCurrent(void)=0;
- virtual MTAPIRES TimeGet(IMTConTime *common)=0;
- virtual MTAPIRES TimeReserved1(void)=0;
- virtual MTAPIRES TimeReserved2(void)=0;
- virtual MTAPIRES TimeReserved3(void)=0;
- virtual MTAPIRES TimeReserved4(void)=0;
- //--- requests
- virtual IMTRequest* RequestCreate(void)=0;
- virtual IMTRequestArray* RequestArrayCreate(void)=0;
- virtual MTAPIRES RequestSubscribe(IMTRequestSink *sink)=0;
- virtual MTAPIRES RequestUnsubscribe(IMTRequestSink *sink)=0;
- virtual UINT RequestTotal(void)=0;
- virtual MTAPIRES RequestNext(const UINT pos,IMTRequest *request,IMTUser *user,IMTAccount *account,IMTOrder *order,IMTPosition *position)=0;
- virtual MTAPIRES RequestGet(const UINT id,IMTRequest *request,IMTUser *user,IMTAccount *account,IMTOrder *order,IMTPosition *position)=0;
- virtual MTAPIRES RequestGetAll(IMTRequestArray *requests)=0;
- virtual MTAPIRES RequestReserved1(void)=0;
- virtual MTAPIRES RequestReserved2(void)=0;
- virtual MTAPIRES RequestReserved3(void)=0;
- virtual MTAPIRES RequestReserved4(void)=0;
- //--- dealing
- virtual IMTConfirm* DealerConfirmCreate(void)=0;
- virtual IMTExecution* DealerExecutionCreate(void)=0;
- virtual MTAPIRES DealerStart(const UINT flags)=0;
- virtual MTAPIRES DealerStop(void)=0;
- virtual MTAPIRES DealerGetAsync(void)=0;
- virtual MTAPIRES DealerLockAsync(const UINT id)=0;
- virtual MTAPIRES DealerAnswerAsync(IMTConfirm *confirm)=0;
- virtual MTAPIRES DealerExecuteAsync(IMTExecution *execution)=0;
- virtual MTAPIRES DealerReserved1(void)=0;
- virtual MTAPIRES DealerReserved2(void)=0;
- virtual MTAPIRES DealerReserved3(void)=0;
- virtual MTAPIRES DealerReserved4(void)=0;
- //--- internal email
- virtual IMTMail* MailCreate(void)=0;
- virtual MTAPIRES MailSend(IMTMail *mail)=0;
- virtual MTAPIRES MailReserved1(void)=0;
- virtual MTAPIRES MailReserved2(void)=0;
- virtual MTAPIRES MailReserved3(void)=0;
- virtual MTAPIRES MailReserved4(void)=0;
- //--- clients database
- virtual IMTUser* UserCreate(void)=0;
- virtual IMTAccount* UserCreateAccount(void)=0;
- //--- open orders database
- virtual IMTOrder* OrderCreate(void)=0;
- //--- trade positions database
- virtual IMTPosition* PositionCreate(void)=0;
- //--- custom settings control
- virtual MTAPIRES SettingsAdd(const IMTConParam *param)=0;
- virtual MTAPIRES SettingsUpdate(const UINT pos,const IMTConParam *param)=0;
- virtual MTAPIRES SettingsUpdate(const IMTConParam *param)=0;
- virtual MTAPIRES SettingsDelete(const UINT pos)=0;
- virtual MTAPIRES SettingsDelete(LPCWSTR name)=0;
- virtual MTAPIRES SettingsClear(void)=0;
- virtual UINT SettingsTotal(void)=0;
- virtual MTAPIRES SettingsNext(const UINT pos,IMTConParam *param)=0;
- virtual MTAPIRES SettingsGet(LPCWSTR name,IMTConParam *param)=0;
- virtual MTAPIRES SettingsReserved1(void)=0;
- virtual MTAPIRES SettingsReserved2(void)=0;
- virtual MTAPIRES SettingsReserved3(void)=0;
- virtual MTAPIRES SettingsReserved4(void)=0;
- //--- external trading system positions control
- virtual IMTConParamArray* GatewayParamArrayCreate(void)=0;
- virtual IMTPositionArray* GatewayPositionArrayCreate(void)=0;
- virtual MTAPIRES GatewayPositionsAnswer(const MTAPIRES result,const INT64 positions_time,const IMTPositionArray *positions)=0;
- virtual MTAPIRES GatewayPositionsCheck(const MTAPIRES result,const INT64 positions_time,const IMTPositionArray *positions)=0;
- virtual MTAPIRES GatewayPositionsReserved1(void)=0;
- virtual MTAPIRES GatewayPositionsReserved2(void)=0;
- virtual MTAPIRES GatewayPositionsReserved3(void)=0;
- virtual MTAPIRES GatewayPositionsReserved4(void)=0;
- //--- chart data
- virtual MTAPIRES ChartRequest(LPCWSTR symbol,const INT64 from,const INT64 to,MTChartBar *&bars,UINT &bars_total)=0;
- virtual MTAPIRES ChartDelete(LPCWSTR symbol,const INT64 *bars_dates,const UINT bars_total)=0;
- virtual MTAPIRES ChartUpdate(LPCWSTR symbol,const MTChartBar *bars,const UINT bars_total)=0;
- virtual MTAPIRES ChartReplace(LPCWSTR symbol,const INT64 from,const INT64 to,const MTChartBar *bars,const UINT bars_total)=0;
- virtual MTAPIRES ChartReserved1(void)=0;
- virtual MTAPIRES ChartReserved2(void)=0;
- virtual MTAPIRES ChartReserved3(void)=0;
- virtual MTAPIRES ChartReserved4(void)=0;
- //--- memory management
- virtual void* Allocate(const UINT bytes)=0;
- virtual void Free(void *ptr)=0;
- //--- spreads configuration
- virtual IMTConSpread* SpreadCreate(void)=0;
- virtual IMTConSpreadLeg* SpreadLegCreate(void)=0;
- virtual MTAPIRES SpreadSubscribe(IMTConSpreadSink *sink)=0;
- virtual MTAPIRES SpreadUnsubscribe(IMTConSpreadSink *sink)=0;
- virtual MTAPIRES SpreadAdd(IMTConSpread *spread)=0;
- virtual MTAPIRES SpreadDelete(const UINT pos)=0;
- virtual MTAPIRES SpreadShift(const UINT pos,const int shift)=0;
- virtual UINT SpreadTotal(void)=0;
- virtual MTAPIRES SpreadNext(const UINT pos,IMTConSpread *spread)=0;
- virtual MTAPIRES SpreadGet(const UINT id,IMTConSpread *spread)=0;
- virtual MTAPIRES SpreadReserved1(void)=0;
- virtual MTAPIRES SpreadReserved2(void)=0;
- virtual MTAPIRES SpreadReserved3(void)=0;
- virtual MTAPIRES SpreadReserved4(void)=0;
- //--- external trading system pending orders control
- virtual IMTOrderArray* GatewayOrderArrayCreate(void)=0;
- virtual MTAPIRES GatewayOrdersAnswer(const MTAPIRES result,const INT64 orders_time,const IMTOrderArray *orders)=0;
- virtual MTAPIRES GatewayOrdersReserved1(void)=0;
- virtual MTAPIRES GatewayOrdersReserved2(void)=0;
- virtual MTAPIRES GatewayOrdersReserved3(void)=0;
- virtual MTAPIRES GatewayOrdersReserved4(void)=0;
- //--- external trading system trading accounts control
- virtual MTAPIRES GatewayAccountAnswer(const MTAPIRES result,
- const INT64 accounts_time,
- const IMTUser *user,
- const IMTAccount *account,
- const IMTOrderArray *orders,
- const IMTPositionArray *positions)=0;
- virtual MTAPIRES GatewayAccountRequest(const INT64 request_id,
- const IMTUser *user)=0;
- virtual MTAPIRES GatewayAccountSet(const INT64 request_id,
- const IMTUser *user,
- const IMTAccount *account,
- const IMTOrderArray *orders,
- const IMTPositionArray *positions)=0;
- virtual MTAPIRES GatewayAccountsReserved1(void)=0;
- virtual MTAPIRES GatewayAccountsReserved2(void)=0;
- //--- platform server config
- virtual IMTConServer* NetServerCreate(void)=0;
- virtual IMTConServerRange* NetServerRangeCreate(void)=0;
- virtual MTAPIRES NetServerSubscribe(IMTConServerSink* sink)=0;
- virtual MTAPIRES NetServerUnsubscribe(IMTConServerSink* sink)=0;
- virtual UINT NetServerTotal(void)=0;
- virtual MTAPIRES NetServerNext(const UINT pos,IMTConServer* config)=0;
- virtual MTAPIRES NetServerGet(const UINT64 id,IMTConServer* config)=0;
- virtual MTAPIRES NetServerReserved1(void)=0;
- virtual MTAPIRES NetServerReserved2(void)=0;
- virtual MTAPIRES NetServerReserved3(void)=0;
- virtual MTAPIRES NetServerReserved4(void)=0;
- //--- clients database
- virtual MTAPIRES UserSubscribe(IMTUserSink* sink)=0;
- virtual MTAPIRES UserUnsubscribe(IMTUserSink* sink)=0;
- virtual UINT UserTotal(void)=0;
- virtual MTAPIRES UserGet(const UINT64 login,IMTUser* user)=0;
- virtual MTAPIRES UserGroup(const UINT64 login,MTAPISTR& group)=0;
- virtual MTAPIRES UserLogins(UINT64*& logins,UINT& logins_total)=0;
- virtual MTAPIRES UserGetByAccount(LPCWSTR account,IMTUser* user)=0;
- virtual MTAPIRES UserReserved1(void)=0;
- virtual MTAPIRES UserReserved2(void)=0;
- virtual MTAPIRES UserReserved3(void)=0;
- virtual MTAPIRES UserReserved4(void)=0;
- virtual MTAPIRES UserReserved5(void)=0;
- virtual MTAPIRES UserReserved6(void)=0;
- virtual MTAPIRES UserReserved7(void)=0;
- //--- gateway symbol configuration access
- virtual MTAPIRES GatewaySymbolAdd(IMTConSymbol *symbol)=0;
- virtual UINT GatewaySymbolTotal(void)=0;
- virtual MTAPIRES GatewaySymbolNext(const UINT pos,IMTConSymbol *symbol)=0;
- virtual MTAPIRES GatewaySymbolGet(LPCWSTR name,IMTConSymbol *symbol)=0;
- virtual MTAPIRES GatewaySymbolDelete(LPCWSTR name)=0;
- virtual MTAPIRES GatewaySymbolClear(void)=0;
- virtual MTAPIRES GatewaySymbolReserver1(void)=0;
- virtual MTAPIRES GatewaySymbolReserver2(void)=0;
- virtual MTAPIRES GatewaySymbolReserver3(void)=0;
- virtual MTAPIRES GatewaySymbolReserver4(void)=0;
- //--- ticks history
- virtual MTAPIRES TickHistoryRequest(LPCWSTR symbol,const INT64 from,const INT64 to,MTTickRate*& ticks,UINT& ticks_total)=0;
- virtual MTAPIRES TickHistoryRequestRaw(LPCWSTR symbol,const INT64 from,const INT64 to,MTTickRate*& ticks,UINT& ticks_total)=0;
- virtual MTAPIRES TickHistoryAdd(LPCWSTR symbol,const MTTickRate* ticks,const UINT ticks_total)=0;
- virtual MTAPIRES TickHistoryReplace(LPCWSTR symbol,const INT64 from_msc,const INT64 to_msc,const MTTickRate* ticks,const UINT ticks_total)=0;
- virtual MTAPIRES TickHistoryReserver1(void)=0;
- virtual MTAPIRES TickHistoryReserver2(void)=0;
- virtual MTAPIRES TickHistoryReserver3(void)=0;
- virtual MTAPIRES TickHistoryReserver4(void)=0;
- };
- //+------------------------------------------------------------------+
- //| Entry point functions declarations |
- //+------------------------------------------------------------------+
- typedef /*__declspec(dllexport)*/ MTAPIRES(*MTGatewayVersion_t) (UINT &version);
- typedef /*__declspec(dllexport)*/ MTAPIRES(*MTGatewayCreate_t) (MTGatewayInfo &info,IMTGatewayAPI **gateway);
- typedef /*__declspec(dllexport)*/ MTAPIRES(*MTGatewayCreateLocal_t) (MTGatewayInfo &info,IMTGatewayAPI **gateway,int argc,wchar_t** argv);
- //+------------------------------------------------------------------+
- //| Entry point functions names |
- //+------------------------------------------------------------------+
- static const LPCSTR s_MTGatewayVersion ="MTGatewayVersion";
- static const LPCSTR s_MTGatewayCreate ="MTGatewayCreate";
- static const LPCSTR s_MTGatewayCreateLocal ="MTGatewayCreateLocal";
- //+------------------------------------------------------------------+
- //| Gateway factory |
- //+------------------------------------------------------------------+
- class CMTGatewayAPIFactory
- {
- HMODULE m_hmodule;
- MTGatewayVersion_t m_mtversion;
- MTGatewayCreate_t m_mtcreate;
- MTGatewayCreateLocal_t m_mtcreate_local;
- public:
- CMTGatewayAPIFactory() : m_hmodule(NULL),m_mtversion(NULL),m_mtcreate(NULL),m_mtcreate_local(NULL) {}
- //--- initialize & shutdown
- MTAPIRES Initialize(void);
- MTAPIRES Shutdown(void);
- //--- gateway creation
- MTAPIRES Create(MTGatewayInfo &info,IMTGatewayAPI **gateway,int argc=0,wchar_t** argv=NULL) const;
- //--- check license sign
- static MTAPIRES LicenseCheck(IMTGatewayAPI *gateway,LPCWSTR name);
- //--- version info
- MTAPIRES Version(UINT &version) const;
- private:
- bool FindLibrary(wchar_t *path,const size_t path_maxlen);
- };
- //+------------------------------------------------------------------+
- //| Library initialization |
- //+------------------------------------------------------------------+
- inline MTAPIRES CMTGatewayAPIFactory::Initialize(void)
- {
- wchar_t path[MAX_PATH]={};
- //--- find the Gateway API DLL
- if(!FindLibrary(path,_countof(path)-1))
- return(MT_RET_ERR_NOTFOUND);
- //--- try to load Gateway API DLL from current folder
- if((m_hmodule=::LoadLibrary(path))==NULL)
- return(MT_RET_ERR_NOTFOUND);
- //--- load Gateway API DLL
- if(m_hmodule)
- {
- //--- find entry point addresses
- m_mtversion =reinterpret_cast<MTGatewayVersion_t>(::GetProcAddress(m_hmodule,s_MTGatewayVersion));
- m_mtcreate =reinterpret_cast<MTGatewayCreate_t>(::GetProcAddress(m_hmodule,s_MTGatewayCreate));
- m_mtcreate_local=reinterpret_cast<MTGatewayCreateLocal_t>(::GetProcAddress(m_hmodule,s_MTGatewayCreateLocal));
- //--- check results
- if(!m_mtversion || !m_mtcreate || !m_mtcreate_local)
- {
- Shutdown();
- //--- not found
- return(MT_RET_ERR_NOTFOUND);
- }
- }
- //--- ok
- return(MT_RET_OK);
- }
- //+------------------------------------------------------------------+
- //| Library shutdown |
- //+------------------------------------------------------------------+
- inline MTAPIRES CMTGatewayAPIFactory::Shutdown(void)
- {
- //--- check & free
- if(m_hmodule)
- {
- ::FreeLibrary((HMODULE)m_hmodule);
- m_hmodule=NULL;
- }
- //--- zero members
- m_mtversion =NULL;
- m_mtcreate =NULL;
- m_mtcreate_local=NULL;
- //--- ok
- return(MT_RET_OK);
- }
- //+------------------------------------------------------------------+
- //| Find the library |
- //+------------------------------------------------------------------+
- inline bool CMTGatewayAPIFactory::FindLibrary(wchar_t *path,const size_t path_maxlen)
- {
- wchar_t folder[MAX_PATH]={};
- wchar_t *ptr;
- //--- find the folder
- ::GetModuleFileNameW(NULL,folder,_countof(folder)-1);
- //--- check for 5 levels
- for(int i=0;i<5;i++)
- {
- //--- remove level
- if((ptr=wcsrchr(folder,L'\\'))==NULL)
- break;
- *ptr=L'\0';
- //--- check the file
- if(sizeof(void*)==4)
- swprintf_s(path,path_maxlen,L"%s\\MT5APIGateway.dll",folder);
- else
- swprintf_s(path,path_maxlen,L"%s\\MT5APIGateway64.dll",folder);
- if(GetFileAttributesW(path)!=INVALID_FILE_ATTRIBUTES)
- return(true);
- //--- check /libs folder
- if(sizeof(void*)==4)
- swprintf_s(path,path_maxlen,L"%s\\libs\\MT5APIGateway.dll",folder);
- else
- swprintf_s(path,path_maxlen,L"%s\\libs\\MT5APIGateway64.dll",folder);
- if(GetFileAttributesW(path)!=INVALID_FILE_ATTRIBUTES)
- return(true);
- }
- //---
- return(false);
- }
- //+------------------------------------------------------------------+
- //| Gateway interface creation |
- //+------------------------------------------------------------------+
- inline MTAPIRES CMTGatewayAPIFactory::Create(MTGatewayInfo& info,IMTGatewayAPI **gateway,int argc/*=0*/,wchar_t** argv/*=NULL*/) const
- {
- MTAPIRES res=MT_RET_ERROR;
- //--- check members & parameters
- if(!m_hmodule || !m_mtcreate || !m_mtcreate_local || !gateway)
- return(MT_RET_ERROR);
- //--- call common or local-mode creation
- if(!argc || !argv)
- res=m_mtcreate(info,gateway);
- else
- res=m_mtcreate_local(info,gateway,argc,argv);
- //--- result
- return(res);
- }
- //+------------------------------------------------------------------+
- //| Gateway license sign check |
- //+------------------------------------------------------------------+
- inline MTAPIRES CMTGatewayAPIFactory::LicenseCheck(IMTGatewayAPI *gateway,LPCWSTR name)
- {
- //--- checking
- if(!gateway || !name || name[0]==L'\0')
- return(MT_RET_ERROR);
- //--- fill license information, copy name
- MTLicenseCheck license={};
- HCRYPTPROV prov=NULL;
- HCRYPTHASH hash=NULL;
- HCRYPTKEY key =NULL;
- MTAPIRES res=MT_RET_ERROR;
- wcscpy_s(license.name,_countof(license.name),name);
- //--- initialize random generator
- srand((unsigned int)GetTickCount());
- //--- generate sequence of random numbers
- for(license.random_size=0;license.random_size<sizeof(license.random);license.random_size++)
- license.random[license.random_size]=char(rand()&0xFF);
- //--- check license
- gateway->LicenseCheck(license);
- //--- check retcode
- if(license.retcode!=MT_RET_OK)
- return(license.retcode);
- //--- check license sign, initialize provider
- if(CryptAcquireContext(&prov,NULL,MS_DEF_PROV,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)==FALSE)
- return(MT_RET_ERROR);
- //--- import public key
- if(CryptImportKey(prov,(const BYTE*)MT5APIPublicKey,sizeof(MT5APIPublicKey),0,0,&key)!=FALSE)
- {
- //--- initialize hash object
- if(CryptCreateHash(prov,CALG_MD5,0,0,&hash)!=FALSE)
- {
- //--- set hash from data
- if(CryptHashData(hash,(BYTE*)&license,(DWORD)offsetof(MTLicenseCheck,retcode),0)!=FALSE)
- {
- //--- verify hash sign, using public key
- if(CryptVerifySignature(hash,(BYTE*)license.sign,(DWORD)license.sign_size,key,NULL,0)!=FALSE)
- res=license.retcode;
- else
- res=MT_RET_ERR_DATA;
- }
- }
- }
- //--- destroy hash
- if(hash)
- CryptDestroyHash(hash);
- //--- destroy key
- if(key)
- CryptDestroyKey(key);
- //--- release provider
- if(prov)
- CryptReleaseContext(prov,0);
- //--- return result
- return(res);
- }
- //+------------------------------------------------------------------+
- //| Version |
- //+------------------------------------------------------------------+
- inline MTAPIRES CMTGatewayAPIFactory::Version(UINT &version) const
- {
- //--- check members & parameters
- if(!m_hmodule || !m_mtversion)
- return(MT_RET_ERROR);
- //--- result
- return(m_mtversion(version));
- }
- //+------------------------------------------------------------------+
|