beton2011

 
Уровень 14

  Моя торговля


График торгового счета beton2011


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

Рейтинг 2073



РЕКОМЕНДУЮ



Советник пробойник "Б-М"

Здравствуйте Андрей.

У меня появилась одна идея для создания советника. Буду благодарен, если вы возьметесь и реализуете эту идею в советник.

Советник работает только со стоповыми ордерами.

Условие для открытия сетки стоповых ордеров на покупку

Если прошлая свеча была бычья, на новой свече выставляются стоповые ордера на покупку.

Условие для открытия сетки стоповых ордеров на продажу

Если прошлая свеча была медвежья, на новой свече выставляются стоповые ордера на продажу.

Настройки советника

Расстояние от цены, для открытия сетки ордеров.

Расстояние между ордеров в сетки.

Увеличение лотов в сетке

Если скажем был открыт какой то ордер, тогда советник продолжает выставлять отложенные ордера дальше.

Закрываются открытые ордера, если откроется встречный ордер (замок).

Добавьте еще закрытие ордеров по профиту в валюте депозита.

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

Вроде как все.

Спасибо.
  • 0
  • Просмотров: 3306
  • 22 июня 2016, 10:18
  • beton2011
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Переделать сову. В ней ошибка фикса-входа.
Следующая запись в группе  
Скорость тренда
21 июня 2016
22 июня 2016

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

+
0
Сейчас буду смотреть.
avatar

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

  • 22 июня 2016, 10:32
+
0
Хорошо.

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

  14  beton2011 Автор Сообщений: 893

  • 22 июня 2016, 10:47
+
0
Уже встречал советника на эту тему, называется avtoforex. Все что описано — все делает. Единственное различие, входит по рынку маркетом, а не отложками, через определенное кол-во пунктов… если интересно вот автофорекс
avatar

  10  mihhail777 Сообщений: 159 - Михаил

  • 22 июня 2016, 10:48
+
0
Все:


//+------------------------------------------------------------------+
//|                                                       Grider.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2."
#property link      "http://www.forexsystems.biz"
#property version   "1.00"                                   
#property strict

//--- Inputs
extern double Lot          = 0.1;      // Trade volume
extern double KLot         = 1.3;      // Lot increase
extern double MaxLot       = 5;        // Maximum lot
extern int StopLoss        = 0;        // Order sroploss
extern int TakeProfit      = 0;        // Order takeprofit
extern int Profit          = 0;        // Querency Profit
extern int TrailingStop    = 0;        // Trailing stop
extern int TrailingStep    = 0;        // Trailing step
extern int Count           = 5;        // Orders count
extern int Expiration      = 55;       // The expiry of the order in hours
extern int Step            = 100;      // Order step
extern int Delta           = 100;      // Distance from the price
extern int Slip            = 3;        // Slippage
extern int StopLimit       = 0;        // 0-Stop 1-Limit
extern int ClosePos        = 0;        // 1-Close Positions
extern int Magic           = 123;      // Magic number

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!IsTradeAllowed())Alert("Allow the EA to trade!");
   if(!IsLibrariesAllowed())Alert("Allow DLL import!");
   if(!IsExpertEnabled()) Alert("Allow startup advisors!");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0,err=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots(type),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Ступенчатый трал               if(TrailingStop>0) Trailing();    |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   int err=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || (OrderType()>=0 && type==-1)) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Лот для усреднителя                                              |
//+------------------------------------------------------------------+
double Lots(int type)
  {
   double lots=Lot;
   lots=NormalizeDouble(Lot*MathPow(KLot,CountOrders(type)),2);
   if(lots>MaxLot)lots=Lot;
   return(lots);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type)
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TrailingStop>0) Trailing();
   
   if(t!=Time[0])
     {
      if(Open[1]<Close[1])
        {
         DelOrder(5);
         DelOrder(2);
         if(ClosePos>0) CloseAll();
         for(int i=1; i<=Count;i++)
           {
            if(StopLimit==0)PutOrder(4,Bid+Delta*Point+Step*Point*i);//buystop
            if(StopLimit==1)PutOrder(3,Bid+Delta*Point+Step*Point*i);//selllimit
           }
        }

      if(Open[1]>Close[1])
        {
         DelOrder(4);
         DelOrder(3);
         if(ClosePos>0) CloseAll();
         for(int i=1; i<=Count;i++)
           {
            if(StopLimit==0)PutOrder(5,Bid-Delta*Point-Step*Point*i);//sellstop
            if(StopLimit==1)PutOrder(2,Bid-Delta*Point-Step*Point*i);//buylimit
           }
        }
      t=Time[0];
     }
     
   if(AllProfit()>Profit && Profit>0) CloseAll();
   
   Comment("\n All Profit: ",AllProfit(-1),
           "\n Buy Profit:  ",AllProfit(0),
           "\n Sell Profit: ",AllProfit(1),
           "\n Buy Positions:  ",CountOrders(0),
           "\n Sell Positions: ",CountOrders(1),
           "\n All Positions:  ",CountOrders(0)+CountOrders(1));
  }
