vikas
Алексей

 
Уровень 9

  Торгую в компаниях:


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

Рейтинг 2146



РЕКОМЕНДУЮ



Помогите с написанием советника

Здравствуйте уважаемые AM2 и Lorik. Прочитал вашу переписку по созданию советника на основе индикатора пробоя (ant-GUBreakout_V.0.4.2). Сам торгую по стратегии с использованием данного индикатора. Торгую довольно успешно. Неудобство в том что в определённый момент нужно быть у компьютера — а не всегда получается. Так что хотелось бы всё автоматизировать. АМ2 Поможете?

Суть стратегии: После того как по заданному временному интервалу образовалась коробка и установились уровни (макс. и мин. цены плюс отступ), по ним выставляются стоповые ордера. После сработки одного ордера второй удаляется. Если цена пошла в нужном направлении и сработал тейк, торговля останавливается. Если цена пошла не в нужном направлении начинает работать мартингейл, тейк модифицируется, на очередном откате цена доходит до тейка и торговля также останавливается. Ждём следующего дня.
Естественно если сделки висят следующий вход только после их закрытия. А сейчас мне приходится подгадывать момент когда цена пробьёт уровень и включать в этот момент советника. (использую Forex Setka Trader 1.6). Он по срабатыванию тейка как раз отключается (Freeze after TP). Торговля идёт на EURJPY. По опыту считаю её самой оптимальной для данной стратегии. Тайм фрейм — М1 что тоже удобно т. к. цена порой уходит и в течении часа возвращается почти на тот же ценовой уровень — с учётом мартингейла стопроцентное закрытие. Так что пожалуйста, не могли бы вы и для меня сделать вариант советника. Под МТ4. В настройках советника должна быть возможность задания
— временного интервала коробки
— размера отступа
ну остальное как обычно-
— lot
— lotexponent
— lotdecimal
— тейк профита
— pipstep
— max trades
— magic number
  • +2
  • Просмотров: 4685
  • 19 декабря 2014, 16:29
  • vikas
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Как я понимаю надо совместить советники lorik и StopLimit по моему не плохой вариант*think* 
avatar

  19  lorik Сообщений: 357 - Лариса

  • 19 декабря 2014, 18:25
+
0
Сделал предварительную версию советника. Выставляет ордера по краям коробки, затем усредняет.



Файл в базе: www.opentraders.ru/downloads/534/

avatar

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

  • 20 декабря 2014, 18:19
+
0
Добавил в советник параметры:

extern int    MaxTrades   = 10;          // количетсво трейдов
extern double KLot        = 2;           // коэффициент увеличения объема
extern double KStep       = 2;           // увеличение шага между ордерами




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

extern int    StopLoss    = 190;         // стоп лосс ордера
extern int    TakeProfit  = 50;          // тейк профит ордера
extern int    Step        = 10;          // шаг между ордерами
extern int    MaxTrades   = 10;          // количетсво трейдов
extern int    Slip        = 3;           // проскальзывание
extern int    EndHour     = 11;          // час окончания торговой сессии
extern int    CountHour   = 8;           // длительность торговой сессии
extern int    Expiration  = 14;          // время истечения ордера
extern int    Delta       = 100;         // расстояние от вершин
extern int    Magic       = 21122014;    // магик
extern double Lots        = 0.1;         // торговый объем
extern double KLot        = 1;           // коэффициент увеличения объема
extern double KStep       = 10;          // увеличение шага между ордерами

int ticket;
double step,lot,tp,sl,price;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5)
    {
     TakeProfit*=10;
     StopLoss*=10;     
     Step*=10;
     Slip*=10;
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int b=0,s=0;  
   datetime expiration = TimeCurrent()+3600*Expiration;
   double up=iHigh(Symbol(),PERIOD_H1,iHighest(NULL,0,MODE_HIGH,CountHour,1));
   double dn=iLow(Symbol(),PERIOD_H1,iLowest(NULL,0,MODE_LOW,CountHour,1));
   double delta=up-dn;

   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
               
   if(CountTrades()==0 && Hour()==EndHour && Ask<up && b<1)
    {
     price=up+Delta*Point;
     step=Step;
     lot=Lots;    
     ticket=OrderSend(Symbol(),OP_BUYSTOP,lot,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",Magic,expiration,Blue);
    } 
   
   if(CountTrades()==0 && Hour()==EndHour && Bid>dn && s<1)
    {
     price=dn-Delta*Point;
     step=Step;
     lot=Lots;         
     ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",Magic,expiration,Red);     
    }

   if(CountTrades()>0 && CountTrades()<=MaxTrades)
    {
     int otype = FindOrderType();

     if(otype == OP_BUY)
      {
       price = FindLastBuyPrice();
       if((price-Ask)/Point>=step)
        {
         ticket=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lot,2),Ask,Slip,0,0,"Buy Order",Magic,0,Blue);
         ModifyOrders();
         lot=lot*KLot;         
         step=step*KStep;         
        }
      }
      
     else if(otype == OP_SELL)
      {
       price = FindLastSellPrice();
       if((Bid-price)/Point>=step)
        {
         ticket=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Ask,Slip,0,0,"Sell Order",Magic,0,Red);
         ModifyOrders();
         lot=lot*KLot;         
         step=step*KStep; 
        }       
      }      
    }
    
   if(CountTrades()>0)DelOrder();
   Comment("\nШаг: ",step,
           "\nЛот: ",NormalizeDouble(lot,2),
           "\nПозиций : ",CountTrades());    
  }
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   double all=0;
   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()==OP_BUY || OrderType()==OP_SELL)
          {
           all+=OrderOpenPrice();
           count++;
          }
        }
      }
    }   
   all=NormalizeDouble(all/count,Digits);
   
   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)
          {
           tp=NormalizeDouble(all+TakeProfit*Point,Digits);
           sl=NormalizeDouble(all-StopLoss*Point,Digits);
           bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
           
          }
         else 
         if(OrderType()==OP_SELL)
          {
           tp=NormalizeDouble(all-TakeProfit*Point,Digits);
           sl=NormalizeDouble(all+StopLoss*Point,Digits);
           bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
          }          
        }
      }
    }      
  }  
