//+------------------------------------------------------------------+ //| EA_AVER_LOCK_MM.mq4 | //| IO | //| http://www.vmql.ru | //+------------------------------------------------------------------+ #property copyright "IO" #property link "http://www.vmql.ru" extern int MODE = 0; extern int FIRST_ORDER_TYPE = 0; extern double FIRST_LOT = 0.1; extern int TP = 300; extern int TURN = 300; extern bool USE_RAND = false; extern int ID = 3823; int init() { MathSrand(TimeLocal()); return(0); } int deinit() { return(0); } int start() { int TYPE; double tp; if ( order_total() == 0 )open(FIRST_ORDER_TYPE,FIRST_LOT,0,TP); TYPE = last_trade(); if ( TYPE != -1 ) { if ( TYPE == 0 )tp = MarketInfo(Symbol(),MODE_BID) + TP * Point; if ( TYPE == 1 )tp = MarketInfo(Symbol(),MODE_ASK) - TP * Point; open(TYPE,LOT(TYPE,tp),0,0); modify_orders(tp); } return(0); } double LOT( int type, double tp ) { int i, k1; double SPREAD = MarketInfo(Symbol(),MODE_SPREAD) * Point, l,K1 = 0, K2; for(i=OrdersTotal()-1;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if ( OrderMagicNumber() == ID ) { if ( OrderType() == 0 )k1 = -1; if ( OrderType() == 1 )k1 = 1; K1 += k1 * ( OrderOpenPrice() - tp ) * OrderLots() - SPREAD * OrderLots() ; } } K2 = TP * Point * FIRST_LOT; if ( type == 0 )k1 = -1; if ( type == 1 )k1 = 1; l = (K2 - K1)/(k1*(Bid-tp)-SPREAD); if ( l < FIRST_LOT)l = FIRST_LOT; return(l); } void modify_orders( double level ) { int i; double SPREAD = MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_POINT); for(i=OrdersTotal()-1;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderMagicNumber()==ID) { if ( OrderType() == 0 && level > Bid && ( NormalizeDouble(OrderStopLoss(),Digits) != 0 || NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(level,Digits) ) )OrderModify(OrderTicket(),OrderOpenPrice(),0,level,0); if ( OrderType() == 0 && level < Bid && ( NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(level,Digits) || NormalizeDouble(OrderTakeProfit(),Digits) != 0 ) )OrderModify(OrderTicket(),OrderOpenPrice(),level,0,0); if ( OrderType() == 1 && level > Bid && ( NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(level+SPREAD,Digits) || NormalizeDouble(OrderTakeProfit(),Digits) != 0 ) )OrderModify(OrderTicket(),OrderOpenPrice(),level+SPREAD,0,0); if ( OrderType() == 1 && level < Bid && ( NormalizeDouble(OrderStopLoss(),Digits) != 0 || NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(level+SPREAD,Digits) ) )OrderModify(OrderTicket(),OrderOpenPrice(),0,level+SPREAD,0); } } } int last_trade() { int i,type; bool flag = false; for(i=OrdersTotal()-1;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if( OrderMagicNumber() == ID && OrderType() < 2 ) { if ( OrderProfit()/(OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE)) <= (-1)*(StrToInteger(OrderComment())+TURN) )flag = true; type = OrderType(); break; } } if ( MODE == 0 )if ( flag )return(MathAbs(type-1)); if ( MODE == 1 )if ( flag )return(type); if ( !flag )return(-1); } int order_total() { int i; int kol=0; for(i=OrdersTotal()-1;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderMagicNumber()==ID)kol++; } return(kol); } int open(int type, double l, double sl=0, double tp=0, string comm = "") { int isOpened = 0, try = 0; double s,t; while ( IsTradeContextBusy() ){Sleep(500);} RefreshRates(); if ( sl != 0 && sl < MarketInfo(Symbol(),MODE_STOPLEVEL) )sl = MarketInfo(Symbol(),MODE_STOPLEVEL); if ( tp != 0 && tp < MarketInfo(Symbol(),MODE_STOPLEVEL) )tp = MarketInfo(Symbol(),MODE_STOPLEVEL); if ( type == 0 ) { if ( tp == 0 )t = 0; if ( tp != 0 )t = Bid + tp * Point; if ( sl == 0 )s = 0; if ( sl != 0 )s = Bid - sl * Point; } if ( type == 1 ) { if ( tp == 0 )t = 0; if ( tp != 0 )t = Ask - tp * Point; if ( sl == 0 )s = 0; if ( sl != 0 )s = Ask + sl * Point; } s = NormalizeDouble(s,Digits); t = NormalizeDouble(t,Digits); comm = DoubleToStr(0,0); if ( USE_RAND )comm = DoubleToStr(rand(),0); if(type==0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),10,s,t,comm,ID); if(type==1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),10,s,t,comm,ID); Sleep(500); while(isOpened<0) { while ( IsTradeContextBusy() ){Sleep(500);} RefreshRates(); if ( type == 0 ) { if ( tp == 0 )t = 0; if ( tp != 0 )t = Bid + tp * Point; if ( sl == 0 )s = 0; if ( sl != 0 )s = Bid - sl * Point; } if ( type == 1 ) { if ( tp == 0 )t = 0; if ( tp != 0 )t = Ask - tp * Point; if ( sl == 0 )s = 0; if ( sl != 0 )s = Ask + sl * Point; } s = NormalizeDouble(s,Digits); t = NormalizeDouble(t,Digits); try++; if(type==0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),10,s,t,comm,ID); if(type==1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),10,s,t,comm,ID); if(try > 5) break; if(isOpened>=0)break; Sleep(500); } if(isOpened<0) Alert("Ордер не открыт, ошибка :", GetLastError()); return (isOpened); } double check_lot(double &lo) { double l = MarketInfo(Symbol(),MODE_LOTSTEP); int ok = 0; while ( l < 1 ){l*=10;ok++;} if( lo < MarketInfo(Symbol(),MODE_MINLOT) )lo = MarketInfo(Symbol(),MODE_MINLOT); if( lo > MarketInfo(Symbol(),MODE_MAXLOT) )lo = MarketInfo(Symbol(),MODE_MAXLOT); return(NormalizeDouble(lo,ok)); } int rand() { int rand = 0; while ( rand <= TURN/2 )rand = MathRand()%TURN; return(rand*1.5); }