//+------------------------------------------------------------------+

avatar

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

  • 22 июня 2016, 10:56
+
0
Почти все правильно. Сейчас советник закрывает все ордера на новой свече. А надо чтоб рыночные ордера закрывались только когда будет встречный ордер. А отложенные ордера могут закрываться на каждой свече, или когда сменится свеча.
avatar

  14  beton2011 Автор Сообщений: 893

  • 22 июня 2016, 11:50
+
0
Закрытие рыночных ордеров, только когда откроется рыночный встречный ордер.
avatar

  14  beton2011 Автор Сообщений: 893

  • 22 июня 2016, 11:55
+
0
Сейчас разобрался немного. Все нормально в советнике, только сделайте пожалуйсто закрытие рыночных ордеров, если есть хоть один противоположный рыночный ордер. А еще, советник почему то останавливается в тестере через какое то время, и отключается, сейчас еще буду смотреть, почему он так делает.
avatar

  14  beton2011 Автор Сообщений: 893

  • 22 июня 2016, 13:56
+
0
Извините, давно не занимался тестированием советников. Я понял почему советник останавливался, я советник тестировал на 5-ти значных котировках. Сейчас нормально работает.

Осталось только сделать так, чтоб закрывались все ордера, когда есть замок между ордерами. Вы такое уже делали в одном моем заказе. Может даже я сам смогу это добавить.
avatar

  14  beton2011 Автор Сообщений: 893

  • 22 июня 2016, 14:20
+
0
Осталось только сделать так, чтоб закрывались все ордера, когда есть замок между ордерами.

Объясните этот момент максимально подробно со скринами.
avatar

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

  • 22 июня 2016, 18:42
+
0
Насколько я понял нужно что то вроде :) 




//+------------------------------------------------------------------+
//|                                                       Grider.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2."
#property link      "http://www.forexsystems.biz"
#property version   "1.00"                                   
#property strict

//--- Inputs
extern double Lot          = 0.1;      // Trade volume
extern double KLot         = 1.3;      // Lot increase
extern double MaxLot       = 5;        // Maximum lot
extern int StopLoss        = 0;        // Order sroploss
extern int TakeProfit      = 0;        // Order takeprofit
extern int Profit          = 0;        // Querency Profit
extern int TrailingStop    = 0;        // Trailing stop
extern int TrailingStep    = 0;        // Trailing step
extern int Count           = 5;        // Orders count
extern int Expiration      = 55;       // The expiry of the order in hours
extern int Step            = 100;      // Order step
extern int Delta           = 100;      // Distance from the price
extern int Slip            = 3;        // Slippage
extern int StopLimit       = 0;        // 0-Stop 1-Limit
extern int ClosePos        = 0;        // 1-Close Positions
extern int Magic           = 123;      // Magic number

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!IsTradeAllowed())Alert("Allow the EA to trade!");
   if(!IsLibrariesAllowed())Alert("Allow DLL import!");
   if(!IsExpertEnabled()) Alert("Allow startup advisors!");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0,err=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots(type),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Ступенчатый трал               if(TrailingStop>0) Trailing();    |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   int err=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || (OrderType()>=0 && type==-1)) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Лот для усреднителя                                              |
//+------------------------------------------------------------------+
double Lots(int type)
  {
   double lots=Lot;
   lots=NormalizeDouble(Lot*MathPow(KLot,CountOrders(type)),2);
   if(lots>MaxLot)lots=Lot;
   return(lots);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type)
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TrailingStop>0) Trailing();

   if(t!=Time[0])
     {
      if(Open[1]<Close[1])
        {
         DelOrder(5);
         DelOrder(2);

         for(int i=1; i<=Count;i++)
           {
            if(StopLimit==0)PutOrder(4,Bid+Delta*Point+Step*Point*i);//buystop
            if(StopLimit==1)PutOrder(3,Bid+Delta*Point+Step*Point*i);//selllimit
           }
        }

      if(Open[1]>Close[1])
        {
         DelOrder(4);
         DelOrder(3);

         for(int i=1; i<=Count;i++)
           {
            if(StopLimit==0)PutOrder(5,Bid-Delta*Point-Step*Point*i);//sellstop
            if(StopLimit==1)PutOrder(2,Bid-Delta*Point-Step*Point*i);//buylimit
           }
        }
      t=Time[0];
     }

   if(AllProfit()>Profit && Profit>0) CloseAll();
   if(ClosePos>0 && CountOrders(0)>0 && CountOrders(1)>0) CloseAll(0);
   if(ClosePos>0 && CountOrders(0)>0 && CountOrders(1)>0) CloseAll(1);

   Comment("\n All Profit: ",AllProfit(-1),
           "\n Buy Profit:  ",AllProfit(0),
           "\n Sell Profit: ",AllProfit(1),
           "\n Buy Positions:  ",CountOrders(0),
           "\n Sell Positions: ",CountOrders(1),
           "\n All Positions:  ",CountOrders(0)+CountOrders(1));
  }
//+------------------------------------------------------------------+

avatar

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

  • 22 июня 2016, 19:03
+
0
Я не могу понять. Пробовал с лимитными ордерами, вначале правильно закрывает а потом опять начинает наматывать ордера.

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

У вас на скрине все правильно, он так иногда делает а потом дальше наматывает ордера. Может проблема в подсчете ордеров, ну или в чем то там <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 

Вот я сделал скрин. На скрине видно, что есть открытые ордера на бай и на сэл, этого не должно быть.



Редактирован: 22 июня 2016, 20:40
avatar

  14  beton2011 Автор Сообщений: 893

  • 22 июня 2016, 20:39
+
0
Все понятно теперь, но это уже завтра :) 
avatar

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

  • 22 июня 2016, 21:15
+
0
avatar

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

  • 23 июня 2016, 08:03
+
0
По лимитным ордерам все работает правильно. По стоповым ордерам не работает.
avatar

  14  beton2011 Автор Сообщений: 893

  • 23 июня 2016, 10:25
+
0
Вечером буду смотреть.
avatar

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

  • 23 июня 2016, 12:16
+
0
Посмотрел со стоповыми тоже работает:

avatar

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

  • 23 июня 2016, 16:52
+
0
Можете дать настройки с которыми вы тестировали, а то, я че то запутался, наверно жара всему виной *???* 
avatar

  14  beton2011 Автор Сообщений: 893

  • 23 июня 2016, 17:58
+
0
по умолчанию все настройки.
avatar

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

  • 23 июня 2016, 18:07
+
0
Не не работает.

Вот скрин


avatar

  14  beton2011 Автор Сообщений: 893

  • 23 июня 2016, 18:31
+
0
Че то у меня перестал работать первый советник. Может эта путаница из за того что вы тестируете на 5-ти знаках, а я на 4-х знаках. Пробовал на 5-ть знаках, не работает.

Можете в топике выложить доработанный советник?
avatar

  14  beton2011 Автор Сообщений: 893

  • 23 июня 2016, 18:40
+
0
//+------------------------------------------------------------------+
//|                                                       Grider.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2."
#property link      "http://www.forexsystems.biz"
#property version   "1.00"                                   
#property strict

//--- Inputs
extern double Lot          = 0.1;      // Trade volume
extern double KLot         = 1.3;      // Lot increase
extern double MaxLot       = 5;        // Maximum lot
extern int StopLoss        = 0;        // Order sroploss
extern int TakeProfit      = 0;        // Order takeprofit
extern int Profit          = 0;        // Querency Profit
extern int TrailingStop    = 0;        // Trailing stop
extern int TrailingStep    = 0;        // Trailing step
extern int Count           = 5;        // Orders count
extern int Expiration      = 55;       // The expiry of the order in hours
extern int Step            = 100;      // Order step
extern int Delta           = 100;      // Distance from the price
extern int Slip            = 3;        // Slippage
extern int StopLimit       = 0;        // 0-Stop 1-Limit
extern int ClosePos        = 0;        // 1-Close Positions
extern int Magic           = 123;      // Magic number

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!IsTradeAllowed())Alert("Allow the EA to trade!");
   if(!IsLibrariesAllowed())Alert("Allow DLL import!");
   if(!IsExpertEnabled()) Alert("Allow startup advisors!");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0,err=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots(type),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Ступенчатый трал               if(TrailingStop>0) Trailing();    |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   int err=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || (OrderType()>=0 && type==-1)) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Лот для усреднителя                                              |
