//+----------------------------------------------------------------------------+ //| Возвращает номер бара экстремума ЗигЗага по его номеру. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| ne - номер экстремума ( 0 - текущий) | //| dp - ExtDepth | //| dv - ExtDeviation | //| bc - ExtBackstep | //+----------------------------------------------------------------------------+ int GetExtremumZZBar(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(i); } } Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден"); return(0); }
Полезные mql функции
#61
Отправлено 10 May 2010 - 12:51
 
#62
Отправлено 19 June 2010 - 09:29
//+------------------------------------------------------------------+ //| i-Lots_Calculator.mq4 | //| Copyright © 2010, Michelangelo® | //| karpunin@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Michelangelo®" #property link "karpunin@mail.ru" #property indicator_chart_window extern string _pMarginManagement = "----- Параметры ММ -----"; extern int _StopLoss = 50; //Уровень ограничения убытков в пунктах extern double _PerсentLost = 1.0; // Процент убытка в процентах от баланса extern string _pOut="----- Параметры вывода на экран -----"; extern int _textSize = 10; extern int _xDist = 730; extern int _yDist = 35; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //---- double _lots=0.0, _minLot=0.0, _maxLot=0.0, _step=0.0, _Balans, _tickValue; _minLot=MarketInfo(Symbol(),MODE_MINLOT); // Минимальный размер лота _step=MarketInfo(Symbol(),MODE_LOTSTEP); //Шаг изменен размера лота _Balans=AccountBalance(); // Баланс счета _maxLot=MarketInfo(Symbol(),MODE_MAXLOT); //Максимальный размер лота _tickValue=(MarketInfo(Symbol(), MODE_TICKVALUE)); // Стоимость одного пункта для одного лота if (_PerсentLost<=0.0){ // Если процент меньше или равен нулю... _lots=0.0; }// End of if (_Percent<=0.0) // Если _PercentLost > 0 - вычисляем лот по _PercentLost-у... _lots=(((_Balans*_PerсentLost)/100)/_tickValue)/(_StopLoss); _lots=MathRound(_lots/_step)*_step; if (_lots>_maxLot) _lots=_maxLot; // Вывод расчетов на экран... ObjectDelete("text1"); ObjectDelete("text2"); ObjectDelete("text3"); ObjectDelete("text4"); ObjectCreate("text1",OBJ_LABEL,0,0,0); ObjectCreate("text2",OBJ_LABEL,0,0,0); ObjectCreate("text3",OBJ_LABEL,0,0,0); ObjectCreate("text4",OBJ_LABEL,0,0,0); ObjectSet("text1",OBJPROP_XDISTANCE,_xDist); ObjectSet("text2",OBJPROP_XDISTANCE,_xDist); ObjectSet("text3",OBJPROP_XDISTANCE,_xDist); ObjectSet("text4",OBJPROP_XDISTANCE,_xDist); ObjectSet("text1",OBJPROP_YDISTANCE,_yDist); ObjectSet("text2",OBJPROP_YDISTANCE,_yDist+20); ObjectSet("text3",OBJPROP_YDISTANCE,_yDist+40); ObjectSet("text4",OBJPROP_YDISTANCE,_yDist+60); ObjectSetText("text1",Symbol()+" Lot size = "+DoubleToStr(_lots,2),_textSize,"Tahoma",Red); ObjectSetText("text2","Actual price (Bid/Ask) = "+DoubleToStr(Bid,Digits)+"/"+DoubleToStr(Ask,Digits),_textSize,"Tahoma",Red); ObjectSetText("text3","Tick Value = "+DoubleToStr(_tickValue,2),_textSize,"Tahoma",Red); ObjectSetText("text4","StopLoss Level (Buy/Sell) = "+DoubleToStr(Ask-_StopLoss*Point,Digits)+"/"+DoubleToStr(Bid+_StopLoss*Point,Digits),_textSize,"Tahoma",Red); //---- } //+------------------------------------------------------------------+
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...
#63
Отправлено 21 June 2010 - 06:43
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...
#65
Отправлено 23 June 2010 - 09:21
//------- Внешние параметры модуля --------------------------------------------+ extern string _P_Trailing = "---------- Параметры трала"; extern bool UseTrailing = True; // Использовать трал extern bool ProfitTrailing = True; // Тралить только профит extern int TrailingStopBuy = 50; // Фиксированный размер трала extern int TrailingStopSell = 50; // Фиксированный размер трала extern int TrailingStep = 5; // Шаг трала //+----------------------------------------------------------------------------+ //| Сопровождение позиции простым тралом | //| Параметры: | //| sy - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ void TrailingPositions(string sy="", int op=-1, int mn=-1) { double p, pp; int i, k=OrdersTotal(); if (sy=="") sy=Symbol(); p=MarketInfo(sy, MODE_POINT); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy && (op<0 || OrderType()==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { pp=MarketInfo(sy, MODE_BID); if (!ProfitTrailing || (pp-OrderOpenPrice())>TrailingStopBuy*p) { if (OrderStopLoss()<pp-(TrailingStopBuy+TrailingStep-1)*p) { ModifyOrder(sy, -1, pp-TrailingStopBuy*p, 0, clModifyBuy); } } } if (OrderType()==OP_SELL) { pp=MarketInfo(sy, MODE_ASK); if (!ProfitTrailing || OrderOpenPrice()-pp>TrailingStopSell*p) { if (OrderStopLoss()>pp+(TrailingStopSell+TrailingStep-1)*p || OrderStopLoss()==0) { ModifyOrder(sy, -1, pp+TrailingStopSell*p, 0, clModifySell); } } } } } } } } //+----------------------------------------------------------------------------+
- Necron это нравится
#66
Отправлено 23 June 2010 - 10:37
ТРЕЙЛИНГ ПО ФРАКТАЛАМ
ТРЕЙЛИНГ ПО ТЕНЯМ N СВЕЧЕЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-"УДАВКА"
ТРЕЙЛИНГ ПО ВРЕМЕНИ
ТРЕЙЛИНГ ПО ATR (Average True Range, Средний истинный диапазон)
ТРЕЙЛИНГ РАСЧЕТ БАРИШПОЛЬЦА
ТРЕЙЛИНГ ПО ЦЕНОВОМУ КАНАЛУ
ТРЕЙЛИНГ ПО СКОЛЬЗЯЩЕМУ СРЕДНЕМУ
ТРЕЙЛИНГ "ПОЛОВИНЯЩИЙ"
К каждому в коде есть описание. Сбросить в папку include, или просто выдирать оттуда функции
Прикрепленные файлы
#67
Отправлено 23 June 2010 - 13:14
Коллеги, функция trailingProfit у кого-нибудь есть, или опять самому писать придется?
//------- Внешние параметры модуля --------------------------------------------+ extern string _P_Trailing = "---------- Параметры трала"; extern bool UseTrailing = True; // Использовать трал extern bool ProfitTrailing = True; // Тралить только профит extern int TrailingStopBuy = 50; // Фиксированный размер трала extern int TrailingStopSell = 50; // Фиксированный размер трала extern int TrailingStep = 5; // Шаг трала //+----------------------------------------------------------------------------+ //| Сопровождение позиции простым тралом | //| Параметры: | //| sy - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ void TrailingPositions(string sy="", int op=-1, int mn=-1) { double p, pp; int i, k=OrdersTotal(); if (sy=="") sy=Symbol(); p=MarketInfo(sy, MODE_POINT); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy && (op<0 || OrderType()==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { pp=MarketInfo(sy, MODE_BID); if (!ProfitTrailing || (pp-OrderOpenPrice())>TrailingStopBuy*p) { if (OrderStopLoss()<pp-(TrailingStopBuy+TrailingStep-1)*p) { ModifyOrder(sy, -1, pp-TrailingStopBuy*p, 0, clModifyBuy); } } } if (OrderType()==OP_SELL) { pp=MarketInfo(sy, MODE_ASK); if (!ProfitTrailing || OrderOpenPrice()-pp>TrailingStopSell*p) { if (OrderStopLoss()>pp+(TrailingStopSell+TrailingStep-1)*p || OrderStopLoss()==0) { ModifyOrder(sy, -1, pp+TrailingStopSell*p, 0, clModifySell); } } } } } } } } //+----------------------------------------------------------------------------+
Есть инклюдник с разными тралами. Имеется на сегодняшний день:
ТРЕЙЛИНГ ПО ФРАКТАЛАМ
ТРЕЙЛИНГ ПО ТЕНЯМ N СВЕЧЕЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-"УДАВКА"
ТРЕЙЛИНГ ПО ВРЕМЕНИ
ТРЕЙЛИНГ ПО ATR (Average True Range, Средний истинный диапазон)
ТРЕЙЛИНГ РАСЧЕТ БАРИШПОЛЬЦА
ТРЕЙЛИНГ ПО ЦЕНОВОМУ КАНАЛУ
ТРЕЙЛИНГ ПО СКОЛЬЗЯЩЕМУ СРЕДНЕМУ
ТРЕЙЛИНГ "ПОЛОВИНЯЩИЙ"
К каждому в коде есть описание. Сбросить в папку include, или просто выдирать оттуда функции
Это был так вопрос с подковыркой на засыпку... Как тралить стоп знают все... А вопрос заключался в том как тралить ПРОФИТ (цель)!!!
Пока господа программеры натянули вы на слабую "троечку"...
Уточняю вопрос - рассмотрим пример... вы вошли в сделку выставили ТейкПрофит на 100 пунктов, цена берет ваш тейк сделка закрывается, а цена прет дальше еще пунктов на 200-300 вы сидите у монитора и кусаете локти... или еще хуже новички после полученной прибыли кидаются еще раз в догонку уходящему поезду и ловят убыток сжирающие ранее полученную прибыль...
Что делает функция (советник):
- вы первоначально устанавливаете тейкПрофит в 100 пунктов в параметрах функции, как только этот уровень достигается ТП переносится на следующий уровень (сделка при этом не закрывается) для защиты уже полученной, но не пофиксиной прибыли выставляется уровень БУ (потом тралиться обычным способом)... и так пока сделка не закроется по БУ... мы имеем новое значение уровня ТП в пунктах, имеем начальное... после набора статистических данных мы можем определять наиболее выгодный уровень ТП (так сказать самообучающийся ТП)...
Интересно?
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...
#68
Отправлено 20 September 2010 - 00:55
/* sy - символ ("0" -текущий,""-любой) ty - тип ордера (-1 - любой) mn - магический номер ордера (-1 -любой) tStart - начала периода (количество секунд прошедших после 00:00 1 января 1970 года) tEnd - конец периода (количество секунд прошедших после 00:00 1 января 1970 года) */ int ClosePeriodOrders(string sy,int ty,int mn,datetime tStart,datetime tEnd) { int k=OrdersTotal()-1,i,_return=0,dg; if(sy=="0") sy=Symbol(); double pBid,pAsk; for(i=k;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(sy==""||OrderSymbol()==sy) { if(OrderType()==OP_BUY||OrderType()==OP_SELL) { if(ty<0||OrderType()==ty) { if(mn<0||OrderMagicNumber()==mn) { if(OrderOpenTime()>=tStart && OrderOpenTime()<tEnd) { dg=MarketInfo(OrderSymbol(),MODE_DIGITS); pBid=MarketInfo(OrderSymbol(),MODE_BID); pAsk=MarketInfo(OrderSymbol(),MODE_ASK); if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pBid,dg),3,Green); else if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pAsk,dg),3,OrangeRed); _return++; } } } } } } } return(_return); }
#69
Отправлено 01 October 2010 - 22:41
/* sy - символ ("0" -текущий,""-любой) ty - тип ордера (-1 - любой) mn - магический номер ордера (-1 -любой) */ void VirtualTP(string sy,int ty,int mn) { int k=OrdersTotal()-1,i,dg; if(sy=="0")sy=Symbol(); double pBid,pAsk; string sym=""; for(i=k;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(sy==""||OrderSymbol()==sy) { if(OrderType()==OP_BUY||OrderType()==OP_SELL) { if(ty<0||OrderType()==ty) { if(mn<0||OrderMagicNumber()==mn) { sym=OrderSymbol(); dg=MarketInfo(sym,MODE_DIGITS); pBid=MarketInfo(sym,MODE_BID); pAsk=MarketInfo(sym,MODE_ASK); if(OrderType()==OP_BUY) { if(Bid-OrderOpenPrice()>=TakeProfit*PointX(sym)) { OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pBid,dg),1,Green); } }else if(OrderType()==OP_SELL) { if(OrderOpenPrice()-Ask>=TakeProfit*PointX(sym)) { OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pAsk,dg),1,OrangeRed); } } } } } } } } return; }
#70
Отправлено 01 October 2010 - 22:42
/* sy - символ ("0" -текущий,""-любой) ty - тип ордера (-1 - любой) mn - магический номер ордера (-1 -любой) */ void VirtualSL(string sy,int ty,int mn) { int k=OrdersTotal()-1,i,dg; if(sy=="0")sy=Symbol(); double pBid,pAsk; string sym=""; for(i=k;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(sy==""||OrderSymbol()==sy) { if(OrderType()==OP_BUY||OrderType()==OP_SELL) { if(ty<0||OrderType()==ty) { if(mn<0||OrderMagicNumber()==mn) { sym=OrderSymbol(); dg=MarketInfo(sym,MODE_DIGITS); pBid=MarketInfo(sym,MODE_BID); pAsk=MarketInfo(sym,MODE_ASK); if(OrderType()==OP_BUY) { if(OrderOpenPrice()-Bid>=StopLoss*PointX(sym)) { OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pBid,dg),1,Green); } }else if(OrderType()==OP_SELL) { if(Ask-OrderOpenPrice()>=StopLoss*PointX(sym)) { OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pAsk,dg),1,OrangeRed); } } } } } } } } return; }
#71
Отправлено 01 October 2010 - 22:54
extern int TrailingFirstProfit=30; //необходимый профит для модификации стопа в первый раз extern int TrailingFirstDistance=5; //расстояние на которое двигается стоп от безубытка в первый раз extern int TrailingSecondProfit=50; //необходимый профит для второй модификации extern int TrailingSecondDistance=25; //расстояние на которое двигается стоп от безубытка во второй раз /* sy - символ ("0" -текущий,""-любой) ty - тип ордера (-1 - любой) mn - магический номер ордера (-1 -любой) */ void DoubleMovingInNoLoss(string sy,int ty,int mn) { int i,k=OrdersTotal()-1,dg; double po,tmp_v=0.0; double pBid,pAsk; if(sy=="0")sy=Symbol(); for(i=k;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(sy==""||OrderSymbol()==sy) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(mn<0||OrderMagicNumber()==mn) { if(ty<0||OrderType()==ty) { pBid=MarketInfo(OrderSymbol(),MODE_BID); pAsk=MarketInfo(OrderSymbol(),MODE_ASK); po=MarketInfo(OrderSymbol(),MODE_POINT); dg=MarketInfo(OrderSymbol(),MODE_DIGITS); if(dg==5||dg==3)po*=10; if(OrderType()==OP_BUY) { if((pBid-OrderOpenPrice())>=TrailingFirstProfit*po) { if((pBid-OrderOpenPrice())<TrailingSecondProfit*po) { tmp_v=OrderOpenPrice()+TrailingFirstDistance*po; if(MathAbs(tmp_v-OrderStopLoss())>=1*po) { if(tmp_v>OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg), OrderTakeProfit(),OrderExpiration(),DodgerBlue); } } } if((pBid-OrderOpenPrice())>=TrailingSecondProfit*po) { tmp_v=OrderOpenPrice()+TrailingSecondDistance*po; if(MathAbs(tmp_v-OrderStopLoss())>=1*po) { if(tmp_v>OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg), OrderTakeProfit(),OrderExpiration(),DodgerBlue); } } } } } if(OrderType()==OP_SELL) { if((OrderOpenPrice()-pAsk)>=TrailingFirstProfit*po) { if((OrderOpenPrice()-pAsk)<TrailingSecondProfit*po) { tmp_v=OrderOpenPrice()-TrailingFirstDistance*po; if(MathAbs(OrderStopLoss()-tmp_v)>=1*po) { if((OrderStopLoss()==0) || (tmp_v<OrderStopLoss())) { OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg), OrderTakeProfit(),OrderExpiration(),Orange); } } } if((OrderOpenPrice()-pAsk)>=TrailingSecondProfit*po) { tmp_v=OrderOpenPrice()-TrailingSecondDistance*po; if(MathAbs(OrderStopLoss()-tmp_v)>=1*po) { if((OrderStopLoss()==0) || (tmp_v<OrderStopLoss())) { OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg), OrderTakeProfit(),OrderExpiration(),Orange); } } } } } } } } } } } return; }
#72
Отправлено 01 October 2010 - 23:10
/* sy-символ, для которого хотим узнать размер пункта, "0"-текущий, значение по умолчанию */ double PointX(string sy="0") { if(sy=="0")sy=Symbol(); int dg=MarketInfo(sy,MODE_DIGITS); double _return=0.0, po=MarketInfo(sy,MODE_POINT); if(dg==5||dg==3) _return=po*10; else _return=po; return(_return); }
#73
Отправлено 01 October 2010 - 23:51
Michelangelo®, прочитал твой пост - вспомнил. Здесь как ни крути смысла нету тралить тейкпрофит: цена подходит к нету, а он,гад, отодвигается все дальше. И как результат, сделка закроется по SL (в безубытке и по тралу), лучше его (TP) вообще не ставитьЭто был так вопрос с подковыркой на засыпку... Как тралить стоп знают все... А вопрос заключался в том как тралить ПРОФИТ (цель)!!!
Пока господа программеры натянули вы на слабую "троечку"...
Уточняю вопрос - рассмотрим пример... вы вошли в сделку выставили ТейкПрофит на 100 пунктов, цена берет ваш тейк сделка закрывается, а цена прет дальше еще пунктов на 200-300 вы сидите у монитора и кусаете локти... или еще хуже новички после полученной прибыли кидаются еще раз в догонку уходящему поезду и ловят убыток сжирающие ранее полученную прибыль...
Что делает функция (советник):
- вы первоначально устанавливаете тейкПрофит в 100 пунктов в параметрах функции, как только этот уровень достигается ТП переносится на следующий уровень (сделка при этом не закрывается) для защиты уже полученной, но не пофиксиной прибыли выставляется уровень БУ (потом тралиться обычным способом)... и так пока сделка не закроется по БУ... мы имеем новое значение уровня ТП в пунктах, имеем начальное... после набора статистических данных мы можем определять наиболее выгодный уровень ТП (так сказать самообучающийся ТП)...
Интересно?
Если рассматривать "самообучающийся ТП", то здесь можно сделать проще, пусть не совсем то, но уже близко. Обычно ведь выставляем ТП и СЛ в пунктах(если не оговорен иной вариант), а потом оптимизация и т.д.. Более подходящий метод (ИМХО) использование коэффициента от среднего диапазона, не ATR, а High-Low, и затем машку по этим значениям построить. В настройки выносим только сам коэффициент и период машки. Как результат эти значения не нужно оптимизировать для каждой пары отдельно, достаточно прогнать один раз на какой-нибудь и все.
#74
Отправлено 05 October 2010 - 21:42
Вот, написал функцию для этого метода, и, соответственно, скрипт для проверки.Если рассматривать "самообучающийся ТП", то здесь можно сделать проще, пусть не совсем то, но уже близко. Обычно ведь выставляем ТП и СЛ в пунктах(если не оговорен иной вариант), а потом оптимизация и т.д.. Более подходящий метод (ИМХО) использование коэффициента от среднего диапазона, не ATR, а High-Low, и затем машку по этим значениям построить. В настройки выносим только сам коэффициент и период машки. Как результат эти значения не нужно оптимизировать для каждой пары отдельно, достаточно прогнать один раз на какой-нибудь и все.
/* ty - тип ордера (см. документацию) mode : 1 - возвращает тейкпрофит, -1 возвращает стоплосс avg_period - период для расчета среднего диапазона lvl - уровень отложенного ордера shift - смещение бара для начала расчета среднего sy - символ tf - таймфрейм ("0" -текущий) */ double GetOrderLevels(int ty, int mode, int avg_period, double lvl=-1,int shift=1, string sy="0",int tf=0) { double _return=-1, avg=0.0, hh=0.0,ll=0.0; double pAsk=0.0, pBid=0.0; if(sy=="0")sy=Symbol(); int dg=MarketInfo(sy,MODE_DIGITS); if(tf<0 || (mode!=1 && mode!=-1) || avg_period<0 || ty<0 || ty>6 || (ty>1 && lvl<=0)) { Print("Функции "GetOrderLevels" переданы неверные значения параметров!"); return(-1); } pAsk=MarketInfo(sy,MODE_ASK); pBid=MarketInfo(sy,MODE_BID); if(pAsk==0.0 || pBid==0.0) { Print("GetOrderLevels: в обзоре рынка не найден символ "+sy+"!"); return(-1); } if(iBars(sy,tf)<avg_period+1) { Print("GetOrderLevels: недостаточно истории для расчета среднего значения!"); return(-1); } for(int i=shift;i<(shift+avg_period);i++) { hh=iHigh(sy,tf,i); ll=iLow(sy,tf,i); avg+=hh-ll; } avg/=avg_period; if(mode==1) { switch(ty) { case OP_BUY: {_return=Ask+TakeProfit_Koeff*avg;break;} case OP_SELL: {_return=Bid-TakeProfit_Koeff*avg;break;} case OP_BUYLIMIT: {_return=lvl+TakeProfit_Koeff*avg;break;} case OP_SELLLIMIT: {_return=lvl-TakeProfit_Koeff*avg;break;} case OP_BUYSTOP: {_return=lvl+TakeProfit_Koeff*avg;break;} case OP_SELLSTOP: {_return=lvl-TakeProfit_Koeff*avg;break;} default: {break;} } }else { switch(ty) { case OP_BUY: {_return=Bid-StopLoss_Koeff*avg;break;} case OP_SELL: {_return=Ask+StopLoss_Koeff*avg;break;} case OP_BUYLIMIT: {_return=lvl-StopLoss_Koeff*avg;break;} case OP_SELLLIMIT: {_return=lvl+StopLoss_Koeff*avg;break;} case OP_BUYSTOP: {_return=lvl-StopLoss_Koeff*avg;break;} case OP_SELLSTOP: {_return=lvl+StopLoss_Koeff*avg;break;} default: {break;} } } Print("GetOrderLevels: _return="+DoubleToStr(_return,dg)); return(NormalizeDouble(_return,dg)); }
Прикрепленные файлы
- Michelangelo® это нравится
#75
Отправлено 25 November 2010 - 11:42
Великолепный раздел для тех кто хочет писАть сам! Очень много полезного нашёл для себя.
Вопрос к Michelangelo, а возможно ли в принципе написание упоминавшегося Вами ТрейлингПрофита?
С уважением, спасибо!