//+------------------------------------------------------------------+
//| Óñòàíîâèòü Áåçóáûòîê.mq4 |
//| Copyright © 2011, Corp. |
//| todem5@mail.ru |
//+------------------------------------------------------------------+
#property link "blog forex"
#property show_inputs
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
extern int Delta =75;
color clModifyBuy = Red; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color clModifySell = Red; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
bool UseSound = True;
bool gbNoInit = False; // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
string SoundSuccess = "ok.wav"; // Çâóê óñïåõà
string SoundError = "timeout.wav"; // Çâóê îøèáêè
int NumberOfTry = 3;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double M,MM,Prof,LL=0;
int r,ret;
int Spr= MarketInfo(Symbol(),MODE_SPREAD);
for( r=0;r<OrdersTotal();r++) //
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()==Symbol() )
{
if (OrderType()<=2 )Prof=Prof+OrderProfit()+OrderSwap();
if (OrderType()==OP_BUY) LL=LL+OrderLots();
if (OrderType()==OP_SELL) LL=LL-OrderLots();
}}
M=BEZ();//Óðîâåíü áåçóáûòêà äëÿ BUY
Comment("Óðîâåíü áåçóáûòêà ",M,"+",Delta,"\n","Íàäî ïðîéòè ",DoubleToStr(MathAbs(M-Bid)/Point,0)," Ëîò=",LL," ëîò",
"\n","Îáùèé ïðîôèò ",Prof);
if (LL<0)//Åñëè áîëüøå SELL Òî áåçóáûòîê - Delta íèæå Bid è íàîáîðîò
{
MM=M-Delta*Point; // Åñëè áîëüøå SELL
for( r=0;r<OrdersTotal();r++) //
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()==Symbol() )
{ //Äëÿ BUY-Ñåðèè
if (OrderType()==OP_BUY && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
ModifyOrder(-1,NormalizeDouble(MM,Digits),-1);
//Äëÿ SELL-Ñåðèè
if (OrderType()==OP_SELL && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
ModifyOrder(-1,-1,NormalizeDouble(MM,Digits));
}}}
if (LL>0)//Åñëè áîëüøå BUY Òî áåçóáûòîê + Delta âûøå Bid
{
MM=M+Delta*Point; // Åñëè áîëüøå BUY
for( r=0;r<OrdersTotal();r++) //
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()==Symbol() )
{ //Äëÿ BUY-Ñåðèè
if (OrderType()==OP_BUY && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
ModifyOrder(-1,-1,NormalizeDouble(MM,Digits));
//Äëÿ SELL-Ñåðèè
if (OrderType()==OP_SELL && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
ModifyOrder(-1,NormalizeDouble(MM,Digits),-1);
}
}}
//----
return(0);
}
//+----------------------------Ôóíêöèÿ --------------------------------------+
//+---------------- Ôóíêöèÿ ïîäñ÷¸òà áåçóáûòêà -------------------------------------------+
double BEZ() {
int Sp= MarketInfo(Symbol(),MODE_SPREAD);
double B2_B=0,B2_S=0,B2_LB=0,B2_LS=0,BSw=0,SSw=0;
for(int b2=0;b2<OrdersTotal();b2++) //
{
if(OrderSelect(b2,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
B2_B=((B2_B*B2_LB)+(OrderOpenPrice()*OrderLots()))/(B2_LB+OrderLots());
B2_LB=B2_LB+OrderLots();
BSw=BSw+OrderSwap();
}
if (OrderType()==OP_SELL)
{
B2_S=((B2_S*B2_LS)+(OrderOpenPrice()*OrderLots()))/(B2_LS+OrderLots());
B2_LS=B2_LS+OrderLots();
SSw=SSw+OrderSwap();
}
}}
double M2B=0,M2S=0 ,M;
if (B2_LB>B2_LS) // Èä¸ì ââåðõ
{
for(int J2=0;J2<10000;J2++)
{
M2B=J2*B2_LB*10;
M2S=((B2_B-B2_S+0*Point)/Point+J2)*(B2_LS*(-10));
if (M2B+M2S+BSw+SSw>=0)
{
M=NormalizeDouble(B2_B+J2*Point,Digits);
break;
}}}
if (B2_LS>B2_LB) // Èä¸ì âíèç
{
for(int J3=0;J3<10000;J3++)
{
M2S=J3*B2_LS*10;
M2B=((B2_B-B2_S+0*Point)/Point+J3)*(B2_LB*(-10));
if (M2S+M2B+BSw+SSw>=0)
{
M=NormalizeDouble(B2_S-J3*Point,Digits);
break;
}}}
//----
return(M);
}
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
bool fm;
color cl=IIFc(OrderType()==OP_BUY
|| OrderType()==OP_BUYLIMIT
|| OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
double op, pa, pb, os, ot;
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice() , dg);
os=NormalizeDouble(OrderStopLoss() , dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);
if (pp!=op || sl!=os || tp!=ot) {
for (it=1; it<=NumberOfTry; it++) {
if ((!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
if (fm) {
if (UseSound) PlaySound(SoundSuccess); break;
} else {
er=GetLastError();
if (UseSound) PlaySound(SoundError);
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Sleep(1000*10);
}
}
}
}
color IIFc(bool condition, color ifTrue, color ifFalse) {
if (condition) return(ifTrue); else return(ifFalse);
}
Comments