Группа "Стол заказов MQL"

Рейтинг 2087



РЕКОМЕНДУЮ



Простой советник

Здравствуйте Ув.Oxy, прошу Вас создать советник по данной стратегии:
Советник торгует по пробитию временной коробки.В заданное время советник выставляет 2 Buy Stop в верху коробки и 2 Sell Stop в низу коробки, ставим равными лотами, стоп лос устанавливается на ширину коробки для Бай и Сел.
1.jpg (56 Kb)
После срабатывания например Бай Стоп открываются 2 ордера, 1й ТП задается в настройках а второй удваивается автоматически. После срабатывания 1го ТП второй переходит в безубыток, ели срабатывает 2й ТП сегодня в Бай уже не торгует.Остаются Сел стоп ордера, если до заданного времени ордера не сработали то они закрываются. Далее: если сработал 1й ТП сегодня то вторая ставка продолжает работать до тех пор пока сработает ТП или СЛ, может день, два, новые ордера не выставляются.
2.jpg (42 Kb)
В случае если на следующий день сработал ТП или СЛ и цена вернулась в дневную коробку, советник ставит ордера и продолжает работать дальше.
3.jpg (42 Kb)
параметры советника прилагаю:
Bezimyanniy.jpg (62 Kb)
4.jpg (27 Kb)
Нашел индикатор для формирования коробки, а может у Вас найдётся другой попроще я согласен:
BreakOut_PANCA_.mq4 (6 Kb)
Советник торгует или назначенным лотом или высчитывает в процентном отношении от свободных средств.
Думаю в прикреплённом файле (параметры советника )Вы всё поймёте.
  • +2
  • Просмотров: 5013
  • 26 апреля 2015, 11:14
  • Kolesik
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Alerts for candle body size MT4
Следующая запись в группе  
Советник - 555 -
26 апреля 2015
26 апреля 2015

Комментарии (22)

+
+1
Очень много похожих советников:
opentraders.ru/downloads/577/
opentraders.ru/downloads/581/
opentraders.ru/downloads/617/вот этот очень близок к теме. В нем вы можете задать сами временные параметры.
Редактирован: 26 апреля 2015, 22:21
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 26 апреля 2015, 22:18
+
0
Ув. Oxy а по моей стратегии вы можете написать советник :) 
avatar

  8  Kolesik Автор Сообщений: 94

  • 27 апреля 2015, 09:39
+
0
Чем отличается советник opentraders.ru/downloads/617/ от вашей стратегии? Опишите отличие и я напишу вам вашу логику.
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 27 апреля 2015, 11:48
+
0
Дело в том, что я тестировал советник привязанный к определённому ДЦ, он мне понравился и я решил попросить Вас написать такой же. Может мне скинуть файл MQL4, чем описывать различие между предложенным Вами советником?
avatar

  8  Kolesik Автор Сообщений: 94

  • 27 апреля 2015, 13:09
+
0
скидывайте, я посмотрю его
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 27 апреля 2015, 13:17
+
0
не пойму как вставить файл, может подскажите?
avatar

  8  Kolesik Автор Сообщений: 94

  • 27 апреля 2015, 13:22
+
0
Залить его на файлообменник:
www.opentraders.ru/downloads/
или сюда или в другое место.
И здесь в комментарии дать ссылку.
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 27 апреля 2015, 13:32
+
0
disk.yandex.ua/client/disk
название файла Жора
avatar

  8  Kolesik Автор Сообщений: 94

  • 27 апреля 2015, 13:38
+
0
так мне его не скачать :D 

вы мне на сам файл ссылку дайте
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 27 апреля 2015, 15:55
+
0
я наверно что-то не понимаю, вроде так
yadi.sk/d/4f__3UzDgHBzH
avatar

  8  Kolesik Автор Сообщений: 94

  • 27 апреля 2015, 19:06
+
0
Подправила файл, у меня на демо заработал.
//+------------------------------------------------------------------+
//|                                             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;}
    NewOrder(OP_BUYSTOP,mLot,bp,bp+TP,bp-SL);
    NewOrder(OP_BUYSTOP,mLot,bp,bp+TP*2,bp-SL);
    NewOrder(OP_SELLSTOP,mLot,sp,sp-TP,sp+SL);
    NewOrder(OP_SELLSTOP,mLot,sp,sp-TP*2,sp+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));}
//+------------------------------------------------------------------+

В программе MetaEditor в исходнике полностью замените код на этот и нажмите кнопку «компилировать»
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 27 апреля 2015, 20:46
+
0
на демо он работает, а на реале нет. Я попробую, затем отпишусь, Спасибо Oxy :) 
avatar

  8  Kolesik Автор Сообщений: 94

  • 27 апреля 2015, 22:11
+
0
Тот советник, который я скачала от вас — у меня работал только в тестере. На демо он у меня не работал. Я изменила код — заработал. На реале советники я не тестирую.
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 28 апреля 2015, 00:13
+
0
Спасибо Oxy всё работает как хотелось. Есть еще одна просьба, когда в настойках выставляется (Delta)например 5, то СЛ тоже смещается от края коробки на 5, а можно сделать так, чтоб СЛ всегда был по краям коробки.Заранее Благодарен за Вашу роботу *lalala* 
avatar

  8  Kolesik Автор Сообщений: 94

  • 30 апреля 2015, 11:20
+
0
ТП тоже смещается. Его смещать или нет?
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 30 апреля 2015, 12:44
+
0
Вот, чтобы TP и SL не смещались:
//+------------------------------------------------------------------+
//|                                             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));}
//+------------------------------------------------------------------+
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 30 апреля 2015, 13:40
+
0
Вот, чтобы только SL не смещался, TP будет смещаться:
//+------------------------------------------------------------------+
//|                                             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));}
//+------------------------------------------------------------------+
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 30 апреля 2015, 13:42
+
0
Прошу прощения, неправильно выразил мысль. СЛ если (0)то по краю коробки, а если например 5, то смещается на 5 от коробки.
avatar

  8  Kolesik Автор Сообщений: 94

  • 30 апреля 2015, 19:32
+
0
Не поняла вас
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 30 апреля 2015, 19:57
+
0
В настройках есть параметры (Delta ), когда ставишь например (5), бай стоп выставляется на 5п выше коробки, соответственно СЛ подтягивается вверх от нижней границы коробки на 5п. Так вот хотелось бы, чтоб при параметрах СЛ (0) он был в нижней границе коробки, а если (5), то ниже коробки на 5п.Сел с точностью на оборот.
avatar

  8  Kolesik Автор Сообщений: 94

  • 1 мая 2015, 02:04
+
0
рада, что вам помогли
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 1 мая 2015, 20:25
+
0
Я тоже очень рад, что АМ2 так быстро откликнулся.Вам ещё раз Спасибо*lalala* 
avatar

  8  Kolesik Автор Сообщений: 94

  • 2 мая 2015, 23:16

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари