//+------------------------------------------------------------------+
//|                                                 MetaTrader 5 API |
//|                   Copyright 2000-2019, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#pragma once
//+------------------------------------------------------------------+
//| Gateway module config                                            |
//+------------------------------------------------------------------+
class IMTConGatewayModule
  {
   //--- changeable fields flags
   enum EnGatewayFieldMask
     {
      GATEWAY_FIELD_SERVER=1,         // server field
      GATEWAY_FIELD_LOGIN =2,         // login field
      GATEWAY_FIELD_PASS  =4,         // password field
      GATEWAY_FIELD_PARAM =8,         // parameters
      //--- enumeration borders
      GATEWAY_FIELD_NONE  =0,
      GATEWAY_FIELD_ALL   =GATEWAY_FIELD_SERVER|GATEWAY_FIELD_LOGIN|GATEWAY_FIELD_PASS|GATEWAY_FIELD_PARAM
     };
public:
   //--- common methods
   virtual void      Release(void)=0;
   virtual MTAPIRES  Assign(const IMTConGatewayModule* param)=0;
   virtual MTAPIRES  Clear(void)=0;
   //--- default gateway name
   virtual LPCWSTR   Name(void) const=0;
   //--- vendor name
   virtual LPCWSTR   Vendor(void) const=0;
   //--- gateway description
   virtual LPCWSTR   Description(void) const=0;
   //--- gateway file name
   virtual LPCWSTR   Module(void) const=0;
   //--- gateway default server address for trading
   virtual LPCWSTR   TradingServer(void) const=0;
   //--- gateway default login for trading
   virtual LPCWSTR   TradingLogin(void) const=0;
   //--- gateway default password for trading
   virtual LPCWSTR   TradingPassword(void) const=0;
   //--- gateway version
   virtual UINT      Version(void) const=0;
   //--- gateway available flags (IMTConGateway::EnGatewayFlags)
   virtual UINT      Flags(void) const=0;
   //--- changeable EnFeedersFieldFlags
   virtual UINT      Fields(void) const=0;
   //--- default gateway parameters
   virtual UINT      ParameterTotal(void) const=0;
   virtual MTAPIRES  ParameterNext(const UINT pos,IMTConParam* param) const=0;
   virtual MTAPIRES  ParameterGet(LPCWSTR name,IMTConParam* param) const=0;
   //--- gateway given name
   virtual LPCWSTR   Gateway(void) const=0;
  };
//+------------------------------------------------------------------+
//| Symbols name and price translation config                        |
//+------------------------------------------------------------------+
class IMTConGatewayTranslate
  {
public:
   //--- common methods
   virtual void      Release(void)=0;
   virtual MTAPIRES  Assign(const IMTConGatewayTranslate* param)=0;
   virtual MTAPIRES  Clear(void)=0;
   //--- symbol name in datafeed
   virtual LPCWSTR   Source(void) const=0;
   virtual MTAPIRES  Source(LPCWSTR source)=0;
   //--- symbol name in MT5
   virtual LPCWSTR   Symbol(void) const=0;
   virtual MTAPIRES  Symbol(LPCWSTR symbol)=0;
   //--- bid markup in points
   virtual INT       BidMarkup(void) const=0;
   virtual MTAPIRES  BidMarkup(const INT markup)=0;
   //--- ask markup in points
   virtual INT       AskMarkup(void) const=0;
   virtual MTAPIRES  AskMarkup(const INT markup)=0;
   //--- digits
   virtual UINT      Digits(void) const=0;
  };
