using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MTApiService;
using System.Drawing;
using System.Collections;
using System.Net;
namespace MtApi
{
public delegate void MtApiQuoteHandler(object sender, string symbol, double bid, double ask);
public sealed class MtApiClient
{
private const int DOUBLE_ARRAY_LIMIT = 64800;
#region MetaTrader Constants
//Special constant
public const int NULL = 0;
public const int EMPTY = -1;
#endregion
#region ctor
public MtApiClient()
{
mClient.QuoteAdded +=new MtClient.MtQuoteHandler(mClient_QuoteAdded);
mClient.QuoteRemoved += new MtClient.MtQuoteHandler(mClient_QuoteRemoved);
mClient.QuoteUpdated += new MtClient.MtQuoteHandler(mClient_QuoteUpdated);
mClient.ServerDisconnected += new EventHandler(mClient_ServerDisconnected);
mClient.ServerFailed += new EventHandler(mClient_ServerFailed);
}
#endregion
#region Public Methods
///
///Connect with MetaTrader API. Async method.
///
///Address of MetaTrader host (ex. 192.168.1.2)
///Port of host connection (default 8222)
public void BeginConnect(string host, int port)
{
//if (string.IsNullOrEmpty(host) == false && (host.Equals("localhost") || host.Equals("127.0.0.1")))
//{
// this.BeginConnect(port);
//}
//else
//{
Action connectAction = Connect;
connectAction.BeginInvoke(host, port, null, null);
//}
}
///
///Connect with MetaTrader API. Async method.
///
///Port of host connection (default 8222)
public void BeginConnect(int port)
{
Action connectAction = Connect;
connectAction.BeginInvoke(port, null, null);
}
///
///Disconnect from MetaTrader API. Async method.
///
public void BeginDisconnect()
{
Action disconnectAction = Disconnect;
disconnectAction.BeginInvoke(null, null);
}
///
///Load quotes connected into MetaTrader API.
///
public IEnumerable GetQuotes()
{
var quotes = mClient.GetQuotes();
return quotes != null ? (from q in quotes select q.Parse()) : null;
}
#endregion
#region Properties
///
///Connection status of MetaTrader API.
///
public MtConnectionState ConnectionState { get; private set; }
#endregion
#region Trading functions
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit
, string comment, int magic, DateTime expiration, Color arrow_color)
{
var commandParameters = new ArrayList { symbol, (int)cmd, volume, price, slippage, stoploss, takeprofit
, comment, magic, MtApiTimeConverter.ConvertToMtTime(expiration), MtApiColorConverter.ConvertToMtColor(arrow_color) };
return sendCommand(MtCommandType.OrderSend, commandParameters);
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit
, string comment, int magic, DateTime expiration)
{
return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, Color.Empty);
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit
, string comment, int magic)
{
return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, DateTime.MinValue, Color.Empty);
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit
, string comment)
{
return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, 0, DateTime.MinValue, Color.Empty);
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit)
{
return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, null, 0, DateTime.MinValue, Color.Empty);
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, string price, int slippage, double stoploss, double takeprofit)
{
double dPrice = 0;
if (Double.TryParse(price, out dPrice))
return OrderSend(symbol, cmd, volume, dPrice, slippage, stoploss, takeprofit, null, 0, DateTime.MinValue, Color.Empty);
return 0;
}
public int OrderSendBuy(string symbol, double volume, int slippage)
{
return OrderSendBuy(symbol, volume, slippage, 0, 0, null, 0);
}
public int OrderSendSell(string symbol, double volume, int slippage)
{
return OrderSendSell(symbol, volume, slippage, 0, 0, null, 0);
}
public int OrderSendBuy(string symbol, double volume, int slippage, double stoploss, double takeprofit)
{
return OrderSendBuy(symbol, volume, slippage, stoploss, takeprofit, null, 0);
}
public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit)
{
return OrderSendSell(symbol, volume, slippage, stoploss, takeprofit, null, 0);
}
public int OrderSendBuy(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic)
{
var commandParameters = new ArrayList { symbol, volume, slippage, stoploss, takeprofit, comment, magic };
return sendCommand(MtCommandType.OrderSendBuy, commandParameters);
}
public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic)
{
var commandParameters = new ArrayList { symbol, volume, slippage, stoploss, takeprofit, comment, magic };
return sendCommand(MtCommandType.OrderSendSell, commandParameters);
}
public bool OrderClose(int ticket, double lots, double price, int slippage, Color color)
{
var commandParameters = new ArrayList { ticket, lots, price, slippage, MtApiColorConverter.ConvertToMtColor(color) };
return sendCommand(MtCommandType.OrderClose, commandParameters);
}
public bool OrderClose(int ticket, double lots, double price, int slippage)
{
return OrderClose(ticket, lots, price, slippage, Color.Empty);
}
public bool OrderCloseBy(int ticket, int opposite, Color color)
{
var commandParameters = new ArrayList { ticket, opposite, MtApiColorConverter.ConvertToMtColor(color) };
return sendCommand(MtCommandType.OrderCloseBy, commandParameters);
}
public bool OrderCloseBy(int ticket, int opposite)
{
return OrderCloseBy(ticket, opposite, Color.Empty);
}
public bool OrderCloseByCurrentPrice(int ticket, int slippage)
{
var commandParameters = new ArrayList { ticket, slippage };
return sendCommand(MtCommandType.OrderCloseByCurrentPrice, commandParameters);
}
public double OrderClosePrice()
{
return sendCommand(MtCommandType.OrderClosePrice, null);
}
public double OrderClosePrice(int ticket)
{
var commandParameters = new ArrayList { ticket };
double retVal = sendCommand(MtCommandType.OrderClosePriceByTicket, commandParameters);
return retVal;
}
public DateTime OrderCloseTime()
{
var commandResponse = sendCommand(MtCommandType.OrderCloseTime, null);
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
}
public string OrderComment()
{
return sendCommand(MtCommandType.OrderComment, null);
}
public double OrderCommission()
{
return sendCommand(MtCommandType.OrderCommission, null);
}
public bool OrderDelete(int ticket, Color color)
{
var commandParameters = new ArrayList { ticket, MtApiColorConverter.ConvertToMtColor(color) };
return sendCommand(MtCommandType.OrderDelete, commandParameters);
}
public bool OrderDelete(int ticket)
{
return OrderDelete(ticket, Color.Empty);
}
public DateTime OrderExpiration()
{
var commandResponse = sendCommand(MtCommandType.OrderExpiration, null);
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
}
public double OrderLots()
{
return sendCommand(MtCommandType.OrderLots, null);
}
public int OrderMagicNumber()
{
return sendCommand(MtCommandType.OrderMagicNumber, null);
}
public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration, Color arrow_color)
{
var commandParameters = new ArrayList { ticket, price, stoploss, takeprofit, MtApiTimeConverter.ConvertToMtTime(expiration), MtApiColorConverter.ConvertToMtColor(arrow_color) };
return sendCommand(MtCommandType.OrderModify, commandParameters);
}
public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration)
{
return OrderModify(ticket, price, stoploss, takeprofit, expiration, Color.Empty);
}
public double OrderOpenPrice()
{
return sendCommand(MtCommandType.OrderOpenPrice, null);
}
public double OrderOpenPrice(int ticket)
{
var commandParameters = new ArrayList { ticket };
double retVal = sendCommand(MtCommandType.OrderOpenPriceByTicket, commandParameters);
return retVal;
}
public DateTime OrderOpenTime()
{
var commandResponse = sendCommand(MtCommandType.OrderOpenTime, null);
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
}
public void OrderPrint()
{
sendCommand