//+------------------------------------------------------------------+
//| indicator_test.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//--------------------------------------------------------------------
extern int SmoothPeriod = 5,
SmoothMethod = 1,
Notify = 0;
extern double stoploss = 0,
takeprofit = 0,
TrailingStop = 0;
extern double LOT = 0.1;
extern bool Close_on_Oposite = true;
extern bool Buy_allow = true;
extern bool Sell_allow = true;
extern bool mode_reverse = false;
//--------------------------------------------------------------------
int STOPLEVEL,Magic=1234567890;
//int redOrblueFlag=7;
//--------------------------------------------------------------------
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }
int start()
{
int timeprev=0;
if (timeprev == Time[0]) return (0);
timeprev = Time[0];
//if (!NewBar()) return;
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (TrailingStop>=STOPLEVEL) TrailingStop();
//if (TimeBar==Time[0]) return(0);
double bufBuy, bufBuy2,bufSell,bufSell2;
//bufBuy = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
//bufSell = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);
bufBuy = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,1);
bufBuy2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,2);
bufSell = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,1);
bufSell2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,2);
double SL,TP;
if (Buy_allow)
{
if (bufBuy==bufSell && bufSell2 !=0 && bufBuy2 == 0)//if (bufBuy != 0 && bufSell == 0 )//
{
if (!mode_reverse)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy>0)
{
if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy," : ",GetLastError());
}
else
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell_on_reverse_buy = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell_on_reverse_buy>0)
{
if(OrderSelect(tik_sell_on_reverse_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell_on_reverse_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell_on_reverse_buy," : ",GetLastError());
}
}
}
if (Sell_allow)
{
if (bufBuy==bufSell && bufSell2 ==0 && bufBuy2 != 0)//if (bufSell != 0 && bufBuy == 0)//
{
if (!mode_reverse)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell>0)
{
if(OrderSelect(tik_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell," : ",GetLastError());
}
else
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy_on_reverse_sell = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy_on_reverse_sell>0)
{
if(OrderSelect(tik_buy_on_reverse_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy_on_reverse_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy_on_reverse_sell," : ",GetLastError());
}
}
}
return (0);
}
//--------------------------------------------------------------------
void CLOSEORDER(int ord)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
//--------------------------------------------------------------------
void TrailingStop()
{
int tip,Ticket;
double StLo,OSL,OOP;
for (int i=0; i<OrdersTotal(); i++)
{ if (OrderSelect(i, SELECT_BY_POS)==true)
{ tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
Ticket = OrderTicket();
if (tip==OP_BUY)
{
StLo = NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (StLo > OSL && StLo > OOP)
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," buy SL ",OSL,"->",StLo);
}
}
if (tip==OP_SELL)
{
StLo = NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (StLo > OOP || StLo==0) continue;
if (StLo < OSL || OSL==0 )
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," sell SL ",OSL,"->",StLo);
}
}
}
}
}
}
//--------------------------------------------------------------------
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
}