//+------------------------------------------------------------------+
//| ArbitrageVisualiser.mq4 |
//| Copyright 2016, |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link
#property version "1.00"
#property strict
input bool Trade = false; // Торговать разницу котировок или нет
input bool IsMaster = true; // false ставим на счет с быстрыми котировками, true на счет с запаздывающими
input double PointsDifference = 0.0005; // размер запаздывания котировок для открытия позы
input int Slippage = 0; // проскальзывание для 4-х значных котировок
input double LotSizeMultiplier = 0.1; // множитель лота для ордеров
input int OrderMagic = 453535;
double Lots;
int filehandleBid, filehandleAsk;
datetime dateBid, dateAsk;
double priceBid, priceAsk;
void OnTick()
{
if(IsMaster == false)
{
filehandleBid=FileOpen("BidQuote.csv", FILE_WRITE|FILE_CSV|FILE_COMMON); // пишем в файл биды с быстрого счета
FileWrite(filehandleBid, MarketInfo(Symbol(), MODE_BID),TimeCurrent());
FileClose(filehandleBid);
filehandleAsk=FileOpen("AskQuote.csv", FILE_WRITE|FILE_CSV|FILE_COMMON); // пишем в файл аски с быстрого счета
FileWrite(filehandleAsk, MarketInfo(Symbol(), MODE_ASK),TimeCurrent());
FileClose(filehandleAsk);
}
if(IsMaster == true)
{
filehandleBid=FileOpen("BidQuote.csv", FILE_READ|FILE_CSV|FILE_COMMON); // читаем из файла биды
priceBid = FileReadNumber(filehandleBid);
dateBid = FileReadDatetime(filehandleBid);
FileClose(filehandleBid);
filehandleAsk=FileOpen("AskQuote.csv", FILE_READ|FILE_CSV|FILE_COMMON); // читаем из файла аски
priceAsk = FileReadNumber(filehandleAsk);
dateAsk = FileReadDatetime(filehandleAsk);
FileClose(filehandleAsk);
ObjectCreate(0,"LineBid",OBJ_HLINE,0,0,priceBid); // рисуем линию бид
ObjectSetInteger(0,"LineBid",OBJPROP_COLOR, Green);
ObjectSetInteger(0,"LineBid",OBJPROP_STYLE, 4);
ObjectMove(0,"LineBid", 0, 0, priceBid);
ObjectCreate(0,"LineAsk",OBJ_HLINE,0,0,priceAsk); // рисуем линию аск
ObjectSetInteger(0,"LineAsk",OBJPROP_COLOR, Red);
ObjectSetInteger(0,"LineAsk",OBJPROP_STYLE, 4);
ObjectMove(0,"LineAsk", 0, 0, priceAsk);
if (MarketInfo(Symbol(), MODE_ASK) <= priceAsk - PointsDifference && Trade == true)
{
if(CountOrders()==0)
{
Lots = LotsOptimized();
if(OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Bid-PointsDifference, Bid+PointsDifference, NULL, 0, Green) == false) GetLastError();
}
Print("Buy Ok");
}
if (MarketInfo(Symbol(), MODE_BID) >= priceBid + PointsDifference && Trade == true)
{
if(CountOrders()==0)
{
Lots = LotsOptimized();
if(OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Ask+PointsDifference, Ask-PointsDifference, NULL, 0, Red) == false) GetLastError();
}
Print("Sell Ok");
}
}
}
int CountOrders()
{
int result=0;
for (int k=0; k <OrdersTotal(); k++)
{
if (OrderSelect(k,SELECT_BY_POS)==true)
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{result++;}
else
{}
}
}
return(result);
}
double LotsOptimized()
{
double lot;
lot=NormalizeDouble(AccountFreeMargin()*LotSizeMultiplier/1000.0,2);
if(lot<0.01) lot=0.01;
if(lot>200) lot=200;
return(lot);
}
//+------------------------------------------------------------------+