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

Рейтинг 2089



РЕКОМЕНДУЮ



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

Здравствуйте программисты помогите пожалуйста доработать советник. Мне нужно добавить код в советник чтобы увеличивался Take Profit и стоп лосс, желательно в 1.5 раза. Если уже есть такое дайте ссылку. Заранее благодарен.
  • 0
  • Просмотров: 3007
  • 23 октября 2015, 12:01
  • laban
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Нужно смотреть код советника и подробнее описать алгоритм увеличения стопов.
avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 23 октября 2015, 13:27
+
0
extern double StopLoss = 20;
extern double TakeProfit = 20;
extern int Hour_Start =8;
extern int Hour_Stop =17;
extern double Ma1 = 9;
extern double Ma2 = 22;
extern double Lots = 0.01;

bool b=true, s=true;

//+------------------------------------------------------------------+
int start()
{
//---- go trading only for first tiks of new bar
if(Volume[0]<1 && Volume[0]>10 ) return;
//----
int p=0;
//---- get Indicatorrs
double ma1=iMA(NULL,0,Ma1,0,MODE_EMA,PRICE_CLOSE,1);
double ma2=iMA(NULL,0,Ma2,0,MODE_EMA,PRICE_CLOSE,1);
//----

for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
}
}
//---- buy
if(ma1>ma2 && b && p<1)
{
if( Hour()>=Hour_Start && Hour()<Hour_Stop )
{
OrderSend(Symbol(),OP_BUY,Lots(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
b=false;
s=true;
}
}
//---- sell
if(ma1<ma2 && s && p<1)
{
if( Hour()>=Hour_Start && Hour()<Hour_Stop )
{
OrderSend(Symbol(),OP_SELL,Lots(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red );
b=true;
s=false;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
double Lots()
{
double Lot = Lots;
int total = OrdersHistoryTotal();
for (int i = 0; i < total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol()== Symbol() && OrderMagicNumber() == MAGIC)
{
if (OrderProfit() > 0)
{
Lot=Lots;
}
else
{
Lot=OrderLots() *2;
}
}
}
return(Lot);
}
//+------------------------------------------------------------------+StopLoss
avatar

  2  laban Автор Сообщений: 16

  • 26 октября 2015, 09:17
+
0
В конце добалвена функция мартингейла. но хотелось бы что бы мартингейл работал не на лоте а увеличивался в 2 раза Стоп лосс и Таке профит.
Алгоритм 1)если по истории профит меньше 0 то увеличиваем СЛ и ТП в два разе.
avatar

  2  laban Автор Сообщений: 16

  • 26 октября 2015, 09:22
+
0
Сейчас посмотрю что можно сделать.
avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 11:06
+
0
Данный код увеличит стоп в 2 раза в случае получения убытка:




//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
extern int StopLoss=20;
extern int TakeProfit=20;
extern int Hour_Start=8;
extern int Hour_Stop =17;
extern int Ma1 = 9;
extern int Ma2 = 22;
extern double Lots=0.01;
extern int Magic=8;

int mode=0;
bool b=true,s=true;
double stop=0,take=0;
//+------------------------------------------------------------------+
void OnTick()
  {
//---- 
   int p=0,r=0;
//---- get Indicatorrs 
   double ma1=iMA(NULL,0,Ma1,0,MODE_EMA,PRICE_CLOSE,1);
   double ma2=iMA(NULL,0,Ma2,0,MODE_EMA,PRICE_CLOSE,1);
//----

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        }
     }

//---- buy 
   if(ma1>ma2 && b && p<1)
     {
      if(Hour()>=Hour_Start && Hour()<Hour_Stop)
        {
         r=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",Magic,0,Blue);
         b=false;
         s=true;
        }
     }

//---- sell 
   if(ma1<ma2 && s && p<1)
     {
      if(Hour()>=Hour_Start && Hour()<Hour_Stop)
        {
         r=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",Magic,0,Red);
         b=true;
         s=false;
        }
     }

   if(p>0 && mode<1) Stop();
   if(p<1) mode=0;
//----
   return;
  }
//+------------------------------------------------------------------+
void StopMode()
  {
   bool m;
   double sl=0,tp=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-StopLoss*Point,OrderTakeProfit()+TakeProfit*Point,0,Yellow);
               return;
              }

            if(OrderType()==OP_SELL)
              {
               m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+StopLoss*Point,OrderTakeProfit()-TakeProfit*Point,0,Yellow);
               return;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void Stop()
  {
   bool sel=OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);
   if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
     {
      if(OrderProfit()<0)
        {
         StopMode();
         mode++;
        }
     }
   return;
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 11:46
+
0
Спасибо большое но еще одна просьба увеличить как стоп лосс так же и тэйк профит. и если ордер сработал по тэйку то не важно этот ордер в покупку или в продажу чтобы значение StoppLoss и TakeProfit возвращались в первоначальные.Так же хотелось бы всунуть обратно функцию мартингейла на лот но чтобы он умножал не на 2 а на 1.5. пробовал вставить эту же функцию но при срабатывании профита. лот модифицируется и ставит лот последнего сработанного ордера. и потом опять увеличивается. извиняюсь за назойливость. но заранее благодарен.
avatar

  2  laban Автор Сообщений: 16

  • 26 октября 2015, 14:27
