//+----------------------------------------------------------------------------+ //| Описание : Открывает позицию по рыночной цене. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента (NULL или "" - текущий символ) | //| op - операция | //| ll - лот | //| sl - уровень стоп | //| tp - уровень тейк | //| mn - MagicNumber | //| co - комментарий | //+----------------------------------------------------------------------------+ void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string co="") { color clOpen; datetime ot; double pp, pa, pb; int dg, err, it, ticket=0; if (sy=="" || sy=="0") sy=Symbol(); if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; if (co=="") co=WindowExpertName()+" "+GetNameTF(Period()); for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) { Print("OpenPosition(): Остановка работы функции"); break; } while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); dg=MarketInfo(sy, MODE_DIGITS); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); if (op==OP_BUY) pp=pa; else pp=pb; pp=NormalizeDouble(pp, dg); ot=TimeCurrent(); if (MarketWatch) ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, co, mn, 0, clOpen); else ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, 0, clOpen); if (ticket>0) { if (UseSound) PlaySound(SoundSuccess); break; } else { err=GetLastError(); if (UseSound) PlaySound(SoundError); if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy); // Вывод сообщения об ошибке Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op), " pp=",pp," sl=",sl," tp=",tp," mn=",mn); // Блокировка работы советника if (err==2 || err==64 || err==65 || err==133) { gbDisabled=True; break; } // Длительная пауза if (err==4 || err==131 || err==132) { Sleep(1000*300); break; } if (err==128 || err==142 || err==143) { Sleep(1000*66.666); if (ExistPositions(sy, op, mn, ot)) { if (UseSound) PlaySound(SoundSuccess); break; } } if (err==140 || err==148 || err==4110 || err==4111) break; if (err==141) Sleep(1000*100); if (err==145) Sleep(1000*17); if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); if (err!=135) Sleep(1000*7.7); } } if (MarketWatch && ticket>0 && (sl>0 || tp>0)) { if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp); } }
Полезные mql функции
#46
Отправлено 22 April 2010 - 10:47
 