//+------------------------------------------------------------------+
//| Gateway config interface                                         |
//+------------------------------------------------------------------+
class IMTConGateway
  {
public:
   //--- gateway working flags
   enum EnGatewayFlags
     {
      GATEWAY_FLAG_REMOTE         =1,        // gateway works as remote service
      GATEWAY_FLAG_IMPORT_SYMBOLS =2,        // gateway can import symbols to MetaTrader platform
      GATEWAY_FLAG_IGNORE_QUOTES  =4,        // ignore quotes from gateway
      GATEWAY_FLAG_IMPORT_BALANCES=8,        // gateway can import client balances to MetaTrader platform
      GATEWAY_FLAG_EXTENDED_LOG   =16,       // gateway writes extended log
      GATEWAY_FLAG_SUPP_POSITIONS =32,       // gateway support request of trading positions from external trading system
      //--- flags borders
      GATEWAY_FLAG_NONE           =0,
      GATEWAY_FLAG_ALL            =GATEWAY_FLAG_REMOTE|GATEWAY_FLAG_IMPORT_SYMBOLS|
      GATEWAY_FLAG_IGNORE_QUOTES|GATEWAY_FLAG_IMPORT_BALANCES|
      GATEWAY_FLAG_EXTENDED_LOG|GATEWAY_FLAG_SUPP_POSITIONS
     };
   //--- gateway modes
   enum EnGatewayMode
     {
      GATEWAY_DISABLED  =0,
      GATEWAY_ENABLED   =1,
      //--- enumeration borders
      GATEWAY_FIRST     =GATEWAY_DISABLED,
      GATEWAY_LAST      =GATEWAY_ENABLED
     };
   //--- common methods
   virtual void      Release(void)=0;
   virtual MTAPIRES  Assign(const IMTConGateway* param)=0;
   virtual MTAPIRES  Clear(void)=0;
   //--- gateway name
   virtual LPCWSTR   Name(void) const=0;
   virtual MTAPIRES  Name(LPCWSTR name)=0;
   //--- gateway trade request routing id (dealer id)
   virtual UINT64    ID(void) const=0;
   virtual MTAPIRES  ID(const UINT64 id)=0;
   //--- gateway module name
   virtual LPCWSTR   Module(void) const=0;
   virtual MTAPIRES  Module(LPCWSTR name)=0;
   //--- gateway server address for trading
   virtual LPCWSTR   TradingServer(void) const=0;
   virtual MTAPIRES  TradingServer(LPCWSTR server)=0;
   //--- gateway login for trading
   virtual LPCWSTR   TradingLogin(void) const=0;
   virtual MTAPIRES  TradingLogin(LPCWSTR login)=0;
   //--- gateway password for trading
   virtual LPCWSTR   TradingPassword(void) const=0;
   virtual MTAPIRES  TradingPassword(LPCWSTR password)=0;
   //--- gateway server address
   virtual LPCWSTR   GatewayServer(void) const=0;
   virtual MTAPIRES  GatewayServer(LPCWSTR server)=0;
   //--- EnGatewayMode
   virtual UINT      Mode(void) const=0;
   virtual MTAPIRES  Mode(const UINT mode)=0;
   //--- EnGatewayFlags
   virtual UINT      Flags(void) const=0;
   virtual MTAPIRES  Flags(const UINT flags)=0;
   //--- obsolete value
   virtual UINT      ObsoleteValue(void) const=0;
   virtual MTAPIRES  ObsoleteValue(const UINT value)=0;
   //--- gateway reconnect timeout
   virtual UINT      TimeoutReconnect(void) const=0;
   virtual MTAPIRES  TimeoutReconnect(const UINT timeout)=0;
   //--- gateway sleep timeout
   virtual UINT      TimeoutSleep(void) const=0;
   virtual MTAPIRES  TimeoutSleep(const UINT timeout)=0;
   //--- gateway attempts before timeout
   virtual UINT      TimeoutAttempts(void) const=0;
   virtual MTAPIRES  TimeoutAttempts(const UINT attempts)=0;
   //--- gateway additional parameters access
   virtual MTAPIRES  ParameterAdd(IMTConParam* param)=0;
   virtual MTAPIRES  ParameterUpdate(const UINT pos,const IMTConParam* param)=0;
   virtual MTAPIRES  ParameterDelete(const UINT pos)=0;
   virtual MTAPIRES  ParameterClear(void)=0;
   virtual MTAPIRES  ParameterShift(const UINT pos,const int shift)=0;
   virtual UINT      ParameterTotal(void) const=0;
   virtual MTAPIRES  ParameterNext(const UINT pos,IMTConParam* param) const=0;
   virtual MTAPIRES  ParameterGet(LPCWSTR name,IMTConParam* param) const=0;
   //--- list of symbols for translating quotes
   virtual MTAPIRES  SymbolAdd(LPCWSTR path)=0;
   virtual MTAPIRES  SymbolUpdate(const UINT pos,LPCWSTR path)=0;
   virtual MTAPIRES  SymbolDelete(const UINT pos)=0;
   virtual MTAPIRES  SymbolClear(void)=0;
   virtual MTAPIRES  SymbolShift(const UINT pos,const int shift)=0;
   virtual UINT      SymbolTotal(void) const=0;
   virtual LPCWSTR   SymbolNext(const UINT pos) const=0;
   //--- list of users groups who works through gateway
   virtual MTAPIRES  GroupAdd(LPCWSTR path)=0;
   virtual MTAPIRES  GroupUpdate(const UINT pos,LPCWSTR path)=0;
   virtual MTAPIRES  GroupDelete(const UINT pos)=0;
   virtual MTAPIRES  GroupClear(void)=0;
   virtual MTAPIRES  GroupShift(const UINT pos,const int shift)=0;
   virtual UINT      GroupTotal(void) const=0;
   virtual LPCWSTR   GroupNext(const UINT pos) const=0;
   //--- list of symbols translations
   virtual MTAPIRES  TranslateAdd(IMTConGatewayTranslate* param)=0;
   virtual MTAPIRES  TranslateUpdate(const UINT pos,const IMTConGatewayTranslate* param)=0;
   virtual MTAPIRES  TranslateDelete(const UINT pos)=0;
   virtual MTAPIRES  TranslateClear(void)=0;
   virtual MTAPIRES  TranslateShift(const UINT pos,const int shift)=0;
   virtual UINT      TranslateTotal(void) const=0;
   virtual MTAPIRES  TranslateNext(const UINT pos,IMTConGatewayTranslate* param) const=0;
   virtual MTAPIRES  TranslateGet(LPCWSTR symbol,IMTConGatewayTranslate* param) const=0;
   //--- gateway server login
   virtual UINT64    GatewayLogin(void) const=0;
   virtual MTAPIRES  GatewayLogin(UINT64 login)=0;
   //--- gateway server password
   virtual LPCWSTR   GatewayPassword(void) const=0;
   virtual MTAPIRES  GatewayPassword(LPCWSTR password)=0;
   //--- list of symbols translations
   virtual MTAPIRES  TranslateGetSource(LPCWSTR source,IMTConGatewayTranslate* param) const=0;
   //--- gateway given name
   virtual LPCWSTR   Gateway(void) const=0;
   //--- gateway state information
   virtual bool      StateConnected(void) const=0;
   virtual UINT      StateReceivedTicks(void) const=0;
   virtual UINT      StateReceivedBooks(void) const=0;
   virtual UINT      StateTrafficIn(void) const=0;
   virtual UINT      StateTrafficOut(void) const=0;
   virtual UINT      StateTradesTotal(void) const=0;
   virtual UINT      StateTradesAverageTime(void) const=0;
  };
//+------------------------------------------------------------------+
//| Gateway config events notification interface                     |
//+------------------------------------------------------------------+
class IMTConGatewaySink
  {
public:
   virtual void      OnGatewayAdd(const IMTConGateway*    /*gateway*/) {  }
   virtual void      OnGatewayUpdate(const IMTConGateway* /*gateway*/) {  }
   virtual void      OnGatewayDelete(const IMTConGateway* /*gateway*/) {  }
   virtual void      OnGatewaySync(void)                               {  }
  };
//+------------------------------------------------------------------+