+
0
пробовал вставить эту же функцию но при срабатывании профита. лот модифицируется и ставит лот последнего сработанного ордера.

Если вы владеете хотя бы начальными навыками мкл, то можете сделать все самостоятельно. На мой взгляд, вы просто не хотите думать.
avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 15:05
+
0
я не очень обладаю навыками так поверхностно. и уже 3 часа думаю.
последняя моя думка если я правильно понимаю вот такая
добаляю
void Stop()
{
bool sel=OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()<0)
{
Lots=OrderLots() *1.5;
StopMode();
mode++;
}
if(OrderProfit()>0)
{
Lots= Lots;
}
}
return;
}
и еще что то надо обнулить m но как не понимаю. что бы переменная m не срабатывала. но где ее всунуть тоже не понимаю

Редактирован: 26 октября 2015, 15:17
avatar

  2  laban Автор Сообщений: 16

  • 26 октября 2015, 15:15
+
0
Для вставки кода пользуйтесь тегами
avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 15:20
+
0
У меня пока реализован такой рабочий вариант:


//+------------------------------------------------------------------+
//|                                                        Laban.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

extern int StopLoss=20;
extern int TakeProfit=20;
extern int Hour_Start=8;
extern int Hour_Stop =17;
extern int Ma1 = 9;
extern int Ma2 = 22;
extern double Lots=0.01;
extern double KLot=1.5;
extern double MaxLot=5;
extern int Magic=8;

int mode=0;
bool b=true,s=true;
double stop=0,take=0;
//+------------------------------------------------------------------+
void OnTick()
  {
//---- 
   int p=0,r=0;
//---- get Indicatorrs 
   double ma1=iMA(NULL,0,Ma1,0,MODE_EMA,PRICE_CLOSE,1);
   double ma2=iMA(NULL,0,Ma2,0,MODE_EMA,PRICE_CLOSE,1);
//----

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        }
     }

