<code>//--- green_value<<=8; blue_value<<=16; return(red_value+green_value+blue_value); } //+------------------------------------------------------------------+ //| right comparison of 2 doubles | //+------------------------------------------------------------------+ bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); } //+------------------------------------------------------------------+ //| up to 16 digits after decimal point | //+------------------------------------------------------------------+ string DoubleToStrMorePrecision(double number,int precision) { static double DecimalArray[17]= { 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0 }; double rem,integer,integer2; string intstring,remstring,retstring; bool isnegative=false; int rem2; //--- if(precision<0) precision=0; if(precision>16) precision=16; //--- double p=DecimalArray[precision]; if(number<0.0) { isnegative=true; number=-number; } integer=MathFloor(number); rem=MathRound((number-integer)*p); remstring=""; for(int i=0; i<precision; i++) { integer2=MathFloor(rem/10); rem2=(int)NormalizeDouble(rem-integer2*10,0); remstring=IntegerToString(rem2)+remstring; rem=integer2; } //--- intstring=DoubleToStr(integer,0); if(isnegative) retstring="-"+intstring; else retstring=intstring; if(precision>0) retstring=retstring+"."+remstring; //--- return(retstring); } //+------------------------------------------------------------------+ //| convert integer to string contained input's hexadecimal notation | //+------------------------------------------------------------------+ string IntegerToHexString(int integer_number) { string hex_string="00000000"; int value,shift=28; //--- for(int i=0; i<8; i++) { value=(integer_number>>shift)&0x0F; if(value<10) hex_string=StringSetChar(hex_string,i,ushort(value+'0')); else hex_string=StringSetChar(hex_string,i,ushort((value-10)+'A')); shift-=4; } //--- return(hex_string); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| stdlib.mq4 | //| Copyright 2005-2015, MetaQuotes Software Corp. | //| http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "2005-2015, MetaQuotes Software Corp." #property link "http://www.mql4.com" #property library //+------------------------------------------------------------------+ //| return error description | //+------------------------------------------------------------------+ string ErrorDescription(int error_code) { string error_string; </code>
bool _IsTime = IsTime(); //узнаем, подходит ли текущее время для торговли
if(Update_Time != iTime(NULL,0,0) && _IsTime) //обновлять данные всех индикаторов раз в период // < ???
{
Update_Time = iTime(NULL,0,0); //перезаписываем значение переменной для хранения времени текущей свечи
//импорт данных индикатора Stochastic для предыдущей свечи [1]
Stoh = iStochastic(NULL,0,InpKPeriod,InpDPeriod,InpSlowing,MODE_SMA,1,MODE_MAIN,1);
}
if(_IsTime)
{
if(cnt_b == 0 && Stoh < 100-StohLevel) //условие для открытия ордера на покупку
OpenTrade(OP_BUY); //открытие ордера на покупку
if(cnt_s == 0 && Stoh > StohLevel) //условие для открытия ордера на продажу
OpenTrade(OP_SELL); //открытие ордера на продажу
}
int Error = GetLastError(); //поиск ошибок по завершению тика
if(Error != 0) Print("OnTick() Error ", GetLastError());
}
//+------------------------------------------------------------------+
bool OpenTrade(int OP_Type) //функция для открытия рыночного ордера
{
if(MaxSpread > 0 && (Ask - Bid) > MaxSpread*Point)
return(false);
double price = (OP_Type == OP_BUY ? Ask : Bid); //определение цены для открытия рыночного ордера
color col_type = (OP_Type == OP_BUY ? clrBlue : clrRed); //определение цвета стрелки ордера
string op_str = (OP_Type == OP_BUY ? "на покупку" : "на продажу"); //определение текста для принта
double lot = getLastCloseLot (OP_Type);
int ticket = OrderSend(Symbol(), OP_Type, lot, price, Slippage, 0, 0, "", MagicNumber, 0, col_type); //открытие ордера
if(ticket > 0) //Если ордер был открыт
{
Print("Ордер #",IntegerToString(ticket)," успешно открыт");
return(true);
}
else //при ошибке открытия ордера
{
int Error = GetLastError();
Update_Time = 0;
Print("Ошибка открытия ордера ", GetLastError());
}
return(false);
}
//+------------------------------------------------------------------+
bool IsTime() //проверка разрешенного времени для торговли
{
datetime _TimeCurrent = TimeCurrent();
if(StartTime > EndTime)
if ((_TimeCurrent >= StartTime && _TimeCurrent < EndTime+60*60*60*24) || (_TimeCurrent >= StartTime-60*60*60*24 && _TimeCurrent < EndTime))
return(true);
else
if(StartTime < EndTime)
if (_TimeCurrent >= StartTime && _TimeCurrent < EndTime)
return(true);
return(false);
}
//+------------------------------------------------------------------+
void CheckBE(int OP_Type) //проверка для перевода ордеров в безубыток
{
if(OP_Type == OP_BUY) //если ордер на покупку
{
double NewSL = NormalizeDouble(OrderOpenPrice()+BE_Step*Point,Digits);
if(OrderStopLoss() < NewSL) //если СЛ еще не был перенесен
{
if((Bid - OrderOpenPrice()) >= TakeProfit*SetBEDistance/100*Point && NewSL != OrderStopLoss())
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NewSL, OrderTakeProfit(), 0, clrNONE)) //модификация ордера
{
int Error = GetLastError();
Print("Ошибка модификации ордера ", GetLastError()); //принт от ошибки модификации
}
else
Print("Перевод ордера на покупку в Безубыток с отступом " + IntegerToString(BE_Step) + " пунктов.");
}
}
}
//---
else
if(OP_Type == OP_SELL) //если ордер на продажу
{
double NewSL = NormalizeDouble(OrderOpenPrice()-BE_Step*Point,Digits);
if(OrderStopLoss() > NewSL) //если СЛ еще не был перенесен
{
if((OrderOpenPrice() - Ask) >= TakeProfit*SetBEDistance/100*Point && NewSL != OrderStopLoss())
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NewSL, OrderTakeProfit(), 0, clrNONE)) //модификация ордера
{
int Error = GetLastError();
Print("Ошибка модификации ордера ", GetLastError()); //принт от ошибки модификации
}
else
Print("Перевод ордера на продажу в Безубыток с отступом " + IntegerToString(BE_Step) + " пунктов.");
}
}
}
}
//+------------------------------------------------------------------+
double getLastCloseLot (int o_type)
{
double lot = 0;
double prof_B = 0;
double prof_S = 0;
int type =-1;
datetime time = 0;
for(int pos = OrdersHistoryTotal() - 1; pos >= 0; pos--) //цикл по всем закрытым ордерам
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) //выделение закрытого ордера для получения его данных
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) //проверка, чтобы ордер относился в нашему советнику
{
if(OrderType()==OP_BUY)
if (time<OrderCloseTime())
{
time = OrderCloseTime();
prof_B = OrderProfit();
lot = OrderLots();
}
if(OrderType()==OP_SELL)
if (time<OrderCloseTime())
{
time = OrderCloseTime();
prof_S = OrderProfit();
lot = OrderLots();
}
}
if(o_type == OP_SELL)
{
if((prof_B == 0 && time == 0)|| prof_B>0)
lot = Lot;
else
lot = MathCeil(lot*100*LotK)/100;
}
//---
if(o_type == OP_BUY)
{
if((prof_S == 0 && time == 0)|| prof_S>0)
lot = Lot;
else
lot = MathCeil(lot*100*LotK)/100;
}
return (NormalizeDouble(lot,2));
}
//+------------------------------------------------------------------+
<code>//+------------------------------------------------------------------+ //| Asia Session KAE | //+------------------------------------------------------------------+ #property description "Asia Session KAE" #property version "1.00" #property strict extern string s0 = "<== General Settings ==>"; //> > > extern double Lot = 0.01; extern double LotK =1.8; extern int Slippage = 30; extern int StopLoss = 349; extern int TakeProfit = 103; extern int MagicNumber = 1961; extern double MaxSpread = 30; extern string s1 = "<== Stochastic Settings ==>"; //> > > extern int StohLevel = 92; extern int InpKPeriod = 5; // K Period extern int InpDPeriod = 5; // D Period extern int InpSlowing = 3; // Slowing extern string s2 = "<== Breakeven ==>"; //> > > extern double SetBEDistance = 66; // BU Distance % extern int BE_Step = 1; // BU Step pips extern string s3 = "<== Time Settings ==>"; //> > > extern int GMT_Offset = 2; //GMT Offset extern int Start_Trade_Hour = 23; //Start Trade Hour extern int Start_Trade_Minute = 0; //Start Trade Minute extern int End_Trade_Hour = 8; //End Trade Hour extern int End_Trade_Minute = 0; //End Trade Minute datetime StartTime, EndTime; datetime Update_Time = 0; int day_of_year_trade = 0; double Stoh = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (day_of_year_trade != DayOfYear()) { day_of_year_trade = DayOfYear(); datetime _CurrentDate = StrToTime(TimeToStr(TimeCurrent(),TIME_DATE));//?????????????? StartTime =_CurrentDate+Start_Trade_Hour*60*60+Start_Trade_Minute*60+GMT_Offset*60*60; EndTime = _CurrentDate+End_Trade_Hour*60*60+End_Trade_Minute*60+GMT_Offset*60*60; } //модификация открытых ордеров int cnt_b = 0, cnt_s = 0; int _OrdersTotal = OrdersTotal(); for(int pos = _OrdersTotal - 1; pos >= 0; pos--) //цикл по всем открытым ордерам { if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) //выделение ордера для получения его данных Print(" не удалось выделить ордер! " , GetLastError()); else if(OrderType() <= 2 && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) //проверка, чтобы ордер относился в нашему советнику { if(OrderType() == OP_BUY) cnt_b++; //подсчет ордеров на покупку else cnt_s++; //подсчет ордеров на продажу if(SetBEDistance > 0) //проверка для перевода в БУ CheckBE(OrderType()); if(OrderTakeProfit() == 0 || OrderStopLoss() == 0) //если у ордера нет одной из целей - модификация { double SL = 0, TP = 0; if(OrderType() == OP_BUY) //определение целей текущего ордера { SL = OrderOpenPrice()-StopLoss*Point; TP = OrderOpenPrice()+TakeProfit*Point; } else { SL = OrderOpenPrice()+StopLoss*Point; TP = OrderOpenPrice()-TakeProfit*Point; } if(!OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, clrNONE)) //модификация ордера { int Error = GetLastError(); Print("Ошибка модификации ордера ", GetLastError()); //принт от ошибки модификации } else Print("Ордер #" + IntegerToString(OrderTicket()) + " успешно модифицирован"); } } } //--- end for </code>
<code>// -------------------------------------------------------- bool ValidLot(double volume)// Проверка лота на валидность { //--- минимально допустимый объем для торговых операций double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(volume<min_volume) return(false); //--- максимально допустимый объем для торговых операций double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); if(volume>max_volume) return(false); //--- получим минимальную градацию объема double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); int ratio=(int)MathRound(volume/volume_step); if(MathAbs(ratio*volume_step-volume)>0.0000001) return(false); return(true); } //--------------------------------------------------------------- double NTP(int dir, double _op) // Нормализация цены тейкпрофита { if (TakeProfit==0) return 0; double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point; double pr=NP((dir==OP_BUY)?Bid:Ask); if (dir==OP_BUY) { tp=_op+TakeProfit*Point; return NP(MathMax(tp, pr+StopLvl)); } if (dir==OP_SELL) { tp=_op-TakeProfit*Point; return NP(MathMin(tp, pr-StopLvl)); } return 0; } //--------------------------------------------------------------- double NSL(int dir, double _op) // Нормализация цены стоплоса { if (StopLoss==0) return 0; double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point; double pr=NP((dir==OP_BUY)?Bid:Ask); if (dir==OP_BUY) { sl=_op-StopLoss*Point; return NP(MathMin(sl, pr-StopLvl)); } if (dir==OP_SELL) { sl=_op+StopLoss*Point; return NP(MathMax(sl, pr+StopLvl)); } return 0; } //--------------------------------------------------------------- double ND(double d, int n=-1) { if (n<0) return NormalizeDouble(d, Digits); return NormalizeDouble(d, n); } //--------------------------------------------------------------- double NP(double d) { double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); if (TickSize==0) TickSize=1; return ND(MathRound(d/TickSize)*TickSize); } //--------------------------------------------------------------- </code>
#property strict
//--- input parameters
input ENUM_TIMEFRAMES TF = PERIOD_H4; // Тайм Фрейм для свечей
input double StartLot = 0.01; // Лот базовый
input double LotK = 2.2; // Коэф. увеличения лота
input double MaximalLots = 1.28; // Maximal Lots
input int StopLoss = 408; // Потери в пунктах
input int TakeProfit = 353; // Прибыль в пунктах
input int PointOrderStep = 431; // Point order step (in pips)
input int Slippage = 30; // Slippage
input int MagicNumber = 1961; // Magic Number
//---
int iB=1, LastCloseType;
double tp,sl,Lot,step,LastCloseLot;
datetime LastTimeSL=0;
string LastCloseTP_SL="0";
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
step = PointOrderStep*Point;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int b=0,s=0;
//-------------------- CURENT -------------------------------------
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
if(OrderType() == OP_SELL)
s++;
if(OrderType() == OP_BUY)
b++;
}
//-------------------- HISTORY -------------------------------------
if(s+b==0)
for (int i = OrdersHistoryTotal()-1; i >=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
if (StringFind(OrderComment(),"[sl]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
{
LastCloseTP_SL = "SL";
LastCloseType = OrderType();
LastCloseLot = OrderLots();
break;
}
if (StringFind(OrderComment(),"[tp]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
{
LastCloseTP_SL = "TP";
LastCloseType = OrderType();
LastCloseLot = OrderLots();
break;
}
}
//--------------- Открытие самого первого ордера --------------------------------
double open1 = iOpen(Symbol(),TF,1);
if(s+b==0 && LastCloseLot==0) // Нет и не открывались ордера
{
if(Bid < open1)
if(! OrderSend(Symbol(),OP_SELL,NL(StartLot),Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
//---
if(Bid > open1)
if(!OrderSend(Symbol(),OP_BUY,NL(StartLot),Ask,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
//--------------- Открытие последующих ордеров ----------------------------
//---------------------------- последний закрылся по ТР
if(LastCloseTP_SL=="TP" && s+b==0) // Нет ордеров, а полследний закрылся по ТР
{
Lot = StartLot;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
if(LastCloseType==OP_BUY && Ask>open1+step)
{
if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL && Bid<open1-step)
{
if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//---------------------------- последний закрылся по SL
if(LastCloseTP_SL=="SL" && s+b==0) // Нет ордеров, а полследний закрылся по SL
{
Lot = MathCeil((LastCloseLot * LotK)*100)/100;
if(Lot > MaximalLots)
Lot = MaximalLots;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
if(LastCloseType==OP_BUY && Bid<open1-step)
{
if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL && Ask>open1+step)
{
if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//--------------- Расчет ТР и SL -------------------------------
double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
sl = StopLoss*Point;
if(sl<StopLvl)
sl=StopLvl;
tp = TakeProfit*Point;
if(tp<StopLvl)
tp=StopLvl;
//--------------- Установка ТР и SL ----------------------------
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
{
double oop = OrderOpenPrice();
double TP = OrderTakeProfit();
double SL = OrderStopLoss();
int tk = OrderTicket();
if(OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY && TP==0 && SL==0)
{
if(!OrderModify(tk,oop,NSL(OP_BUY,oop),NTP(OP_BUY,oop),0,clrBlue))
Print("Order Modify error #",GetLastError());
}
if(OrderType()==OP_SELL && TP==0 && SL==0)
if(OrderTakeProfit()==0)
if(!OrderModify(tk,oop,NSL(OP_SELL,oop),NTP(OP_SELL,oop),0,clrRed))
Print("Order Modify error #",GetLastError());
}
}
}
//---------------------------------------------------------------
double NL(double lot) // нормализация лота
{
double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
int k=0;
if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота
double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
<code>// [MT4 BREAKOUT BOX] #property indicator_chart_window extern string periodBegin = "00:00"; // Начало для расчета полосы extern string periodEnd = "03:55"; // Окончание расчета полосы extern string BoxEnd = "23:00"; // Время обрезания полосы extern color BoxHLColor = clrPowderBlue; extern color BoxPeriodColor = clrPaleGreen; extern int NumberOfDays = 50; //--- double PriceHigh[]; double PriceLow[]; //========================================================================================================== int init() { SetIndexBuffer(0,PriceHigh); SetIndexBuffer(1,PriceLow); return(INIT_SUCCEEDED); } //========================================================================================================== int deinit() { string TradeDate; for(int i=ObjectsTotal(); i>=0;i--) { TradeDate=ObjectName(i); if(StringFind(TradeDate,"Box",0)==0) ObjectDelete(TradeDate); } return(0); } //========================================================================================================== int start() { datetime TradeDate=TimeCurrent(); if(Period()<=60) { for (int i=0; i<NumberOfDays; i++) { DrawObjects(TradeDate,"BoxHighLow " +TimeToStr(TradeDate,TIME_DATE),periodBegin,periodEnd,BoxEnd,BoxHLColor,0,1); DrawObjects(TradeDate,"Box Period "+TimeToStr(TradeDate,TIME_DATE),periodBegin,periodEnd,periodEnd,BoxPeriodColor,0,2); TradeDate=decrementTradeDate(TradeDate); while (TimeDayOfWeek(TradeDate)>5) TradeDate=decrementTradeDate(TradeDate); } } return(0); } //========================================================================================================== void DrawObjects(datetime dtTradeDate,string sObjName,string sTimeBegin,string sTimeEnd,string sTimeObjEnd,color cObjColor,int iOffSet,int iForm) { datetime dtTimeBegin,dtTimeEnd,dtTimeObjEnd; double dPriceHigh,dPriceLow; int iBarBegin,iBarEnd; PriceHigh[iBarEnd]=EMPTY_VALUE; PriceLow[iBarEnd]=EMPTY_VALUE; dtTimeBegin = StrToTime(TimeToStr(dtTradeDate,TIME_DATE)+" "+sTimeBegin); dtTimeEnd = StrToTime(TimeToStr(dtTradeDate,TIME_DATE)+" "+sTimeEnd); dtTimeObjEnd = StrToTime(TimeToStr(dtTradeDate,TIME_DATE)+" "+sTimeObjEnd); iBarBegin=iBarShift(NULL,0,dtTimeBegin); iBarEnd=iBarShift(NULL,0,dtTimeEnd); dPriceHigh =High[Highest(NULL,0,MODE_HIGH,iBarBegin-iBarEnd+1,iBarEnd)]; if(iTime(NULL, 0, 0)>dtTimeEnd) PriceHigh[iBarEnd]=dPriceHigh; dPriceLow = Low [Lowest (NULL,0,MODE_LOW, iBarBegin-iBarEnd+1,iBarEnd)]; if(iTime(NULL, 0, 0)>dtTimeEnd) PriceLow[iBarEnd]=dPriceLow; //========================================================================================================== ObjectCreate(sObjName,OBJ_RECTANGLE,0,0,0,0,0); ObjectSet(sObjName,OBJPROP_TIME1,dtTimeBegin); ObjectSet(sObjName,OBJPROP_TIME2,dtTimeObjEnd); if(iForm==1) // Бокс до конца { ObjectSet(sObjName,OBJPROP_PRICE1,dPriceHigh); ObjectSet(sObjName,OBJPROP_PRICE2,dPriceLow); ObjectSet(sObjName,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(sObjName,OBJPROP_COLOR,cObjColor); ObjectSet(sObjName,OBJPROP_BACK,True); } if(iForm==2) // Бокс на участке { ObjectSet(sObjName,OBJPROP_PRICE1,dPriceHigh+iOffSet*Point); ObjectSet(sObjName,OBJPROP_PRICE2,dPriceLow-iOffSet*Point); ObjectSet(sObjName,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(sObjName,OBJPROP_COLOR,cObjColor); ObjectSet(sObjName,OBJPROP_WIDTH,1); ObjectSet(sObjName,OBJPROP_BACK,true); } } //========================================================================================================== datetime decrementTradeDate (datetime Time_Date) { int iTimeYear = TimeYear(Time_Date); int iTimeMonth = TimeMonth(Time_Date); int iTimeDay = TimeDay(Time_Date); int iTimeHour = TimeHour(Time_Date); int iTimeMinute = TimeMinute(Time_Date); iTimeDay--; if(iTimeDay==0) { iTimeMonth--; if(iTimeMonth==0) { iTimeYear--; iTimeMonth=12; } // Thirty days hath September... if(iTimeMonth==4||iTimeMonth==6||iTimeMonth==9||iTimeMonth==11) iTimeDay=30; // ...all the rest have thirty-one... if(iTimeMonth==1||iTimeMonth==3||iTimeMonth==5||iTimeMonth==7||iTimeMonth==8||iTimeMonth==10||iTimeMonth==12) iTimeDay=31; // ...except... if(iTimeMonth==2) if(MathMod(iTimeYear,4)==0) iTimeDay=29; else iTimeDay=28; } return(StrToTime(iTimeYear + "." + iTimeMonth + "." + iTimeDay + " " + iTimeHour + ":" + iTimeMinute)); } //==========================================================================================================</code>
<code>// [MT4 BREAKOUT BOX] #property indicator_chart_window extern string periodBegin = "00:00"; // Начало для расчета полосы extern string periodEnd = "03:55"; // Окончание расчета полосы extern string BoxEnd = "23:00"; // Время обрезания полосы extern color BoxHLColor = clrPowderBlue; extern color BoxPeriodColor = clrPaleGreen; extern int NumberOfDays = 50; //--- double PriceHigh[]; double PriceLow[]; //========================================================================================================== int init() { SetIndexBuffer(0,PriceHigh); SetIndexBuffer(1,PriceLow); return(0); } //========================================================================================================== int deinit() { string TradeDate; for(int i=ObjectsTotal(); i>=0;i--) { TradeDate=ObjectName(i); if(StringFind(TradeDate,"Box",0)==0) ObjectDelete(TradeDate); } return(0); } //========================================================================================================== int start() { datetime TradeDate=TimeCurrent(); if(Period()<=60) { for (int i=0; i<NumberOfDays; i++) { DrawObjects(TradeDate,"BoxHighLow " +TimeToStr(TradeDate,TIME_DATE),periodBegin,periodEnd,BoxEnd,BoxHLColor,0,1); DrawObjects(TradeDate,"Box Period "+TimeToStr(TradeDate,TIME_DATE),periodBegin,periodEnd,periodEnd,BoxPeriodColor,0,2); TradeDate=decrementTradeDate(TradeDate); while (TimeDayOfWeek(TradeDate)>5) TradeDate=decrementTradeDate(TradeDate); } } return(0); } //========================================================================================================== void DrawObjects(datetime dtTradeDate,string sObjName,string sTimeBegin,string sTimeEnd,string sTimeObjEnd,color cObjColor,int iOffSet,int iForm) { datetime dtTimeBegin,dtTimeEnd,dtTimeObjEnd; double dPriceHigh,dPriceLow; int iBarBegin,iBarEnd; dtTimeBegin = StrToTime(TimeToStr(dtTradeDate,TIME_DATE)+" "+sTimeBegin); dtTimeEnd = StrToTime(TimeToStr(dtTradeDate,TIME_DATE)+" "+sTimeEnd); dtTimeObjEnd = StrToTime(TimeToStr(dtTradeDate,TIME_DATE)+" "+sTimeObjEnd); iBarBegin=iBarShift(NULL,0,dtTimeBegin); iBarEnd=iBarShift(NULL,0,dtTimeEnd); dPriceHigh =High[Highest(NULL,0,MODE_HIGH,iBarBegin-iBarEnd+1,iBarEnd)]; PriceHigh[iBarEnd]=dPriceHigh; dPriceLow = Low [Lowest (NULL,0,MODE_LOW, iBarBegin-iBarEnd+1,iBarEnd)]; PriceLow[iBarEnd]=dPriceLow; //========================================================================================================== ObjectCreate(sObjName,OBJ_RECTANGLE,0,0,0,0,0); ObjectSet(sObjName,OBJPROP_TIME1,dtTimeBegin); ObjectSet(sObjName,OBJPROP_TIME2,dtTimeObjEnd); if(iForm==1) // Бокс до конца { ObjectSet(sObjName,OBJPROP_PRICE1,dPriceHigh); ObjectSet(sObjName,OBJPROP_PRICE2,dPriceLow); ObjectSet(sObjName,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(sObjName,OBJPROP_COLOR,cObjColor); ObjectSet(sObjName,OBJPROP_BACK,True); } if(iForm==2) // Бокс на участке { ObjectSet(sObjName,OBJPROP_PRICE1,dPriceHigh+iOffSet*Point); ObjectSet(sObjName,OBJPROP_PRICE2,dPriceLow-iOffSet*Point); ObjectSet(sObjName,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(sObjName,OBJPROP_COLOR,cObjColor); ObjectSet(sObjName,OBJPROP_WIDTH,1); ObjectSet(sObjName,OBJPROP_BACK,true); } } //========================================================================================================== datetime decrementTradeDate (datetime Time_Date) { int iTimeYear = TimeYear(Time_Date); int iTimeMonth = TimeMonth(Time_Date); int iTimeDay = TimeDay(Time_Date); int iTimeHour = TimeHour(Time_Date); int iTimeMinute = TimeMinute(Time_Date); iTimeDay--; if(iTimeDay==0) { iTimeMonth--; if(iTimeMonth==0) { iTimeYear--; iTimeMonth=12; } // Thirty days hath September... if(iTimeMonth==4||iTimeMonth==6||iTimeMonth==9||iTimeMonth==11) iTimeDay=30; // ...all the rest have thirty-one... if(iTimeMonth==1||iTimeMonth==3||iTimeMonth==5||iTimeMonth==7||iTimeMonth==8||iTimeMonth==10||iTimeMonth==12) iTimeDay=31; // ...except... if(iTimeMonth==2) if(MathMod(iTimeYear,4)==0) iTimeDay=29; else iTimeDay=28; } return(StrToTime(iTimeYear + "." + iTimeMonth + "." + iTimeDay + " " + iTimeHour + ":" + iTimeMinute)); } //==========================================================================================================</code>
kvashnin007