//+------------------------------------------------------------------+
//| 4-7 GMT Breakout.mq4 |
//| Copyright © 2009. |
//| http://strategy4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009."
#property link "http://strategy4you.ru"
#define h2s 3600
extern double Lot=1.0; // Размер лота для одного ордера(если 0 - расчитывается автоматически)
extern int MaxRisk=2; // % от свободных средств(для расчета лота)
extern int GMTShift=2; // Смещение времени брокера относительно GMT
extern string StartTime="04:00"; // Время начала интервала(время GMT)
extern string EndTime="06:59"; // Время окончания интервала(время GMT)
extern string DelTime="18:00"; // Час удаления отложенных ордеров(время GMT)
extern int TakeProfit=30; // Тейкпрофит(если 0 - то ширина коробки) для 1 ордера. Для 2 удваивается.
extern int StopLoss=0; // Стоплосс(если 0 - то ширина коробки)
extern int Delta=7; // Смещение для установки ордеров
extern int NoTrade=0; // Кол-во пунктов больше которого не торгуем(если 0 - торгуем всегда)
extern bool ShowWarn=true; // Выводить пользователю предупреждения
extern int Magic = 91006; // Magic
string StrategyName="4-7 GMT Breakout";
string error;
double h=0;
double l=0;
datetime d=0;
//+------------------------------------------------------------------+
int init()
{if(!IsTradeAllowed()) return(INIT_FAILED);
if(TakeProfit!=0 && TakeProfit<MarketInfo(Symbol(),MODE_STOPLEVEL))
{Alert("Тейкпрофит меньше разрешенного борокером!");return(INIT_FAILED);}
if(StopLoss!=0 && StopLoss<MarketInfo(Symbol(),MODE_STOPLEVEL))
{Alert("Стоплосс меньше разрешенного борокером!"); return(INIT_FAILED);}
if(Lot!=0 && Lot<MarketInfo(Symbol(),MODE_MINLOT))
{Alert("Лот меньше разрешенного брокером!"); return(INIT_FAILED);}
if(Lot!=0 && Lot>MarketInfo(Symbol(),MODE_MAXLOT))
{Alert("Лот больше разрешенного брокером!"); return(INIT_FAILED);}
if(Lot==0 && MaxRisk<1)
{Alert("Неправильно задан % от свободных средств для расчета лота!"); return(INIT_FAILED);}
if(Lot==0 && MaxRisk>100)
{Alert("Неправильно задан % от свободных средств для расчета лота!"); return(INIT_FAILED);}
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
int deinit() {Comment("");return(0);}
//+------------------------------------------------------------------+
int start()
{
if(DayOfWeek()==0 || DayOfWeek()==6) return(0); // в выходные не работаем
if(!IsTradeAllowed()) return(0); // пропустим тик если терминал занят
double mLot=Lot;
if(Lot==0.0) mLot=GetOptimalLot(MaxRisk);
double a=NormalizeDouble(Ask,Digits);
double b=NormalizeDouble(Bid,Digits);
//...подсчет ордеров
int oBuy=0,oSell=0,sBuy=0,sSell=0;
for(int i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(OrderType()==OP_BUY) oBuy++;
if(OrderType()==OP_SELL) oSell++;
if(OrderType()==OP_BUYSTOP) sBuy++;
if(OrderType()==OP_SELLSTOP) sSell++;}
//...Удалим не сработавшие отложки если есть и перенесем в безубыток
if(oBuy+oSell+sBuy+sSell>0)
for(i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
if(StrToTime(DelTime+":00")+GMTShift*h2s<=TimeCurrent()) DelOrder();
if(OrderType()==OP_BUY && oBuy==1 && OrderOpenPrice()>OrderStopLoss()+2*Point)
EditOrder(OrderOpenPrice(),OrderTakeProfit(),OrderOpenPrice());
if(OrderType()==OP_SELL && oSell==1 && OrderOpenPrice()<OrderStopLoss()-2*Point)
EditOrder(OrderOpenPrice(),OrderTakeProfit(),OrderOpenPrice());}
//...проверка что сегодня уже торговали
if(d==TimeDay(TimeCurrent())) return(0);
//...расчет коробки
if(TimeCurrent()<StrToTime(StartTime+":00")+GMTShift*h2s) return(0);
int sBar=iBarShift(NULL,0,StrToTime(StartTime+":00")+GMTShift*h2s);
int eBar=iBarShift(NULL,0,StrToTime(EndTime+":59")+GMTShift*h2s);
int cBar=sBar-eBar+1;
h=NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,cBar,eBar)],Digits);
l=NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,cBar,eBar)],Digits);
int box=(h-l)*MathPow(10,Digits);
//...проверим размер коробки
if(NoTrade!=0 && box>NoTrade)
{error="Размер коробки: "+box+" больше разрешенного: "+NoTrade+"! Не торгуем.";
if(ShowWarn) Alert(error);
Print(error);
d=TimeDay(TimeCurrent());
return(0);}
//...наступило время Ч?
if(TimeCurrent()<=StrToTime(EndTime+":59")+GMTShift*h2s) return(0);
//...Выставим отложенные ордера
if(oBuy+oSell+sBuy+sSell==0 && a<h && b>l)
{double level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
if((h-a)<level)
{error="Цена слишком близко от верхнего уровня! Верхний уровень увеличен.";
if(ShowWarn) Alert(error);
Print(error);
h=a+level+2*Point;}
if((b-l)<level)
{error="Цена слишком близко от нижнего уровня! Нижний уровень уменьшен.";
if(ShowWarn) Alert(error);
Print(error);
l=b-level-2*Point;}
double bp=NormalizeDouble(h+Delta*Point,Digits);
double sp=NormalizeDouble(l-Delta*Point,Digits);
double TP=0,SL=0;
if(StopLoss>0) SL=StopLoss*Point; else SL=h-l;
if(TakeProfit>0) TP=TakeProfit*Point; else TP=h-l;
if(SL<level)
{error="Цена слишком близко от уровня Стоплосса! Уровень Стоплосса увеличен.";
if(ShowWarn) Alert(error);
Print(error);
SL=level;}
if(TP<level)
{error="Цена слишком близко от уровня Профита! Уровень Профита увеличен.";
if(ShowWarn) Alert(error);
Print(error);
TP=level;}
h=NormalizeDouble(h,Digits);
l=NormalizeDouble(l,Digits);
NewOrder(OP_BUYSTOP,mLot,bp,bp+TP,h-SL);
NewOrder(OP_BUYSTOP,mLot,bp,bp+TP*2,h-SL);
NewOrder(OP_SELLSTOP,mLot,sp,sp-TP,l+SL);
NewOrder(OP_SELLSTOP,mLot,sp,sp-TP*2,l+SL);
d=TimeDay(TimeCurrent());
}
//...конец
return(0);}
//+------------------------------------------------------------------+
int NewOrder(int Cmd,double lot,double pr,double tp=0,double sl=0)
{int tick=0;
for(int er=0;er<3;er++)
{while(!IsTradeAllowed()) Sleep(100);
tick=OrderSend(Symbol(),Cmd,lot,pr,3,sl,tp,StrategyName,Magic,0,CLR_NONE);
if(tick>0) break;
Print("#",OrderTicket()," Error: ",GetLastError()," Function: NewOrder(",Cmd,",",lot,",",pr,",",tp,",",sl,") №",er);
Sleep(1000);}
return(tick);}
//+------------------------------------------------------------------+
void EditOrder(double pr,double tp,double sl)
{for(int er=0;er<3;er++)
{while(!IsTradeAllowed()) Sleep(100);
if(OrderModify(OrderTicket(),pr,sl,tp,0,CLR_NONE)) break;
Print("#",OrderTicket()," Error: ",GetLastError()," Function: EditOrder(",pr,",",tp,",",sl,") №",er);
Sleep(1000);}}
//+------------------------------------------------------------------+
void DelOrder()
{for(int er=0;er<3;er++)
{while(!IsTradeAllowed()) Sleep(100);
if(OrderDelete(OrderTicket(),CLR_NONE)) break;
Print("#",OrderTicket()," Error: ",GetLastError()," Function: DelOrder() №",er);
Sleep(1000);}}
//+------------------------------------------------------------------+
double NormLot(double lot)
{double Min_Lot=MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot=MarketInfo(Symbol(),MODE_MAXLOT);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
int DigLot =0;
if(Step<0.1) DigLot=2;
if(Step>=0.1) DigLot=1;
if(Step>=1) DigLot=0;
if(lot<Min_Lot) lot=Min_Lot;
if(lot>Max_Lot) lot=Max_Lot;
return(NormalizeDouble(lot,DigLot));}
//+------------------------------------------------------------------+
double GetOptimalLot(int Percent)
{double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;
return(NormLot(Lots_New));}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 4-7 GMT Breakout.mq4 |
//| Copyright © 2009. |
//| http://strategy4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009."
#property link "http://strategy4you.ru"
#define h2s 3600
extern double Lot=1.0; // Размер лота для одного ордера(если 0 - расчитывается автоматически)
extern int MaxRisk=2; // % от свободных средств(для расчета лота)
extern int GMTShift=2; // Смещение времени брокера относительно GMT
extern string StartTime="04:00"; // Время начала интервала(время GMT)
extern string EndTime="06:59"; // Время окончания интервала(время GMT)
extern string DelTime="18:00"; // Час удаления отложенных ордеров(время GMT)
extern int TakeProfit=30; // Тейкпрофит(если 0 - то ширина коробки) для 1 ордера. Для 2 удваивается.
extern int StopLoss=0; // Стоплосс(если 0 - то ширина коробки)
extern int Delta=7; // Смещение для установки ордеров
extern int NoTrade=0; // Кол-во пунктов больше которого не торгуем(если 0 - торгуем всегда)
extern bool ShowWarn=true; // Выводить пользователю предупреждения
extern int Magic = 91006; // Magic
string StrategyName="4-7 GMT Breakout";
string error;
double h=0;
double l=0;
datetime d=0;
//+------------------------------------------------------------------+
int init()
{if(!IsTradeAllowed()) return(INIT_FAILED);
if(TakeProfit!=0 && TakeProfit<MarketInfo(Symbol(),MODE_STOPLEVEL))
{Alert("Тейкпрофит меньше разрешенного борокером!");return(INIT_FAILED);}
if(StopLoss!=0 && StopLoss<MarketInfo(Symbol(),MODE_STOPLEVEL))
{Alert("Стоплосс меньше разрешенного борокером!"); return(INIT_FAILED);}
if(Lot!=0 && Lot<MarketInfo(Symbol(),MODE_MINLOT))
{Alert("Лот меньше разрешенного брокером!"); return(INIT_FAILED);}
if(Lot!=0 && Lot>MarketInfo(Symbol(),MODE_MAXLOT))
{Alert("Лот больше разрешенного брокером!"); return(INIT_FAILED);}
if(Lot==0 && MaxRisk<1)
{Alert("Неправильно задан % от свободных средств для расчета лота!"); return(INIT_FAILED);}
if(Lot==0 && MaxRisk>100)
{Alert("Неправильно задан % от свободных средств для расчета лота!"); return(INIT_FAILED);}
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
int deinit() {Comment("");return(0);}
//+------------------------------------------------------------------+
int start()
{
if(DayOfWeek()==0 || DayOfWeek()==6) return(0); // в выходные не работаем
if(!IsTradeAllowed()) return(0); // пропустим тик если терминал занят
double mLot=Lot;
if(Lot==0.0) mLot=GetOptimalLot(MaxRisk);
double a=NormalizeDouble(Ask,Digits);
double b=NormalizeDouble(Bid,Digits);
//...подсчет ордеров
int oBuy=0,oSell=0,sBuy=0,sSell=0;
for(int i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(OrderType()==OP_BUY) oBuy++;
if(OrderType()==OP_SELL) oSell++;
if(OrderType()==OP_BUYSTOP) sBuy++;
if(OrderType()==OP_SELLSTOP) sSell++;}
//...Удалим не сработавшие отложки если есть и перенесем в безубыток
if(oBuy+oSell+sBuy+sSell>0)
for(i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
if(StrToTime(DelTime+":00")+GMTShift*h2s<=TimeCurrent()) DelOrder();
if(OrderType()==OP_BUY && oBuy==1 && OrderOpenPrice()>OrderStopLoss()+2*Point)
EditOrder(OrderOpenPrice(),OrderTakeProfit(),OrderOpenPrice());
if(OrderType()==OP_SELL && oSell==1 && OrderOpenPrice()<OrderStopLoss()-2*Point)
EditOrder(OrderOpenPrice(),OrderTakeProfit(),OrderOpenPrice());}
//...проверка что сегодня уже торговали
if(d==TimeDay(TimeCurrent())) return(0);
//...расчет коробки
if(TimeCurrent()<StrToTime(StartTime+":00")+GMTShift*h2s) return(0);
int sBar=iBarShift(NULL,0,StrToTime(StartTime+":00")+GMTShift*h2s);
int eBar=iBarShift(NULL,0,StrToTime(EndTime+":59")+GMTShift*h2s);
int cBar=sBar-eBar+1;
h=NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,cBar,eBar)],Digits);
l=NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,cBar,eBar)],Digits);
int box=(h-l)*MathPow(10,Digits);
//...проверим размер коробки
if(NoTrade!=0 && box>NoTrade)
{error="Размер коробки: "+box+" больше разрешенного: "+NoTrade+"! Не торгуем.";
if(ShowWarn) Alert(error);
Print(error);
d=TimeDay(TimeCurrent());
return(0);}
//...наступило время Ч?
if(TimeCurrent()<=StrToTime(EndTime+":59")+GMTShift*h2s) return(0);
//...Выставим отложенные ордера
if(oBuy+oSell+sBuy+sSell==0 && a<h && b>l)
{double level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
if((h-a)<level)
{error="Цена слишком близко от верхнего уровня! Верхний уровень увеличен.";
if(ShowWarn) Alert(error);
Print(error);
h=a+level+2*Point;}
if((b-l)<level)
{error="Цена слишком близко от нижнего уровня! Нижний уровень уменьшен.";
if(ShowWarn) Alert(error);
Print(error);
l=b-level-2*Point;}
double bp=NormalizeDouble(h+Delta*Point,Digits);
double sp=NormalizeDouble(l-Delta*Point,Digits);
double TP=0,SL=0;
if(StopLoss>0) SL=StopLoss*Point; else SL=h-l;
if(TakeProfit>0) TP=TakeProfit*Point; else TP=h-l;
if(SL<level)
{error="Цена слишком близко от уровня Стоплосса! Уровень Стоплосса увеличен.";
if(ShowWarn) Alert(error);
Print(error);
SL=level;}
if(TP<level)
{error="Цена слишком близко от уровня Профита! Уровень Профита увеличен.";
if(ShowWarn) Alert(error);
Print(error);
TP=level;}
h=NormalizeDouble(h,Digits);
l=NormalizeDouble(l,Digits);
NewOrder(OP_BUYSTOP,mLot,bp,h+TP,h-SL);
NewOrder(OP_BUYSTOP,mLot,bp,h+TP*2,h-SL);
NewOrder(OP_SELLSTOP,mLot,sp,l-TP,l+SL);
NewOrder(OP_SELLSTOP,mLot,sp,l-TP*2,l+SL);
d=TimeDay(TimeCurrent());
}
//...конец
return(0);}
//+------------------------------------------------------------------+
int NewOrder(int Cmd,double lot,double pr,double tp=0,double sl=0)
{int tick=0;
for(int er=0;er<3;er++)
{while(!IsTradeAllowed()) Sleep(100);
tick=OrderSend(Symbol(),Cmd,lot,pr,3,sl,tp,StrategyName,Magic,0,CLR_NONE);
if(tick>0) break;
Print("#",OrderTicket()," Error: ",GetLastError()," Function: NewOrder(",Cmd,",",lot,",",pr,",",tp,",",sl,") №",er);
Sleep(1000);}
return(tick);}
//+------------------------------------------------------------------+
void EditOrder(double pr,double tp,double sl)
{for(int er=0;er<3;er++)
{while(!IsTradeAllowed()) Sleep(100);
if(OrderModify(OrderTicket(),pr,sl,tp,0,CLR_NONE)) break;
Print("#",OrderTicket()," Error: ",GetLastError()," Function: EditOrder(",pr,",",tp,",",sl,") №",er);
Sleep(1000);}}
//+------------------------------------------------------------------+
void DelOrder()
{for(int er=0;er<3;er++)
{while(!IsTradeAllowed()) Sleep(100);
if(OrderDelete(OrderTicket(),CLR_NONE)) break;
Print("#",OrderTicket()," Error: ",GetLastError()," Function: DelOrder() №",er);
Sleep(1000);}}
//+------------------------------------------------------------------+
double NormLot(double lot)
{double Min_Lot=MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot=MarketInfo(Symbol(),MODE_MAXLOT);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
int DigLot =0;
if(Step<0.1) DigLot=2;
if(Step>=0.1) DigLot=1;
if(Step>=1) DigLot=0;
if(lot<Min_Lot) lot=Min_Lot;
if(lot>Max_Lot) lot=Max_Lot;
return(NormalizeDouble(lot,DigLot));}
//+------------------------------------------------------------------+
double GetOptimalLot(int Percent)
{double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;
return(NormLot(Lots_New));}
//+------------------------------------------------------------------+
_profit = _profit + OrderProfit()+OrderCommission()+OrderSwap();
Oxy