#47
Отправлено 22 April 2010 - 10:48
//+----------------------------------------------------------------------------+ //| Описание : Возвращает цену закрытия последней закрытой позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ double PriceCloseLastPos(string sy="", int op=-1, int mn=-1) { datetime t; double r=0; int i, k=OrdersHistoryTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); r=OrderClosePrice(); } } } } } } } return(r); }
#48
Отправлено 22 April 2010 - 10:49
//+----------------------------------------------------------------------------+ //| Описание : Возвращает цену открытия последней закрытой позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ double PriceOpenLastClosePos(string sy="", int op=-1, int mn=-1) { datetime t; double r=0; int i, k=OrdersHistoryTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); r=OrderOpenPrice(); } } } } } } } return(r); }
#49
Отправлено 22 April 2010 - 10:50
//+----------------------------------------------------------------------------+ //| Описание : Возвращает цену открытия последней открытой позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) { datetime t; double r=0; int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) { t=OrderOpenTime(); r=OrderOpenPrice(); } } } } } } } return(r); }
#50
Отправлено 22 April 2010 - 10:51
//+----------------------------------------------------------------------------+ //| Описание : Возвращает цену открытия ближайшей позиции. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ double PriceOpenNearPos(string sy="", int op=-1, int mn=-1) { double mi, oop=0, p; int i, k=OrdersTotal(), pp=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) mi=MarketInfo(OrderSymbol(), MODE_ASK); if (OrderType()==OP_SELL) mi=MarketInfo(OrderSymbol(), MODE_BID); p=MarketInfo(OrderSymbol(), MODE_POINT); if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01; if (pp==0 || pp>MathAbs(OrderOpenPrice()-mi)/p) { pp=MathAbs(OrderOpenPrice()-mi)/p; oop=OrderOpenPrice(); } } } } } } return(oop); }
#51
Отправлено 22 April 2010 - 10:53
//+----------------------------------------------------------------------------+ //| Описание : Возвращает количество секунд после закрытия последней позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ datetime SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(TimeCurrent()-t); }
#52
Отправлено 22 April 2010 - 10:54
//+----------------------------------------------------------------------------+ //| Описание : Возвращает количество секунд после открытия последней позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) { datetime t; int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) t=OrderOpenTime(); } } } } } } return(TimeCurrent()-t); }
#53
Отправлено 22 April 2010 - 10:55
//+----------------------------------------------------------------------------+ //| Описание : Сопровождение позиций простым тралом | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ( "" - любой символ, | //| NULL - текущий символ) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ void SimpleTrailing(string sy="", int op=-1, int mn=-1) { double po, pp; int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { po=MarketInfo(OrderSymbol(), MODE_POINT); if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { pp=MarketInfo(OrderSymbol(), MODE_BID); if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) { if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po) { ModifyOrder(-1, pp-TStop.Buy*po, -1); } } } if (OrderType()==OP_SELL) { pp=MarketInfo(OrderSymbol(), MODE_ASK); if (!TSProfitOnly || OrderOpenPrice()-pp>TStop.Sell*po) { if (OrderStopLoss()>pp+(TStop.Sell+TrailingStep-1)*po || OrderStopLoss()==0) { ModifyOrder(-1, pp+TStop.Sell*po, -1); } } } } } } } }
#54
Отправлено 22 April 2010 - 10:55
//+----------------------------------------------------------------------------+ //| Описание : Возвращает цену TakeProfit последней закрытой позиций или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) { datetime t; double r=-1; int i, k=OrdersHistoryTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); r=OrderTakeProfit(); } } } } } } } return(r); }
#55
Отправлено 22 April 2010 - 10:56
//+----------------------------------------------------------------------------+ //| Описание : Возвращает цену TakeProfit последней открытой позиций или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ double TakeProfitLastPos(string sy="", int op=-1, int mn=-1) { datetime t; double r=-1; int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) { t=OrderOpenTime(); r=OrderTakeProfit(); } } } } } } } return(r); }
#56
Отправлено 22 April 2010 - 10:57
//+----------------------------------------------------------------------------+ //| Описание : Возвращает тикет ближайшей к рынку позиции по цене открытия. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int TicketNearPos(string sy="", int op=-1, int mn=-1) { double mi, p; int i, k=OrdersTotal(), pp=0, ti=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) mi=MarketInfo(OrderSymbol(), MODE_ASK); if (OrderType()==OP_SELL) mi=MarketInfo(OrderSymbol(), MODE_BID); p=MarketInfo(OrderSymbol(), MODE_POINT); if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01; if (pp==0 || pp>MathAbs(OrderOpenPrice()-mi)/p) { pp=MathAbs(OrderOpenPrice()-mi)/p; ti=OrderTicket(); } } } } } } return(ti); }
#57
Отправлено 22 April 2010 - 10:58
//+----------------------------------------------------------------------------+ //| Описание : Возвращает время открытия последней открытой позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ datetime TimeOpenLastPos(string sy="", int op=-1, int mn=-1) { datetime t; int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) t=OrderOpenTime(); } } } } } } return(t); }
#58
Отправлено 22 April 2010 - 10:59
//+----------------------------------------------------------------------------+ //| Описание : Возвращает тип ближайшей к рынку позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int TypeNearPos(string sy="", int op=-1, int mn=-1) { double mi, p; int i, k=OrdersTotal(), pp=0, ty=-1; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) mi=MarketInfo(OrderSymbol(), MODE_ASK); if (OrderType()==OP_SELL) mi=MarketInfo(OrderSymbol(), MODE_BID); p=MarketInfo(OrderSymbol(), MODE_POINT); if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01; if (pp==0 || pp>MathAbs(OrderOpenPrice()-mi)/p) { pp=MathAbs(OrderOpenPrice()-mi)/p; ty=OrderType(); } } } } } } return(ty); }
#59
Отправлено 22 April 2010 - 11:27
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //|----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента (NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| mode - тип фрактала (MODE_LOWER|MODE_UPPER) | //+----------------------------------------------------------------------------+ double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) { if (sy=="" || sy=="0") sy=Symbol(); double f=0; int d=MarketInfo(sy, MODE_DIGITS), s; if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2; for (s=3; s<100; s++) { f=iFractals(sy, tf, mode, s); if (f!=0) return(NormalizeDouble(f, d)); } Print("FindNearFractal(): Фрактал не найден"); return(0); }
#60
Отправлено 10 May 2010 - 12:49
//+----------------------------------------------------------------------------+ //| Возвращает экстремум ЗигЗага по его номеру. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| ne - номер экстремума ( 0 - текущий) | //| dp - ExtDepth | //| dv - ExtDeviation | //| bc - ExtBackstep | //+----------------------------------------------------------------------------+ double GetExtremumZZPrice(string sym="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) { if (sym=="") sym=Symbol(); double zz; int i, k=iBars(sym, tf), ke=0; for (i=1; i<k; i++) { zz=iCustom(sym, tf, "ZigZag", dp, dv, bc, 0, i); if (zz!=0) { ke++; if (ke>ne) return(zz); } } Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден"); return(0); }