extern double Lots =0.01;
extern int TakeProfit =50;
extern int Step =50;
extern double Multiplier =2;
extern int Slippage =5;
extern int Magic =123;
int ticket;
double price,TP,lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if(Digits == 3 || Digits == 5)
{
TakeProfit *=10;
Step *=10;
Slippage *=10;
}
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
if(CoutTrades()== 0)
{
double ima=iMA(Symbol(),0,10,0,MODE_SMA,PRICE_CLOSE,1);
if(Bid>ima)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Blue);
if(ticket>0)
{
TP=NormalizeDouble(Bid+TakeProfit*Point,Digits);
bool modify = OrderModify(ticket,OrderOpenPrice(),0,TP,0);
}
}
else if(Ask<ima)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Red);
if(ticket>0)
{
TP=NormalizeDouble(Ask-TakeProfit*Point,Digits);
bool modify = OrderModify(ticket,OrderOpenPrice(),0,TP,0);
}
}
}
else
{
int order_type = FindLastOrderType();
if(order_type==OP_BUY)
{
price=FindLastPrice(OP_BUY);
if(Ask<=price-Step*Point)
{
lastlot=FindLastLots(OP_BUY);
lastlot= NormalizeDouble(lastlot*Multiplier,2);
ticket=OrderSend(Symbol(),OP_BUY,lastlot,Ask,Slippage,0,0,"",Magic,0,Blue);
if(ticket>0)
ModifyOrders(OP_BUY);
}
}
else if (order_type==OP_SELL)
{
price=FindLastPrice(OP_SELL);
if(Bid<=price+Step*Point)
{
lastlot=FindLastLots(OP_SELL);
lastlot= NormalizeDouble(lastlot*Multiplier,2);
ticket=OrderSend(Symbol(),OP_SELL,lastlot,Bid,Slippage,0,0,"",Magic,0,Red);
if(ticket>0)
ModifyOrders(OP_SELL);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avgprice=0,
order_lots=0;
price = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic && OrderType()==otype)
{
price += OrderOpenPrice()* OrderLots();
order_lots += OrderLots();
}
}
}
avgprice=NormalizeDouble(price/order_lots,Digits);
if(otype == OP_BUY) TP=NormalizeDouble(avgprice+TakeProfit*Point,Digits);
if(otype == OP_SELL) TP=NormalizeDouble(avgprice-TakeProfit*Point,Digits);
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic && OrderType()==otype)
bool modify = OrderModify(OrderTicket(), OrderOpenPrice(),0,TP,0);
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldlots;
int oldticket;
ticket = 0;
for(int i=OrdersTotal()-1; i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic && OrderType()==otype)
{
oldticket=OrderTicket();
if(oldticket>ticket)
{
oldlots=OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;
ticket = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&OrderType()==otype)
{
oldticket=OrderTicket();
if(oldticket>ticket)
{
oldopenprice=OrderOpenPrice();
ticket=oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i = OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
return(OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CoutTrades()
{
int count = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
{
if(OrderSymbol()== Symbol()&& OrderMagicNumber()==Magic)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+