//+------------------------------------------------------------------+ //| Equity_virtual.mq4 | //| Copyright © 2009, Xupypr | //| http://www.mql4.com/ru/users/Xupypr | //| Версия от 06.10.2009 | //| http://codebase.mql4.com/ru/5389 | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Xupypr" #property link "http://www.mql4.com/ru/users/Xupypr" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 SteelBlue #property indicator_color2 OrangeRed #property indicator_color3 LimeGreen #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 2 //------------- Торговые параметры extern string Default_Symbols=""; // Эта строка будет добавляться в описание новых трендовых линий автоматически, но если она пустая, то в описание будет добавлен текущий символ extern double Default_Lot=0.1; // Размер лота по умолчанию, если он не указан дополнительно после названия инструмента в описании трендовой линии extern bool Auto_Symbol=false; // Описание всех трендовых линий регулируется автоматически под текущий инструмент и направление сделки, размер лота можно редактировать extern bool Use_M1=false; // Использовать минутный ТФ для получения цен открытия extern bool Open_Price=true; // Использовать цены открытия свечей для расчёта позиций, иначе - цены закрытия extern bool Use_MM=false; // Использовать Money Management (вместо лота подразумевается часть средств) extern int Deposit=10000; // Начальный депозит //------------- Внешний вид индикатора extern bool Show_Total=true; // Отображать общие средства (эквити) extern bool Show_Buy=false; // Отображать средства позиций buy (от начального депозита) extern bool Show_Sell=false; // Отображать средства позиций sell (от начального депозита) extern bool Show_Info=true; // Отображать информацию о просадках, фактор восстановления и статистику по сделкам extern bool Show_Vline=true; // Отображать вертикальные линии на месте открытия/закрытия позиций extern color Profit_Color=Navy; // Цвет прибыли extern color Loss_Color=Maroon; // Цвет убытков extern color Trend_Color1=Blue; // Цвет трендовых линий для 1-ой стратегии extern color Revers_Color1=Red; // Цвет трендовых линий для 1-ой стратегии с переворотом extern color Trend_Color2=Green; // Цвет трендовых линий для 2-ой стратегии extern color Revers_Color2=Gold; // Цвет трендовых линий для 2-ой стратегии с переворотом //------------- Настройка сигналов о просадке extern double Alert_Drawdown=0; // Предупреждать о просадке средств в процентах за период (0 - отключить) extern double Max_Drawdown=20; // Максимально допустимая просадка в процентах за период ("красная зона") extern bool Current_Day=true; // Просадка будет наблюдаться только за текущий день extern datetime Begin_Monitoring=D'2009.08.17 00:00'; // Начало наблюдения за просадкой (если Current_Day=false) //------------- Отображение и обновление extern uint Time_Refresh=3; // Пересчёт индикатора с новым тиком, но не чаще одного раза за указанное количество секунд extern datetime Time_Begin=D'2001.01.01 01:01'; // Начало диапазона отрисовки индикатора extern datetime Time_End=D'2011.11.11 11:11'; // Конец диапазона отрисовки индикатора extern string Uniq_String="Virtual_5389"; // Уникальная строка для идентификации индикатора и его граф. объектов // Позиции в индикаторе задаются только с помощью трендовых линий определенного цвета на графике инструмента. // Пустая строка описания линии заполняется автоматически, или пакетом по умолчанию (Default_Symbols) или текущим символом. // Положение линии определяет время открытия и закрытия пакета. Осуществляется автоматическая привязка линии к ценам открытия/закрытия свечей. // Автоматическая привязка действует в тех случаях, когда текущий инструмент присутствует в описании линии. // В описании самостоятельно можно указать нужные инструменты через пробел, где знак определяет тип операции (EURUSD+ GBPUSD-). // После знака может дописываться размер лота (EURUSD+1 GBPUSD-0.7). Если размер лота не дописан, применяется лот по умолчанию (Default_Lot). // Количество инструментов в пакетах произвольное и ограничено длиной строки. // Самостоятельно менять название линии не обязательно. За исключением случаев, когда необходимо указать точную цену входа/выхода из позиции. // Тогда в названии линии следует внести следующие изменения. Добавить строку вида "[-100,150]", где -100 коррекция входа, 150 - выхода. // Таким образом цена открытия и закрытия позиции будет скорректирована на эту величину. // Для того чтобы эмулировать частичное закрытие позиции, нужно совместить конец одной трендовой линии с началом другой. // Причём у новой позиции, помимо уменьшения объёма, следует вычесть спред. Для этого в название линии достаточно добавить символ "$". int Total,TrendTotal,Window; string Currency,ShortName; double TotalEquity[],BuyEquity[],SellEquity[]; double BuyBalance,SellBalance,MaxPeak,MaxProfit,PrevEquity; double AbsDrawdown,MaxDrawdown,RelDrawdown,Drawdown,RecoveryFactor; datetime TrendTime[][2]; int OpenBar[]; // Номер бара открытия int CloseBar[]; // Номер бара закрытия int Type[]; // Тип операции string Instrument[]; // Инструмент double Lots[]; // Количество лотов double OpenPrice[]; // Цена открытия double ClosePrice[]; // Цена закрытия //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { SetIndexBuffer(0,BuyEquity); SetIndexLabel(0,"Buy"); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(1,SellEquity); SetIndexLabel(1,"Sell"); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,TotalEquity); SetIndexLabel(2,"Total"); SetIndexStyle(2,DRAW_LINE); ShortName="Equity_virtual"; if(Show_Buy) ShortName=StringConcatenate(ShortName," Buy"); if(Show_Sell) ShortName=StringConcatenate(ShortName," Sell"); if(Show_Total) ShortName=StringConcatenate(ShortName," Total"); IndicatorShortName(ShortName); IndicatorDigits(2); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { int reason=UninitializeReason(); if(reason==1 || reason==3) return(0); int total=ObjectsTotal()-1; for(int i=total;i>=0;i--) { string name=ObjectName(i); if(StringFind(name,Uniq_String)!=-1) ObjectDelete(name); } return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { static uint tick; static string minfosymbols=""; double buyprofitloss,sellprofitloss,spread,lotsize,profit,rprofit=0,gp=0,gl=0,lpt=0,llt=0; int bar,i,j,start,finish,sp=0,lp=0,psp=0,plp=0,lsp=0,llp=0; string text,pf="0.00",ep="0.00",spw="0.00",lpw="0.00",ptt="0.00",ltt="0.00",apt="0.00",alt="0.00"; if(GetTickCount()-tick>Time_Refresh*1000) tick=GetTickCount(); else return(0); Total=0; TrendTotal=0; for(i=0;i0) continue; if(ObjectType(objectname)!=OBJ_TREND) continue; color objectcolor=(color)ObjectGet(objectname,OBJPROP_COLOR); if(objectcolor==Trend_Color1 || objectcolor==Revers_Color1) SetPosition(objectname,Revers_Color1); else if(objectcolor==Trend_Color2 || objectcolor==Revers_Color2) SetPosition(objectname,Revers_Color2); } if(ArraySize(OpenBar)>Total) { ArrayResize(OpenBar,Total); ArrayResize(Instrument,Total); ArrayResize(Type,Total); ArrayResize(OpenPrice,Total); ArrayResize(Lots,Total); ArrayResize(CloseBar,Total); ArrayResize(ClosePrice,Total); } if(Show_Total) ArrayInitialize(TotalEquity,Deposit); if(Show_Buy) ArrayInitialize(BuyEquity,Deposit); if(Show_Sell) ArrayInitialize(SellEquity,Deposit); if(Total==0) return(0); AbsDrawdown=0.0; MaxDrawdown=0.0; RelDrawdown=0.0; BuyBalance=0.0; SellBalance=0.0; MaxPeak=0.0; MaxProfit=Deposit; PrevEquity=Deposit; start=OpenBar[ArrayMaximum(OpenBar)]; finish=iBarShift(NULL,0,Time_End); for(i=start;i>=finish;i--) { buyprofitloss=0.0; sellprofitloss=0.0; for(j=0;j=i && CloseBar[j]<=i) { if(MarketInfo(Instrument[j],MODE_POINT)==0) { if(StringFind(minfosymbols,Instrument[j])==-1) { Alert("В обзоре рынка не хватает "+Instrument[j]); minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]); } continue; } bar=iBarShift(Instrument[j],0,Time[i]); lotsize=LotSize(Instrument[j],Time[i]); if(Use_MM && OpenBar[j]==i) Lots[j]=NormalizeDouble(PrevEquity/1000*Lots[j],2); if(Type[j]==OP_BUY) { if(CloseBar[j]==i) { profit=(ClosePrice[j]-OpenPrice[j])*Lots[j]*lotsize; BuyBalance+=profit; if(profit>lpt) lpt=profit; if(profit=0) { gp+=profit; plp++; } else { gl-=profit; llp++; } } else buyprofitloss+=(iClose(Instrument[j],0,bar)-OpenPrice[j])*Lots[j]*lotsize; } else { spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD); if(CloseBar[j]==i) { profit=(OpenPrice[j]-ClosePrice[j]-spread)*Lots[j]*lotsize; SellBalance+=profit; if(profit>lpt) lpt=profit; if(profit=0) { gp+=profit; psp++; } else { gl-=profit; lsp++; } } else sellprofitloss+=(OpenPrice[j]-iClose(Instrument[j],0,bar)-spread)*Lots[j]*lotsize; } } } PrevEquity=NormalizeDouble(Deposit+BuyBalance+SellBalance+buyprofitloss+sellprofitloss,2); if(Show_Total) TotalEquity[i]=PrevEquity; if(Show_Buy) BuyEquity[i]=NormalizeDouble(Deposit+BuyBalance+buyprofitloss,2); if(Show_Sell) SellEquity[i]=NormalizeDouble(Deposit+SellBalance+sellprofitloss,2); if(Show_Info && TotalEquity[i]>0) { if(AbsDrawdownMaxProfit) MaxProfit=TotalEquity[i]; if(MaxDrawdown0) { double relative=100*MaxDrawdown/MaxPeak; if(RelDrawdown0) ArraySort(TrendTime); if(finish0) rprofit=100*profit/TotalEquity[openbar+1]; if(profit>=0) objectcolor=Profit_Color; else objectcolor=Loss_Color; text=StringConcatenate(close," Profit: ",DoubleToStr(profit,2)," ",Currency," (",DoubleToStr(rprofit,2),"%)", " MaxDD: ",DoubleToStr(MaxDrawdown(openbar+1,closebar),2)," ",Currency, " Bars: ",openbar-closebar); LineCreate(open,OBJ_VLINE,1,objectcolor,open,TrendTime[i-1][0],0); LineCreate(close,OBJ_VLINE,1,objectcolor,text,TrendTime[i-1][1],0); if(i>TrendTotal) { LineDelete(open); LineDelete(close); } } else { LineDelete(open); LineDelete(close); } } if(ArrayRange(TrendTime,0)>TrendTotal) ArrayResize(TrendTime,TrendTotal); if(Show_Total) { profit=TotalEquity[0]-Deposit; if(Deposit>0) rprofit=100*profit/Deposit; else rprofit=0; text=StringConcatenate("Total Profit: ",DoubleToStr(profit,2)," ",Currency," (",DoubleToStr(rprofit,2),"%)"); LineCreate("Total Equity",OBJ_HLINE,1,LimeGreen,text,0,TotalEquity[0]); } else LineDelete("Total Equity"); if(Show_Buy) { profit=BuyEquity[0]-Deposit; if(Deposit>0) rprofit=100*profit/Deposit; else rprofit=0; text=StringConcatenate("Buy Profit: ",DoubleToStr(profit,2)," ",Currency," (",DoubleToStr(rprofit,2),"%)"); LineCreate("Buy Equity",OBJ_HLINE,1,SteelBlue,text,0,BuyEquity[0]); } else LineDelete("Buy Equity"); if(Show_Sell) { profit=SellEquity[0]-Deposit; if(Deposit>0) rprofit=100*profit/Deposit; else rprofit=0; text=StringConcatenate("Sell Profit: ",DoubleToStr(profit,2)," ",Currency," (",DoubleToStr(rprofit,2),"%)"); LineCreate("Sell Equity",OBJ_HLINE,1,OrangeRed,text,0,SellEquity[0]); } else LineDelete("Sell Equity"); if(Show_Info) { text=StringConcatenate(": ",start," bars from ",TimeToStr(Time[start])); LabelCreate("History",text,0); if(MaxDrawdown>0) { RecoveryFactor=(TotalEquity[0]-Deposit)/MaxDrawdown; text=StringConcatenate(": ",DoubleToStr(RecoveryFactor,2)); LabelCreate("Recovery Factor",text,1); } text=StringConcatenate(": ",DoubleToStr(AbsDrawdown,2)," ",Currency); LabelCreate("Absolute Drawdown",text,2); if(MaxPeak>0) { text=StringConcatenate(": ",DoubleToStr(MaxDrawdown,2)," ",Currency," (",DoubleToStr(100*MaxDrawdown/MaxPeak,2),"%)"); LabelCreate("Maximal Drawdown",text,3); } text=StringConcatenate(": ",DoubleToStr(RelDrawdown,2),"% (",DoubleToStr(Drawdown,2)," ",Currency,")"); LabelCreate("Relative Drawdown",text,4); if(gl!=0) pf=DoubleToStr(gp/gl,2); if((sp+lp)!=0) ep=DoubleToStr((gp-gl)/(sp+lp),2); if(sp!=0) spw=DoubleToStr(100.0*psp/sp,2); if(lp!=0) lpw=DoubleToStr(100.0*plp/lp,2); if((sp+lp)!=0) ptt=DoubleToStr(100.0*(psp+plp)/(sp+lp),2); if((sp+lp)!=0) ltt=DoubleToStr(100.0*(lsp+llp)/(sp+lp),2); if((psp+plp)!=0) apt=DoubleToStr(gp/(psp+plp),2); if((lsp+llp)!=0) alt=DoubleToStr(-gl/(lsp+llp),2); text=StringConcatenate(": ",DoubleToStr(gp,2)," ",Currency); LabelCreate("Gross Profit",text,6); text=StringConcatenate(": ",DoubleToStr(gl,2)," ",Currency); LabelCreate("Gross Loss",text,7); text=StringConcatenate(": ",DoubleToStr(gp-gl,2)," ",Currency); LabelCreate("Total Net Profit",text,8); text=StringConcatenate(": ",pf); LabelCreate("Profit Factor",text,9); text=StringConcatenate(": ",ep); LabelCreate("Expected Payoff",text,10); text=StringConcatenate(": ",sp+lp); LabelCreate("Total Trades",text,11); text=StringConcatenate(": ",sp," (",spw,"%)"); LabelCreate("Short Positions (won %)",text,12); text=StringConcatenate(": ",lp," (",lpw,"%)"); LabelCreate("Long Positions (won %)",text,13); text=StringConcatenate(": ",psp+plp," (",ptt,"%)"); LabelCreate("Profit Trades (% of total)",text,14); text=StringConcatenate(": ",lsp+llp," (",ltt,"%)"); LabelCreate("Loss Trades (% of total)",text,15); text=StringConcatenate(": ",DoubleToStr(lpt,2)); LabelCreate("Largest profit trade",text,16); text=StringConcatenate(": ",DoubleToStr(llt,2)); LabelCreate("Largest loss trade",text,17); text=StringConcatenate(": ",apt); LabelCreate("Average profit trade",text,18); text=StringConcatenate(": ",alt); LabelCreate("Average loss trade",text,19); } if(Alert_Drawdown>0 && Show_Total) AlertDrawdown(); return(0); } //+------------------------------------------------------------------+ //| Создание текстовой метки | //+------------------------------------------------------------------+ void LabelCreate(string name,string str,int pos) { string objectname=StringConcatenate(name," ",Uniq_String); if(ObjectFind(objectname)==-1) { ObjectCreate(objectname,OBJ_LABEL,Window,0,0); ObjectSet(objectname,OBJPROP_XDISTANCE,3); ObjectSet(objectname,OBJPROP_YDISTANCE,10*pos+4); ObjectSet(objectname,OBJPROP_CORNER,1); } ObjectSetText(objectname,name+str,7,"Tahoma",SlateGray); } //+------------------------------------------------------------------+ //| Создание линии | //+------------------------------------------------------------------+ void LineCreate(string name,int type,int width,color clr,string str,datetime time1,double price1,datetime time2=0,double price2=0) { string objectname=StringConcatenate(name," ",Uniq_String); if(ObjectFind(objectname)==-1) { ObjectCreate(objectname,type,Window,time1,price1,time2,price2); ObjectSet(objectname,OBJPROP_WIDTH,width); if(type==OBJ_TREND) ObjectSet(objectname,OBJPROP_RAY,false); if(type==OBJ_HLINE) ObjectSet(objectname,OBJPROP_STYLE,STYLE_DOT); } if(StringFind(ObjectDescription(objectname)," in")==-1) ObjectSetText(objectname,str); ObjectSet(objectname,OBJPROP_COLOR,clr); ObjectSet(objectname,OBJPROP_TIME1,time1); ObjectSet(objectname,OBJPROP_PRICE1,price1); ObjectSet(objectname,OBJPROP_TIME2,time2); ObjectSet(objectname,OBJPROP_PRICE2,price2); } //+------------------------------------------------------------------+ //| Удаление линии | //+------------------------------------------------------------------+ void LineDelete(string name) { string objectname=StringConcatenate(name," ",Uniq_String); if(ObjectFind(objectname)!=-1) ObjectDelete(objectname); } //+------------------------------------------------------------------+ //| Наблюдение и предупреждение о просадках за период | //+------------------------------------------------------------------+ void AlertDrawdown() { int bar=0; color clr; string drawdownstr,text; double relative,level,curdrawdown; double maxpeak=0,maxprofit,maxdrawdown,reldrawdown,drawdown=0,maxDD; datetime time,timehigh=0,timelow=0,timemaxprofit=0; if(Current_Day) time=StrToTime(TimeToStr(Time[0],TIME_DATE)); else time=Begin_Monitoring; if(time=0;i--) { if(TotalEquity[i]<0) return; if(TotalEquity[i]>maxprofit) { timemaxprofit=Time[i]; maxprofit=TotalEquity[i]; maxdrawdown=0.0; reldrawdown=0.0; maxDD=Alert_Drawdown; } if(maxdrawdown0) { relative=NormalizeDouble(100*maxdrawdown/maxpeak,1); if(reldrawdownTotalEquity[0]) { Alert("Уровень средств опустился до отметки ",TotalEquity[0]," ",Currency); ObjectSet(text,OBJPROP_PRICE1,TotalEquity[0]); } } if(reldrawdown>maxDD) { maxDD=reldrawdown; if(maxDD>Max_Drawdown) { text=StringConcatenate("Внимание! Превышен уровень допустимой просадки на ",DoubleToStr(maxDD-Max_Drawdown,1),"%\n"); text=StringConcatenate(text,"Допустимая просадка задана на уровне ",DoubleToStr(Max_Drawdown,1),"%\n"); } else { text=StringConcatenate("Превышен уровень сигнальной просадки на ",DoubleToStr(maxDD-Alert_Drawdown,1),"%\n"); text=StringConcatenate(text,"Сигнальная просадка задана на уровне ",DoubleToStr(Alert_Drawdown,1),"%\n"); } drawdownstr=StringConcatenate(DoubleToStr(reldrawdown,1),"% (",DoubleToStr(drawdown,2)," ",Currency,")"); text=StringConcatenate(text,"Просадка в средствах за текущий период составила ",drawdownstr,"\n"); text=StringConcatenate(text,"Период мониторинга: ",bar," бара(ов) от ",TimeToStr(time),"\n"); text=StringConcatenate(text,"Название индикатора: ",ShortName,"\n"); text=StringConcatenate(text,"Индикатор работает на ",Symbol(),",",StringPeriod()); Alert(text); if(maxDD>Max_Drawdown) clr=Loss_Color; else clr=DarkOrange; LineCreate("Drawdown Line",OBJ_TREND,2,clr," "+drawdownstr,timehigh,maxpeak,timelow,maxpeak-drawdown); } else LineDelete("Drawdown Line"); LineCreate("Begin Monitoring",OBJ_VLINE,1,SlateGray,"Begin Monitoring",time,0); level=NormalizeDouble(maxprofit,2); LineCreate("Max Profit",OBJ_TREND,1,Profit_Color,"Max Profit",timemaxprofit,level,Time[0],level); level=NormalizeDouble(maxprofit*(1-Alert_Drawdown/100),2); LineCreate("Alert Drawdown",OBJ_TREND,1,DarkOrange,"Alert Drawdown "+DoubleToStr(Alert_Drawdown,1)+"%",timemaxprofit,level,Time[0],level); level=NormalizeDouble(maxprofit*(1-Max_Drawdown/100),2); LineCreate("Max Drawdown",OBJ_TREND,1,Loss_Color,"Max Drawdown "+DoubleToStr(Max_Drawdown,1)+"%",timemaxprofit,level,Time[0],level); if(Show_Info) { curdrawdown=maxprofit-TotalEquity[0]; text=StringConcatenate(": ",DoubleToStr(curdrawdown,2)," ",Currency," (",DoubleToStr(100*curdrawdown/maxprofit,2),"%)"); LabelCreate("Current Drawdown",text,5); } } //+------------------------------------------------------------------+ //| Строковое обозначение периода | //+------------------------------------------------------------------+ string StringPeriod() { string period; switch(Period()) { case PERIOD_M1: period="M1"; break; case PERIOD_M5: period="M5"; break; case PERIOD_M15: period="M15"; break; case PERIOD_M30: period="M30"; break; case PERIOD_H1: period="H1"; break; case PERIOD_H4: period="H4"; break; case PERIOD_D1: period="D1"; break; case PERIOD_W1: period="W1"; break; case PERIOD_MN1: period="MN1"; } return(period); } //+------------------------------------------------------------------+ //| Расчёт максимальной просадки за период | //+------------------------------------------------------------------+ double MaxDrawdown(int in,int out) { double maxprofit=0.0,maxdd=0.0; for(int i=in;i>=out;i--) { if(TotalEquity[i]<0) return(-1); if(TotalEquity[i]>maxprofit) maxprofit=TotalEquity[i]; if(maxdd0) size=size/close1; } else { BQ=StringSubstr(symbol,0,3)+"USD"; if(iClose(BQ,0,0)==0) BQ="USD"+StringSubstr(symbol,0,3); if(iClose(BQ,0,0)==0) break; int BQbar=iBarShift(BQ,0,tbar); close1=iClose(symbol,0,sbar); close2=iClose(BQ,0,BQbar); if(close1>0 && close2>0) { if(StringSubstr(BQ,0,3)=="USD") size=size/close2/close1; else size=size*close2/close1; } } } break; case 1: size=MarketInfo(symbol,MODE_LOTSIZE); break; case 2: size=MarketInfo(symbol,MODE_TICKVALUE)/MarketInfo(symbol,MODE_TICKSIZE); } if(currency!="USD") { BQ=currency+"USD"; if(iClose(BQ,0,0)==0) { BQ="USD"+currency; close1=iClose(BQ,0,iBarShift(BQ,0,tbar)); if(close1>0) size*=close1; } else { close1=iClose(BQ,0,iBarShift(BQ,0,tbar)); if(close1>0) size/=close1; } } return(size); } //+------------------------------------------------------------------+ //| Установка параметров позиции по трендовой линии | //+------------------------------------------------------------------+ void SetPosition(string name,color revers) { double corrin=0,corrout=0,priceopen,priceclose; int timeframe=0; datetime timeopen=(datetime)ObjectGet(name,OBJPROP_TIME1); datetime timeclose=(datetime)ObjectGet(name,OBJPROP_TIME2); if(timeopen==timeclose) return; if(timeopen>timeclose) { timeopen=(datetime)ObjectGet(name,OBJPROP_TIME2); timeclose=(datetime)ObjectGet(name,OBJPROP_TIME1); } if(timeopen>TimeCurrent() || timeopenTime_End) return; int pos1=StringFind(name,"["); int pos2=StringFind(name,","); if(pos1!=-1 && pos2!=-1) corrin=StrToDouble(StringSubstr(name,pos1+1,pos2-pos1-1)); pos1=StringFind(name,"]"); if(pos1!=-1 && pos2!=-1) corrout=StrToDouble(StringSubstr(name,pos2+1,pos1-pos2-1)); if(Use_M1) timeframe=PERIOD_M1; if(Open_Price) { priceopen=iOpen(NULL,timeframe,iBarShift(NULL,timeframe,timeopen))+corrin*MarketInfo(Symbol(),MODE_POINT); priceclose=iOpen(NULL,timeframe,iBarShift(NULL,timeframe,timeclose))+corrout*MarketInfo(Symbol(),MODE_POINT); } else { priceopen=iClose(NULL,timeframe,iBarShift(NULL,timeframe,timeopen))+corrin*MarketInfo(Symbol(),MODE_POINT); priceclose=iClose(NULL,timeframe,iBarShift(NULL,timeframe,timeclose))+corrout*MarketInfo(Symbol(),MODE_POINT); } string description=ObjectDescription(name); if(description=="" || Auto_Symbol) { if(Default_Symbols!="" && !Auto_Symbol) description=Default_Symbols; else { if(Auto_Symbol) { string lot=""; pos1=StringFind(description,Symbol()); if(pos1!=-1) { pos2=pos1+StringLen(Symbol())+1; lot=StringSubstr(description,pos2); if(StrToDouble(lot)==0) lot=""; } } description=Symbol(); if(priceopenTimeCurrent()) { if(ObjectGet(name,OBJPROP_TIME2)