//+------------------------------------------------------------------+
double Lots(int type)
  {
   double lots=Lot;
   lots=NormalizeDouble(Lot*MathPow(KLot,CountOrders(type)),2);
   if(lots>MaxLot)lots=Lot;
   return(lots);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type)
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TrailingStop>0) Trailing();

   if(t!=Time[0])
     {
      if(Open[1]<Close[1])
        {
         DelOrder(5);
         DelOrder(2);

         for(int i=1; i<=Count;i++)
           {
            if(StopLimit==0)PutOrder(4,Bid+Delta*Point+Step*Point*i);//buystop
            if(StopLimit==1)PutOrder(3,Bid+Delta*Point+Step*Point*i);//selllimit
           }
        }

      if(Open[1]>Close[1])
        {
         DelOrder(4);
         DelOrder(3);

         for(int i=1; i<=Count;i++)
           {
            if(StopLimit==0)PutOrder(5,Bid-Delta*Point-Step*Point*i);//sellstop
            if(StopLimit==1)PutOrder(2,Bid-Delta*Point-Step*Point*i);//buylimit
           }
        }
      t=Time[0];
     }

   if(AllProfit()>Profit && Profit>0) CloseAll();
   if(ClosePos>0 && CountOrders(0)>0 && CountOrders(1)>0) CloseAll();

   Comment("\n All Profit: ",AllProfit(-1),
           "\n Buy Profit:  ",AllProfit(0),
           "\n Sell Profit: ",AllProfit(1),
           "\n Buy Positions:  ",CountOrders(0),
           "\n Sell Positions: ",CountOrders(1),
           "\n All Positions:  ",CountOrders(0)+CountOrders(1));
  }
//+------------------------------------------------------------------+
avatar

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

  • 23 июня 2016, 18:53
+
0
Ну вот, я протестировал этот код. Не работает закрытие при замке, что лимитные, что стоповые, не закрываются ордера.

Вот видно, это лимитные ордера



Вот стоповые


Редактирован: 23 июня 2016, 19:11
avatar

  14  beton2011 Автор Сообщений: 893

  • 23 июня 2016, 19:10
+
0
Я извиняюсь, появилась одна проблема с советником. Сегодня поставил на демо счет, заметил что, советник немного путается в ордерах. Если идут две свечи подряд в одну сторону, советник накладывает новую сетку на старую, а надо чтоб закрывал старую сетку и открывал новую. Посмотрите пожалуйсто.

И если можно, чтоб советник закрывал отложенные ордера, после закрытия ордеров по общему профиту, это тоже очень важно.

В тестере это тоже делает


Редактирован: 24 июня 2016, 21:55
avatar

  14  beton2011 Автор Сообщений: 893

  • 24 июня 2016, 21:38
+
0
установите время экспирации равное периоду, вы же кодер :) 
avatar

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

  • 25 июня 2016, 17:13
+
0
Установил, но проблема в том что, лоты сбиваются. Советник должен понимать, что, идут две подряд свечи в том же направлении, значит надо новую сетку каждую свечу, а сейчас он как бы продолжает начатое на первой свече, и лепит не понятно лоты. Экспирация работает.
avatar

  14  beton2011 Автор Сообщений: 893

  • 25 июня 2016, 19:20
+
0
вы же кодер


Да я сейчас на столько занят, не могу даже посмотреть код. Да и мозг сейчас не думает в этом направлении. Если можете, подправьте пожалуйста, то что я просил.
Редактирован: 25 июня 2016, 21:40
avatar

  14  beton2011 Автор Сообщений: 893

  • 25 июня 2016, 21:39
+
0
Вот теперь разобрался. Все работает хорошо.

Просто в настройках по умолчанию было выставлено закрытие ордеров «0» а надо «1».

Все, спасибо за работу.
avatar

  14  beton2011 Автор Сообщений: 893

  • 23 июня 2016, 19:57
+
0
и лепит не понятно лоты

лоты пропорционально количеству ордеров.
avatar

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

  • 26 июня 2016, 13:23
+
0
А может сделать экспирацию меньше чем один час, скажем чтоб экспирация была в минутах и ставить 59 минут. Просто сейчас эксперация позже чем выставляется новая сетка, вот по этом советник может путаться и как бы продолжает начатое на новой свече.
avatar

  14  beton2011 Автор Сообщений: 893

  • 26 июня 2016, 18:30
+
0
Завтра добавлю.
avatar

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

  • 26 июня 2016, 19:18
+
0
Ок
avatar

  14  beton2011 Автор Сообщений: 893

  • 26 июня 2016, 19:21
+
0
Сделал в минутах: www.opentraders.ru/downloads/1214/
avatar

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

  • 26 июня 2016, 19:57
+
0
Вот теперь все правильно работает *good* 

Спасибо :) 
avatar

  14  beton2011 Автор Сообщений: 893

  • 26 июня 2016, 23:22

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