//+------------------------------------------------------------------+
//| CrossArbitr.mq4 |
//| Scriptong |
//| |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link ""
#property indicator_chart_window
//---- input parameters
extern bool ShowBid=false;
extern bool ShowAsk=false;
extern color BidColor = Lime;
extern color AskColor = Yellow;
extern int AlarmIfPointDifference = 10;
extern string AlarmFile = "wait.wav";
bool Activate = False;
string FP, SP;
double Tick;
int WayForCross;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
string S = Symbol();
if(StringFind(S, "USD", 0) != -1)
{
Comment("Èíäèêàòîð ðàáîòàåò òîëüêî ñ êðîññîâûìè ïàðàìè (GBPJPY, EURJPY, EURGBP è ò. ä)!");
return(0);
}
if(StringLen(S) != 6)
{
Comment("Èíäèêàòîð ðàáîòàåò òîëüêî ñ âàëþòíûìè ïàðàìè, ó êîòîðûõ íàçâàíèå ñîñòîèò èç øåñòè ñèìâîëîâ!");
return(0);
}
// Ïîèñê ïåðâîé âàëþòíîé ïàðû êðîññà
FP = StringSubstr(S, 0, 3)+"USD";
MarketInfo(FP, MODE_BID);
if(GetLastError() > 0)
{
FP = "USD"+StringSubstr(S, 0, 3);
MarketInfo(FP, MODE_BID);
if(GetLastError() > 0)
{
Comment("Íåâîçìîæíî íàéòè èíñòðóìåíò ", FP, " èëè ", StringSubstr(S, 0, 3)+"USD. Íåîáõîäèìî äîáàâèòü åãî â Îáçîðå ðûíêà è ïåðåçàïóñòèòü èíäèêàòîð.");
return(0);
}
}
// --------------------------------------
// "Ñîçäàíèå" âòîðîé âàëþòíîé ïàðû êðîññà
SP = "USD"+StringSubstr(S, 3, 3);
MarketInfo(SP, MODE_BID);
if(GetLastError() > 0)
{
SP = StringSubstr(S, 3, 3)+"USD";
MarketInfo(SP, MODE_BID);
if(GetLastError() > 0)
{
Comment("Íåâîçìîæíî íàéòè èíñòðóìåíò ", SP, " èëè ", StringSubstr(S, 3, 3)+"USD. Íåîáõîäèìî äîáàâèòü åãî â Îáçîðå ðûíêà è ïåðåçàïóñòèòü èíäèêàòîð.");
return(0);
}
}
// --------------------------------------
// Îïðåäåëåíèå ïóòè ñèíòåçà êðîññà
if (StringFind(FP, "USD") == 3 && StringFind(SP, "USD") == 0)
WayForCross = 1;
if (StringFind(FP, "USD") == 0 && StringFind(SP, "USD") == 0)
WayForCross = 2;
if (StringFind(FP, "USD") == 3 && StringFind(SP, "USD") == 3)
WayForCross = 3;
if (StringFind(FP, "USD") == 0 && StringFind(SP, "USD") == 3)
WayForCross = 4;
// -------------------------------
Tick = MarketInfo(Symbol(), MODE_TICKSIZE);
Activate = True;
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Comment("");
if(ObjectFind("CrossBid") == 0)
ObjectDelete("CrossBid");
if(ObjectFind("CrossAsk") == 0)
ObjectDelete("CrossAsk");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Ïðèâåäåíèå çíà÷åíèé ê òî÷íîñòè îäíîãî òèêà |
//+------------------------------------------------------------------+
double ND(double A)
{
return(NormalizeDouble(A, Digits));
}
//+------------------------------------------------------------------+
//| Ðàñ÷åò çíà÷åíèÿ ñèíòåòè÷åñêîãî áèäà |
//+------------------------------------------------------------------+
double CalcBidWayForCross()
{
switch (WayForCross)
{
case 1: return(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_BID)));
case 2: return(ND(MarketInfo(SP, MODE_BID)/MarketInfo(FP, MODE_ASK)));
case 3: return(ND(MarketInfo(FP, MODE_BID)/MarketInfo(SP, MODE_ASK)));
case 4: return(1/(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_BID))));
}
}
//+------------------------------------------------------------------+
//| Ðàñ÷åò çíà÷åíèÿ ñèíòåòè÷åñêîãî àñêà |
//+------------------------------------------------------------------+
double CalcAskWayForCross()
{
switch (WayForCross)
{
case 1: return(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_ASK)));
case 2: return(ND(MarketInfo(SP, MODE_ASK)/MarketInfo(FP, MODE_BID)));
case 3: return(ND(MarketInfo(FP, MODE_ASK)/MarketInfo(SP, MODE_BID)));
case 4: return(1/(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_ASK))));
}
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
if(!Activate)
return(0);
// Ðàñ÷åò ñèíòåòè÷åñêèõ Bid è Ask
double CalcBid = CalcBidWayForCross();
RefreshRates();
double CalcAsk = CalcAskWayForCross();
// -------------------------------
// Ðèñóåì óðîâåíü ñèíòåòè÷åñêîãî Bid
if (ShowBid)
{
if(ObjectFind("CrossBid") == -1)
{
ObjectCreate("CrossBid", OBJ_HLINE, 0, 0, CalcBid);
ObjectSet("CrossBid", OBJPROP_COLOR, BidColor);
ObjectSet("CrossBid", OBJPROP_STYLE, STYLE_DOT);
}
else
if(!ObjectMove("CrossBid", 0, 1, CalcBid))
Print("Îøèáêà ïåðåìåùåíèÿ ¹", GetLastError());
}
// ----------------------------------
// Ðèñóåì óðîâåíü ñèíòåòè÷åñêîãî Ask
if(ShowAsk)
{
if(ObjectFind("CrossAsk") == -1)
{
ObjectCreate("CrossAsk", OBJ_HLINE, 0, 0, CalcAsk);
ObjectSet("CrossAsk", OBJPROP_COLOR, AskColor);
ObjectSet("CrossAsk", OBJPROP_STYLE, STYLE_DOT);
}
else
ObjectMove("CrossAsk", 0, 1, CalcAsk);
}
// ----------------------------------
Comment("Ðåàëüíûé BID = ", DoubleToStr(Bid, Digits), ", ðåàëüíûé ASK = ", DoubleToStr(Ask, Digits),
"\nÑèíòåòèê BID = ", DoubleToStr(CalcBid, Digits), ", ñèíòåòèê ASK = ", DoubleToStr(CalcAsk, Digits));
// Âûäàåì çâóêîâîé ñèãíàë î ïðåâûøåíèè ìèíèìàëüíîé ðàçíîñòè
if(ND(MathAbs(CalcBid-Bid)) >= ND(AlarmIfPointDifference*Point))
PlaySound(AlarmFile);
// --------------------------------------------------------
//----
return(0);
}
//+------------------------------------------------------------------+
Comments