//---- buy 
   if(ma1>ma2 && b && p<1)
     {
      if(Hour()>=Hour_Start && Hour()<Hour_Stop)
        {
         r=OrderSend(Symbol(),OP_BUY,Lot(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",Magic,0,Blue);
         b=false;
         s=true;
        }
     }

//---- sell 
   if(ma1<ma2 && s && p<1)
     {
      if(Hour()>=Hour_Start && Hour()<Hour_Stop)
        {
         r=OrderSend(Symbol(),OP_SELL,Lot(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",Magic,0,Red);
         b=true;
         s=false;
        }
     }

   if(p>0 && mode<1) Stop();
   if(p<1) mode=0;
//----
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=0,tp=0,sl=0;
   if(OrdersHistoryTotal()==0)
     {
      lot=Lots;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         lot=Lots;
        }
      if(OrderProfit()<0)
        {
         lot=OrderLots()*KLot;
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
void StopMode()
  {
   bool m;
   double sl=0,tp=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-StopLoss*Point,OrderTakeProfit()+TakeProfit*Point,0,Yellow);
               return;
              }

            if(OrderType()==OP_SELL)
              {
               m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+StopLoss*Point,OrderTakeProfit()-TakeProfit*Point,0,Yellow);
               return;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void Stop()
  {
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()<0)
           {
            StopMode();
            mode++;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 15:50
+
0
Спасибо большое будем тестить и оптимизировать.
avatar

  2  laban Автор Сообщений: 16

  • 26 октября 2015, 15:57
+
0
А вот это код увеличит стопы пропорционально увеличению лота многократно, в отличие от первого варианта. Дает за 10 лет по 50% при просадке 40.
www.opentraders.ru/downloads/906/




//+------------------------------------------------------------------+
//|                                                        Laban.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

extern int StopLoss=200;
extern int TakeProfit=200;
extern int Slip=20;
extern int Hour_Start=8;
extern int Hour_Stop =17;
extern int Ma1 = 9;
extern int Ma2 = 22;
extern double Lots=0.01;
extern double KLot=2;
extern double KStop=2;
extern double MaxLot=5;
extern int Magic=8;

int mode=0;
bool b=true,s=true;
double stop=0,take=0;
//+------------------------------------------------------------------+
void OnTick()
  {
//---- 
   int p=0,r=0;
//---- get Indicatorrs 
   double ma1=iMA(NULL,0,Ma1,0,MODE_EMA,PRICE_CLOSE,1);
   double ma2=iMA(NULL,0,Ma2,0,MODE_EMA,PRICE_CLOSE,1);
//----

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        }
     }

//---- buy 
   if(ma1>ma2 && b && p<1)
     {
      if(Hour()>=Hour_Start && Hour()<Hour_Stop)
        {
         r=OrderSend(Symbol(),OP_BUY,Lot(),Ask,3,Ask-stop*Point,Ask+take*Point,"",Magic,0,Blue);
         b=false;
         s=true;
        }
     }

//---- sell 
   if(ma1<ma2 && s && p<1)
     {
      if(Hour()>=Hour_Start && Hour()<Hour_Stop)
        {
         r=OrderSend(Symbol(),OP_SELL,Lot(),Bid,3,Bid+stop*Point,Bid-take*Point,"",Magic,0,Red);
         b=true;
         s=false;
        }
     }

   Comment("\n stop: ",stop,"\n take: ",take);
//----
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=0;
   if(OrdersHistoryTotal()==0)
     {
      lot=Lots;
      take=TakeProfit;
      stop=StopLoss;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         lot=Lots;
         take=TakeProfit;
         stop=StopLoss;
        }
      if(OrderProfit()<0)
        {
         lot=OrderLots()*KLot;
         take=MathAbs((OrderOpenPrice()-OrderTakeProfit())/Point)*KStop;
         stop=MathAbs((OrderOpenPrice()-OrderStopLoss())/Point)*KStop;
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 16:29
+
0
Осталось только советнику увеличивать периоды МА :D 
avatar

  14  beton2011 Сообщений: 895

  • 26 октября 2015, 18:33
+
0
Осталось только советнику увеличивать периоды МА  

Да да, про таймфрейм еще не забудь! :D 
avatar

  34  AM2 Сообщений: 15889 - Андрей

  • 26 октября 2015, 19:09
+
0
еще более благодарен по этой торговой системе работаю более полугода, но на разных индикаторах MACD. RSI и MA. и в разных брокерах. поэтому и выучил поверхностно МКЛ. из разных советников брал куски кода и получил советник полуавтомат при достигаемой прибыли выключал советник на отдельной паре вручную. на три брокера и на 5 валютных парах каждая трудновато уследить. кстати давал не плохой результат. Сейчас будет на много легче. протестирую проработаю. извиняюсь если еще раз обращусь. но если все пойдет как положено профитом поделимся.
avatar

  2  laban Автор Сообщений: 16

  • 26 октября 2015, 22:44
+
0
Aндрей если возможно можно еще раз обратиться. по этому же советнику. торгует отлично. и ставлю советник на 8 пар. Выдерживает просадку. Практика показывает что в профит выхожу на 4 — 5 максимум на 10 сделки подряд (так как stoploss ставлю в 2 раза меньше takeprofita), при увеличеном KLot. хотелось бы при сигнале на бай открывались ордер и в бай и в шелл. с заданным take и stop, так же само и при сигнале на шелл чтобы открывались на бай и на шелл. остальное оставить так же как и есть. Закрываться они будут одновременно, при таком раскладе стопы мы превращаем в 25% прибыли от ожидаемой позиции
Редактирован: 21 января 2016, 11:59
avatar

  2  laban Автор Сообщений: 16

  • 24 декабря 2015, 19:16

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