//+------------------------------------------------------------------+ //| e-Skoch_Отлож_Ордер_V_2-NEW-2 + Lot.mq4 | //| Copyright © 2012, MetaQuotes Software Corp. | //| http://www.fxgeneral.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012, MetaQuotes Software Corp." #property link "http://www.fxgeneral.com" #include extern double lot = 0.01; extern int _takeProfit_BUY = 600; extern int _stopLoss_BUY = 100; extern int _slippage = 30;//регулировка проскальзывания extern int _takeProfit_SELL = 600; extern int _stopLoss_SELL = 30; extern int key = 0; extern int _pointBuy = 700;// Отступ цены от ХАЙ extern int _pointSell = 700;// Отступ цены от ЛОЙ extern bool CheckTrade = true; //Не ставить Stop ордер при уже открытом extern double _percentProfit=2.2;///// - Профецит datetime BARflag = 0; //--Для побарового режима int _extType=-1; double _workLots=0.0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int ticketBuy,ticketSell, expiration; double point, _price, oldprice; double _tpBuy=0.0, _tpSell=0.0, _slBuy=0.0, _slSell=0.0; datetime now = Time[0];//--Для побарового режима if(BARflag >= now) return(0);//--Для побарового режима BARflag = now;//--Для побарового режима if(totalO(-1,key)==0) GlobalVariableSet(StringConcatenate("eq_",key),AccountEquity()); Comment("Контрольное эквити ",GlobalVariableGet(StringConcatenate("eq_",key)),"\n", "Текущее эквити ",AccountEquity(),"\n", "Текущий процент роста Эквити ",100*(AccountEquity()-GlobalVariableGet(StringConcatenate("eq_",key)))/GlobalVariableGet(StringConcatenate("eq_",key))," %"); _CheckProfit();///// - Профецит //---- point=MarketInfo(Symbol(),MODE_POINT); //---- if (lotiLow(Symbol(),PERIOD_D1,0)) if (Low[2]>Low[1] && !_CheckTradeOrder(OP_BUY)) { if(!CheckTrade || (CheckTrade && !_CheckTradeOrder(OP_BUY))) { if (_extType!=OP_BUYSTOP) { if (_stopLoss_BUY>0) { _slBuy=NormalizeDouble(Low[1]-_stopLoss_BUY*Point, Digits); _slSell=NormalizeDouble(Low[1]-_stopLoss_BUY*Point, Digits); } if (_takeProfit_BUY>0) { _tpBuy=NormalizeDouble(Bid+_takeProfit_BUY*Point, Digits); _tpSell=NormalizeDouble(Bid+_takeProfit_BUY*Point, Digits); } _price = Low[1]+_pointBuy*Point; oldprice = PriceStopOrder(OP_BUYSTOP); if(oldprice == -1 || _price < oldprice) { //Нет ордера или Новая цена лучше// _CheckOrder(OP_BUYSTOP); while(IsTradeContextBusy()) Sleep(1000); RefreshRates(); ticketBuy=OrderSend(Symbol(),OP_BUYSTOP, getlotlast(key),_price,_slippage,_slBuy,_tpBuy,"",key,0,Green); } //нет ордера или новая цена лучше// } } } if (iHigh(Symbol(),PERIOD_D1,1)0) { _slBuy=NormalizeDouble(High[1]+_stopLoss_SELL*Point, Digits); _slSell=NormalizeDouble(High[1]+_stopLoss_SELL*Point, Digits); } if (_takeProfit_SELL>0) { _tpBuy=NormalizeDouble(Ask-_takeProfit_SELL*Point, Digits); _tpSell=NormalizeDouble(Ask-_takeProfit_SELL*Point, Digits); } _price = High[1]-_pointSell*Point; oldprice = PriceStopOrder(OP_SELLSTOP); if(oldprice == -1 || _price > oldprice) { //Нет ордера или Новая цена лучше// _CheckOrder(OP_SELLSTOP); while(IsTradeContextBusy()) Sleep(1000); RefreshRates(); ticketSell=OrderSend(Symbol(),OP_SELLSTOP, getlotlast(key),_price,_slippage,_slSell,_tpSell,"",key,0,Red); } //нет ордера или новая цена лучше// } } //---- return(0); } //+-------------------------------------------------------------++++ //ищем последний закрытый объем double getlotlast(int _key) { double _lot = lot ; for(int i=OrdersHistoryTotal(); i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderSymbol()==Symbol()) { if((OrderMagicNumber()==_key || _key == 0) && OrderType()<=1){ if(OrderProfit()<0){ int kol=getLastType(_key)*(-1); _lot=((kol-MathMod(kol,2))/2+1)*lot; break; } if(OrderProfit()>=0) break; } } } return(_lot); } //какой тип ордера закрылся последний и сколько ордеров в серии int getLastType(int _key) { int KolType=0; int j=1; for(int i=OrdersHistoryTotal() ; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY ) && OrderSymbol()==Symbol()) { if((OrderMagicNumber()==_key || _key == 0) && OrderType()<=1) { if(j==1 && OrderProfit()>=0)KolType++; if(j==1 && OrderProfit()<0)KolType--; if(j!=1 && OrderProfit()>=0 && KolType>0)KolType++; if(j!=1 && OrderProfit()>=0 && KolType<0)break; if(j!=1 && OrderProfit()<0 && KolType<0)KolType--; if(j!=1 && OrderProfit()<0 && KolType>0)break; j++; } } } return(KolType); } //+-------------------------- Профецит ---------------------------+ void _CheckProfit(){ if (100*(AccountEquity()-GlobalVariableGet(StringConcatenate("eq_",key)))/GlobalVariableGet(StringConcatenate("eq_",key))>=_percentProfit) _OrderClose(); return; } //+--------------------------------+ void _OrderClose(){ int i; double _price=0.0; _OrderDelete(); if (OrdersTotal()>0){ for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){ if(OrderMagicNumber() == key || key == 0) { RefreshRates(); if (OrderType()==OP_SELL) _price=Ask; if (OrderType()==OP_BUY) _price=Bid; OrderClose(OrderTicket(),OrderLots(),_price,5,0); } } } } return; } //+--------------------------------+ void _OrderDelete(){ int i; if (OrdersTotal()>0){ for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol()){ if(OrderMagicNumber() == key || key == 0) { if (OrderType()>1 && OrderType()<6) {//добавленно for(int k = 0;k < 3; k++) if(OrderDelete(OrderTicket())) break; } } } } } return; } //------------------------------------------------+ /*Считаем количество ордеров входящие int type (if -1 all type) OP_BUY 0 Покупка OP_SELL 1 Продажа OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT OP_BUYSTOP 4 Отложенный ордер BUY STOP OP_SELLSTOP 5 Отложенный ордер SELL STOP int _key MagicNumber */ int totalO(int type,int _key) { int TotalNumber = 0; for(int i=0; i0){ for (i=0; i<=OrdersTotal()-1; i++){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol()){ if(OrderMagicNumber()==key || key == 0) { if (OrderType()==_checkType) { for(int k = 0;k < 3; k++) if(OrderDelete(OrderTicket())) break; } } } } } return(0); } //+------------------------------------------------------------------+ bool _CheckTradeOrder(int _checkType=0){ int i; if (OrdersTotal()>0){ for (i=0; i0){ for (i=0; i OrderOpenPrice()) price = OrderOpenPrice( ); } } } return(price); } //+------------------------------------------------------------------+++