0
Внимательно почитайте: в архиве два советника
avatar

Oxy

  • 2 мая 2015, 11:28
+2
на кнопочку с субтитрами здесь нажать
avatar

Oxy

  • 1 мая 2015, 23:14
0
А смысл? Логика советника такая, что она все-равно ведет к сливу.
Поторгуйте руками на демо по этой логике и поймете сами, о чем речь.
P.S. 4-й вариант наступает тогда, когда от депозита мало что остается.
avatar

Oxy

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

Oxy

  • 1 мая 2015, 20:25
0
для MT4
нули в настройках индикатора убрать лишние
здесь описание, как он работает (с чего начинали): zakaz.opentraders.ru/24851.html
avatar

Oxy

  • 1 мая 2015, 20:23
0
Помню, эти советники от сюда еще: zakaz.opentraders.ru/24466.html
Тогда я поправляла, чтобы они работали не на всех парах, а на той, что установлены.
Не буду править эти чужие советники. Попробовала, после моих правок логика нарушается.
avatar

Oxy

  • 30 апреля 2015, 22:44
0
Автор данного топика просил именно для уровней 30 и 70, что и было реализовано.
avatar

Oxy

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

Oxy

  • 30 апреля 2015, 19:57
+1
только что обновила файл
лучше его скачать заново (название у файла не меняла, только у архива меняла)
avatar

Oxy

  • 30 апреля 2015, 17:36
0
anathem, я жду ответ в вашем топике
avatar

Oxy

  • 30 апреля 2015, 16:11
0
надеюсь, у вас параметр:
avatar

Oxy

  • 30 апреля 2015, 14:41
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

Oxy

  • 30 апреля 2015, 13:42
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

Oxy

  • 30 апреля 2015, 13:40
0
В архиве opentraders.ru/downloads/697/ два советника, так как я не уверена в корректной работе: Exp_AO_AC_SAR_martin_allSymbols
avatar

Oxy

  • 30 апреля 2015, 13:32
0
Тогда уберу параметр: «Максимальное количество изменений лота»
Устроит?
avatar

Oxy

  • 30 апреля 2015, 13:17
+1
вопрос — на одной паре должен работать или по всем смотреть позициям?
avatar

Oxy

  • 30 апреля 2015, 13:07
0
Я не буду править больше этот советник. Тем более, после последней его правки, я его тестировала и он у меня работал без сбоев.
Если вам так понравилась идея, то вы можете обратиться к другому специалисту — он вам или напишет на основе этой идеи советник с нуля или поправит/изменит этот.
avatar

Oxy

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

Oxy

  • 30 апреля 2015, 12:44
0
_profit = _profit + OrderProfit()+OrderCommission()+OrderSwap();
avatar

Oxy

  • 30 апреля 2015, 12:25