//+------------------------------------------------------------------+
int FindOrderType()
  {
   int oticket, ticketNumber=0,type=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         oticket=OrderTicket();
         if(oticket>ticketNumber)
          {
           ticketNumber=oticket;
           type=OrderType();
          }
        }
      }
    }
    return(type);
  }  
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   int oticket, ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
        {
         oticket=OrderTicket();
         if(oticket>ticketNumber)
          {
           ticketNumber=oticket;
           oprice=OrderOpenPrice();
          }
        }
      }
    }
    return(oprice);
  }
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   int oticket, ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
        {
         oticket=OrderTicket();
         if(oticket>ticketNumber)
          {
           ticketNumber=oticket;
           oprice=OrderOpenPrice();
          }
        }
      }
    }
    return(oprice);
  }      
//+------------------------------------------------------------------+
int CountTrades()
  {
   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()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   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()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
         if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
        }
      }       
    }    
  }
//+------------------------------------------------------------------+

Редактирован: 21 декабря 2014, 09:54
avatar

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

  • 21 декабря 2014, 09:38
+
0
ticket=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Ask,Slip,0,0,«Sell Order»,Magic,0,Red);

Надо ASK поменять на BID. А то он не усредняет в селл.
avatar

  13  Zerg Сообщений: 89 - Сергей

  • 21 декабря 2014, 17:39
+
0
Можно также Close[0] поставить или проскальзывание увеличить и будет усреднять.
avatar

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

  • 21 декабря 2014, 22:01
+
0
Можно также Close[0] поставить


А можно поподробнее, куда его поставить и как это работает?
avatar

  13  Zerg Сообщений: 89 - Сергей

  • 22 декабря 2014, 17:20
+
0
Вместо аск или вид ставим. Рекомендуют так делать.
avatar

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

  • 22 декабря 2014, 22:37
+
0
Сообщение от Vikas, по его просьбе. Сообщения от него почему то не уходят.

AM2, большое спасибо! Все работает. Но есть небольшой нюанс. Нельзя ли сделать так, чтобы ордера открывались по началу следующей свечи? Сейчас они открываются через определенный шаг. В этом случае просадка должна быть меньше.

avatar

  1  investpnz Сообщений: 1

  • 22 декабря 2014, 13:06
+
0
Рразобрался. Похоже что то с браузером. Не мог отправить сообщения.
АМ2 всё хорошо работает. Погонял на истории — лучше всего на EURJPY M30 и
AUDUSD H1. Подъём на EURJPY В 1000 пунктов с 31.10 прошёл очень удачно.
Повторюсь — можно ли сделать так, что бы открытие следующего ордера происходило
не просто через «шаг между ордерами» а по началу следующей свечи, при условии
конечно, что этот шаг не меньше чем задан в настройках? (А то порой свечка тянется
пунктов эдак на сто и внутри неё открываются несколько ордеров- а это лишняя
просадка). Подумай пожалуйста.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 22 декабря 2014, 17:48
+
0
ticket=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Ask,Slip,0,0,«Sell Order»,Magic,0,Red);

Надо ASK поменять на BID. А то он не усредняет в селл.

Исправил аск на бид. Сделал чтобы усреднялся на следующей свече:
www.opentraders.ru/downloads/534/
avatar

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

  • 22 декабря 2014, 22:36
+
0
Всё. АМ2 Огромное спасибо. Всё как хотелось. Будем экспериментировать.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 23 декабря 2014, 07:02

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