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

Рейтинг 2146



РЕКОМЕНДУЮ



Доработать советник

Доброго времени суток программистам.Прошу доработать советник:
В настройках есть параметры (Delta ), когда ставишь например (5), бай стоп выставляется на 5п выше коробки, соответственно СЛ подтягивается вверх от нижней границы коробки на 5п. Так вот хотелось бы, чтоб при параметрах СЛ (0) он был в нижней границе коробки, а если (5), то ниже коробки на 5п. Сел с точностью на оборот.
Вот сам файл:
GORA.mq4 (8 Kb)
Буду очень Вам благодарен *hi* 
  • 0
  • Просмотров: 2228
  • 1 мая 2015, 03:08
  • Kolesik
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Доработка Моих Граалей (часть 2)
29 апреля 2015
01 мая 2015

Брокер для ваших роботов, 15 лет на рынке

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

+
0
доработаю
avatar

  35  AM2 Сообщений: 16285 - Андрей

  • 1 мая 2015, 08:22
+
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;
    //при стопе = 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;}
    if(StopLoss>=0)
     {
      NewOrder(OP_BUYSTOP,mLot,bp,bp+TP,l-SL);
      NewOrder(OP_BUYSTOP,mLot,bp,bp+TP*2,l-SL);
     }
    //NewOrder(OP_BUYSTOP,mLot,bp,bp+TP,bp-SL);
    //NewOrder(OP_BUYSTOP,mLot,bp,bp+TP*2,bp-SL);
    if(StopLoss>=0) 
     {
      NewOrder(OP_SELLSTOP,mLot,sp,sp-TP,h+SL);
      NewOrder(OP_SELLSTOP,mLot,sp,sp-TP*2,h+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));}
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16285 - Андрей

  • 1 мая 2015, 08:56
+
+1
Файл в базе: www.opentraders.ru/downloads/702/

avatar

  35  AM2 Сообщений: 16285 - Андрей

  • 1 мая 2015, 11:17
+
0
Доброго времени суток AM2, спасибо за оперативность и работу.
avatar

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

  • 1 мая 2015, 12:14

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