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

Рейтинг 2146



РЕКОМЕНДУЮ



Доработка тральщика

Доработка тральщика *hi* 
Дописать условия в тральщик из темы, zakaz.opentraders.ru/31933.html, www.opentraders.ru/downloads/1143/,
либо написать с нуля.

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

Советник должен подтягивать уровень БУ вслед за ценой по мин./мах свечей с учетом спреда, чтоб растояние между БУ и спредом равнялось уровню стопов, актуально в основном для sell ордеров

Хочу чтобы советник, когда стоплосс равен нулю выставлял заместо него противоположные ордера Buylimit и SellLimit на следующих условиях

Андрей, добавьте пожалуйста в тральщик следующие пункты:

пункт выставлять противоположный ордер — да/нет
пункт минимальный лот противоположного ордера — 0.01
пункт выставлять противоположный ордер на 100 пунктов от цены — да/нет
пункт увеличить лот выставляемого противоположного ордера от основного на п-ое кол-во пунктов — да/нет
пункт выставлять лот противоположного ордера наполовину от основного например 0.10 — 0.05, 0.4- 0.02 да/нет
пункт выставлять противоположный ордер в 10 пунктах от ТР да/нет
пункт количество пунктов от ТР
пункт выставлять ордер buystop sellstop после закрытия в безубыток через 10 пунктов да/нет
пункт количество пунктов от цены для buystop, sellstop

Хотелось бы чтобы советник мог контролировать ордера по нескольким валютным парам одновременно, если это возможно.

Спасибо зарание *stesnitelno* , вроде ничего не забыл.
  • +1
  • Просмотров: 5175
  • 8 мая 2016, 01:05
  • cerber04
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Здесь достаточно приличный объем работы, могу сделать только в максимально упрощенном виде. Выберите из всего ТЗ что то одно простое, тогда сделаю.
avatar

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

  • 8 мая 2016, 12:54
+
0
Я собрал все, что мне хотелось реализовать. <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; 

Для начала можно разобраться с БУ по уровням стопов так как спред плавающий и первые 4 пункта, три из них дефолтные настройки
1.пункт выставлять противоположный ордер — да/нет
2.пункт минимальный лот противоположного ордера — 0.01
3.пункт выставлять противоположный ордер на 100 пунктов от цены — да/нет
количество пунктов меняется в настройках
4.пункт выставлять лот противоположного ордера наполовину от основного например 0.10 — 0.05, 0.4- 0.02 да/нет

А с остальными можно разобраться, когда будет желание или время.

Редактирован: 8 мая 2016, 20:08
avatar

  16  cerber04 Автор Сообщений: 409

  • 8 мая 2016, 20:08
+
0
Завтра добавлю то что можно быстро сделать.
avatar

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

  • 8 мая 2016, 20:20
+
0
Давайте по порядку. Этот пункт:
пункт выставлять противоположный ордер — да/нет

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

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

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

  16  cerber04 Автор Сообщений: 409

  • 12 мая 2016, 00:34
+
0
Картина должна выглядить примерно так


по ссылке скрин более четкий rgho.st/8rf59J8v4
Редактирован: 10 мая 2016, 14:53
avatar

  16  cerber04 Автор Сообщений: 409

  • 10 мая 2016, 14:52
+
0
пункт выставлять противоположный ордер — да/нет

это пункт настроек, чтобы можно было выключить/выключить выставление отложек.

Советник должен выставлять отложки, также как в соседней темы скрипт выставляет.
Короче я поставил ордер в селл, советник выставил отложку в в бай.
Если лот рабочего ордера отличается от 0.01, выставляется байстоп в половину лота.
Вверху влепил лимитник в вниз, снизу выставил лимитник в бай.
Выставил у лимитников противоложные ордера в половину лота.
Сидим ждем когда большая хищная рыба приплывет =)))
avatar

  16  cerber04 Автор Сообщений: 409

  • 10 мая 2016, 15:06
+
0
Вот цена закрыла ордер по ТР, пошла на вверх активировала отложку в бай,
передвинули отложку sellstop выше, выставили отложку sellstop.
Цена закрыла отложку в бай по ТР.
Тут надо спред, чтоб учитывался, то что выставление отложенного ордера рядом с открытым ордером по евро прокатывает, по другим парам вряд ли.






Редактирован: 10 мая 2016, 15:35
avatar

  16  cerber04 Автор Сообщений: 409

  • 10 мая 2016, 15:35
+
0
Цена спустилась ниже и активировала отложку в селл, выставили у первого ордера в селл отложку в бай, отложка активировалась, закрылась по ТР
Закрылась оба ордера в шорт. Картина выглядит так

Вообщем чтоб больше времени на анализ оставалосЬ, пусть этой катавасией с ордерами советник занимается =)))
avatar

  16  cerber04 Автор Сообщений: 409

  • 10 мая 2016, 17:19
+
0
Привет. Андрей, а на чем мы застряли.?
Надо всего то сделать: установка противоположного отложенного ордера на уже открытый ордер.


Такие индивидуальные заказы реализовывать в разы сложнее чем просто советник с индикаторами. В этом случае делаю только то что можно быстро сделать.
avatar

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

  • 12 мая 2016, 09:23
+
+1
Каждый заказ я пробую сделать если быстро не получается, это сразу к платному. Здесь получилось набросать вот такой код, но нужно еще сидеть и дорабатывать.


//+------------------------------------------------------------------+
//|                                                      Poshnik.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 Lots       = 0.1;      // лот
extern int StopLoss      = 500;      // лось
extern int Delta         = 300;      // расстояние для отложки
extern int TakeProfit    = 500;      // язь
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int TrailingStop  = 0;        // 1-трал
extern int BuySell       = 0;        // 1-buy 2-sell 0-off
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutStopOrder()
  {
   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(OrderInPrice(OrderOpenPrice()-Delta*Point)) PutOrder(5,OrderOpenPrice()-Delta*Point);
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderInPrice(OrderOpenPrice()+Delta*Point)) PutOrder(4,OrderOpenPrice()+Delta*Point);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool OrderInPrice(double price)
  {
   double pr=0;
   bool p=true;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()>1)
              {
               pr=OrderOpenPrice();
              }
           }
        }
     }

   if(NormalizeDouble(pr,Digits)==NormalizeDouble(price,Digits)) p=false;
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderStopLoss()==0 || OrderTakeProfit()==0)
              {
               if(OrderType()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderOpenPrice()+TakeProfit*Point,0,Blue);
               if(OrderType()==1) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderOpenPrice()-TakeProfit*Point,0,Blue);
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(NormalizeDouble(Low[1],Digits)>OrderOpenPrice() && Bid>NormalizeDouble(Low[1],Digits))
                 {
                  if(OrderStopLoss()!=NormalizeDouble(Low[1],Digits))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Low[1],Digits),OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(NormalizeDouble(High[1],Digits)<OrderOpenPrice() && Ask<NormalizeDouble(High[1],Digits))
                 {
                  if(OrderStopLoss()!=NormalizeDouble(High[1],Digits))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(High[1],Digits),OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   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(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Mode();
   PutStopOrder();
   if(BULevel>0) BU();
   if(TrailingStop>0) Trailing();
   if(CountTrades()<1 && BuySell==1) PutOrder(0,Ask);
   if(CountTrades()<1 && BuySell==2) PutOrder(1,Bid);

  }
//+------------------------------------------------------------------+

avatar

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

  • 12 мая 2016, 09:38
+
0
Возникла Маааленькая ПРОБЛЕМКА — на Демо каждую секундуу открывает отложку.
Наоткрывал столько, что терминал ругнулся на предел кол-во ордеров. <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; 
Причем самих отложек в окне терминала я не видел, в только в тестере поймал момент.
Надо на один открытый ордер, только одну отложку.
Редактирован: 13 мая 2016, 05:21
avatar

  16  cerber04 Автор Сообщений: 409

  • 13 мая 2016, 04:04
+
0
Это только набросок нужно время чтобы доработать. Обратитесь лучше к платному. Делаю только то что можно быстро сделать.
Редактирован: 13 мая 2016, 06:54
avatar

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

  • 13 мая 2016, 06:53
+
0
так я не тороплю со временем *pardon* 
мне нравится ваш стиль, я по нему учусь разбираться в коде
вы можете помочь с доработкой, когда будет время
avatar

  16  cerber04 Автор Сообщений: 409

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

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

  • 13 мая 2016, 08:46
+
+2
Вот отладил вариант когда новой позе ставится отложенник:




//+------------------------------------------------------------------+
//|                                                      Trailer.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 Lots       = 0.1;      // лот
extern int StopLoss      = 500;      // лось
extern int Delta         = 300;      // расстояние для отложки
extern int TakeProfit    = 500;      // язь
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int TrailingStop  = 0;        // 1-трал
extern int BuySell       = 0;        // 1-buy 2-sell 0-off
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,TimeCurrent()+3600*10,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutStopOrder()
  {
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
           {
            if(NormalizeDouble(OrderPrice(),Digits)!=NormalizeDouble(OrderOpenPrice()-Delta*Point,Digits)) PutOrder(5,OrderOpenPrice()-Delta*Point);
           }

         if(OrderType()==OP_SELL)
           {
            if(NormalizeDouble(OrderPrice(),Digits)!=NormalizeDouble(OrderOpenPrice()+Delta*Point,Digits)) PutOrder(4,OrderOpenPrice()+Delta*Point);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OrderPrice()
  {
   double pr=0;
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
        {
         if(OrderType()>3)
           {
            pr=OrderOpenPrice();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderStopLoss()==0 || OrderTakeProfit()==0)
              {
               if(OrderType()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderOpenPrice()+TakeProfit*Point,0,Blue);
               if(OrderType()==1) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderOpenPrice()-TakeProfit*Point,0,Blue);
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(NormalizeDouble(Low[1],Digits)>OrderOpenPrice() && Bid>NormalizeDouble(Low[1],Digits))
                 {
                  if(OrderStopLoss()!=NormalizeDouble(Low[1],Digits))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Low[1],Digits),OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(NormalizeDouble(High[1],Digits)<OrderOpenPrice() && Ask<NormalizeDouble(High[1],Digits))
                 {
                  if(OrderStopLoss()!=NormalizeDouble(High[1],Digits))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(High[1],Digits),OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   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(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Mode();
   PutStopOrder();
   if(BULevel>0) BU();
   if(TrailingStop>0) Trailing();
   if(CountTrades()<1 && BuySell==1) PutOrder(0,Ask);
   if(CountTrades()<1 && BuySell==2) PutOrder(1,Bid);

   Comment("\n Price: ");
  }
//+------------------------------------------------------------------+

avatar

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

  • 13 мая 2016, 19:45
+
0
Хорошо бы сделать это, получится замечательная вещь:
— Стоп-ордер ставится в размере кратном 2 ордеру к которому он ставится(с коэфф),
* т.е. добавить в 4.пункт выставлять лот противоположного ордера наполовину от основного например 0.10 — 0.05, 0.4- 0.2 да/нет
не только уменьшение, но увеличение, т.е. коэффициент, например: коэфф. 0.5 = лот 0.1 — 0.05, коэфф. 2 = лот 0.1 — 0.2
— Тралится сработавший стоп-ордер, и при его закрытии по тейку закрывается и основной ордер.
Размер тейка должен быть больше, чем разница между первым ордером и стоп-ордером + установленное значение БУ+, т.е. это точка перевода в БУ+ всей связки,
— Если сработал стоп-ордер, то в то же место, где основной ордер ставится ещё один стоп-ордер в направлении основного,
с той же лотностью, что и основной (т.е. без коэфф. увеличения),
если сработал и этот ордер, все ТП, стопы у таких пар ордеров удаляются и они не тралятся
т.е. имеем запертый лосс в размере 2 х кол-во п. х лот.
(их разруливание/закрытие после ведётся отдельно — руками или др. сов.:
когда нарастёт сетка таких встречных ордеров, часть автоматически перекрывается по среднему в плюс, остальные можно разруливать, либо закрыть уменьшив общую сумму от лосей.)

-Если сработал ТП у основного ордера, удаляется выставленный к нему и не сработавший стоп-ордер.
Редактирован: 14 мая 2016, 07:21
avatar

  11  preasto Сообщений: 445

  • 14 мая 2016, 00:32
+
0
мне бы хотелось немного другой вариант создать под мои полевые испытания в боевых условиях =)))*war* 
А тут вдруг ассоциация возникала, по игре Диабло.
Если представить там быков и медведей, то завалив их всех на уровне собирешь с рынка монетки, сенты
avatar

  16  cerber04 Автор Сообщений: 409

  • 14 мая 2016, 05:40
+
0
Спасибо, Заценим *friends* 
avatar

  16  cerber04 Автор Сообщений: 409

  • 14 мая 2016, 05:50
+
0
Если пошло теперь дальше можно смотреть, что добавить, но это после выходных.
avatar

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

  • 14 мая 2016, 06:53
+
+2
Добавил изменение лота стопового ордера и запрет на его установку:
www.opentraders.ru/downloads/1177/

//+------------------------------------------------------------------+
//|                                                      Trailer.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 Lots       = 0.1;      // лот
extern double KLot       = 2;        // изменение лота
extern int StopLoss      = 500;      // лось
extern int Delta         = 300;      // расстояние для отложки
extern int TakeProfit    = 500;      // язь
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int TrailingStop  = 0;        // 1-трал
extern int BuySell       = 0;        // 1-buy 2-sell 0-off
extern int BuyStop       = 0;        // 1-buystop 0-off
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0,lot=Lots;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }
     
   if(KLot>0 && type>1) lot*=KLot;
   r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,TimeCurrent()+3600*10,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutStopOrder()
  {
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
           {
            if(NormalizeDouble(OrderPrice(),Digits)!=NormalizeDouble(OrderOpenPrice()-Delta*Point,Digits)) PutOrder(5,OrderOpenPrice()-Delta*Point);
           }

         if(OrderType()==OP_SELL)
           {
            if(NormalizeDouble(OrderPrice(),Digits)!=NormalizeDouble(OrderOpenPrice()+Delta*Point,Digits)) PutOrder(4,OrderOpenPrice()+Delta*Point);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OrderPrice()
  {
   double pr=0;
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
        {
         if(OrderType()>3)
           {
            pr=OrderOpenPrice();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderStopLoss()==0 || OrderTakeProfit()==0)
              {
               if(OrderType()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderOpenPrice()+TakeProfit*Point,0,Blue);
               if(OrderType()==1) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderOpenPrice()-TakeProfit*Point,0,Blue);
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(NormalizeDouble(Low[1],Digits)>OrderOpenPrice() && Bid>NormalizeDouble(Low[1],Digits))
                 {
                  if(OrderStopLoss()!=NormalizeDouble(Low[1],Digits))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Low[1],Digits),OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(NormalizeDouble(High[1],Digits)<OrderOpenPrice() && Ask<NormalizeDouble(High[1],Digits))
                 {
                  if(OrderStopLoss()!=NormalizeDouble(High[1],Digits))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(High[1],Digits),OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   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(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Mode();
   if(BULevel>0) BU();
   if(BuyStop>0) PutStopOrder();
   if(TrailingStop>0) Trailing();
   if(CountTrades()<1 && BuySell==1) PutOrder(0,Ask);
   if(CountTrades()<1 && BuySell==2) PutOrder(1,Bid);

   Comment("\n ");
  }
//+------------------------------------------------------------------+

Редактирован: 16 мая 2016, 17:09
avatar

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

  • 15 мая 2016, 07:59
+
0
Тестирую. не совсем понял, как работают функции:
extern int BuySell = 0; // 1-buy 2-sell 0-off

— extern int BuyStop = 0; // 1-buystop 0-off
почему только BuyStop? — а как SellStop?
Если это универсальная функция локирования ордеров в обе стороны, то может обозначить так:
BuySellStop?
Редактирован: 16 мая 2016, 17:03
avatar

  11  preasto Сообщений: 445

  • 16 мая 2016, 16:53
+
0
Можете изменить название как вам нравится.
avatar

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

  • 16 мая 2016, 16:59
+
0
т.е. так: extern int Buy(Sell)Stop = 0; // 1-buystop 0-off
— это выставление стоп-ордеров к ордерам в любую сторону
— — а что делают // 1-buy 2-sell?:
extern int BuySell = 0; // 1-buy 2-sell 0-off

1-buy ордера только открывать/тралить
2-sell ордера только открывать/тралить?
0-off — в любую сторону открывать/тралить?
Редактирован: 16 мая 2016, 17:10
avatar

  11  preasto Сообщений: 445

  • 16 мая 2016, 17:08
+
0
да для открытия позиции для теста или если торговать им будете.
avatar

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

  • 16 мая 2016, 17:11
+
+1
Потестил, единственное советник не проверяет высталены ли лимитники у остальных ордеров кроме последнего т.е он похоже вообще не проверяет ордера на предмет выставления отложек кроме последних двух

Добавьте пожалуйста выставление Лимитных ордеров.
Добавьте выставление лимитной отложки на место закрытого ордера по ТР.

Редактирован: 18 мая 2016, 03:54
avatar

  16  cerber04 Автор Сообщений: 409

  • 18 мая 2016, 03:45
+
0
речь о лимитных ордерах (на отскок)- или о стоп-ордерах (на пробой)?
avatar

  11  preasto Сообщений: 445

  • 19 мая 2016, 09:11
+
+1
Понял. Смотрю на демке — работает. Посмотрю за дальнейшим ходом.
Конечно, хорошо бы добавить функции:
1. Замена любых(!) появившихся к ордерам СЛ* на стоп-ордер той же лотности / с коэфф.
*Менять только СЛ в зоне убытка к этому ордеру. СЛ в зоне БУ+ не затрагиваются — для возможности перевода в БУ и трала.
— При закрытии основного(первичного ордера) выставленный к нему стоп-ордер тоже удаляется.
2. При срабатывании стоп-ордера:
1) Убирается ТП у основного(первичного)ордера.
2) (вкл/откл): На уровень основного(первичного)ордера выставляется стоп-ордер в его направлении той же лотности / со своим коэфф.
Редактирован: 16 мая 2016, 17:51
avatar

  11  preasto Сообщений: 445

  • 16 мая 2016, 17:50
+
+1
Тестирую. В общем и целом — уже обнадёживает.
Всё-таки не хватает и нужны бы указанные выше функции
по обработке/удалению стопов и ТП при срабатывании ордеров.
Пока без этого тестирование упирается в то, что это по-прежнему приходится делать руками с риском пропустить, если отошёл/отвлёкся.
***
также нужна настройка:
— вести все открытые в терминале пары (согласно открытым ордерам в Окне Терминала): да/нет
— вести указанные пары: [ прописанные, в, поле, через, запятую)пары ]
— исключить указанные пары: [ прописанные, в, поле, через, запятую)пары ]
— заменять все выставленные в окнах стоп-лоссы на (равные) стоп-ордера: да/нет

И, главное: нужно, чтобы стоп-ордер выставлялся не тот, что прописан в настройках сов.,
— но равный тому, к-й у локируемого ордера (с коэфф.), к к-му он выставляется*.
*можно 2 настройки(с коэфф.): 1) выставлять равный основному; 2) указанный:… п. (вписать)
— И несработавший стоп-ордер удалялся при закрытии ордера к к-му он выставлялся.
— выставленные стоп-ордера можно передвигать(руками), и они продолжают учитываться при этом в алгоритме.
Это — принципиально важно.
Редактирован: 19 мая 2016, 12:59
avatar

  11  preasto Сообщений: 445

  • 18 мая 2016, 13:08
+
+1
Изучаю ваш код и не как не пойму как советник понимает, какой ордер должен быть открыт, лимитный или стоповый?

Функцию выставления ордеров после закрытого я нашел на форумах, но мне бы хотелось бы увидеть вашу реализацию, у вас более простая и понятная конструкция.

Опять же три часа изучал код другого вашего сова, но так и не понял как советник выставляет следуюший ордер в том же направлении после закрытого, где это в коде прописано?

Да и еще все таки спрошу, вдруг найдете время ответить

Как реализовать проверку выставлен ли лимитный ордер у новых ордеров, которые превратились в рыночные.?
Редактирован: 20 мая 2016, 12:01
avatar

  16  cerber04 Автор Сообщений: 409

  • 20 мая 2016, 11:56
+
0
Изучаю ваш код и не как не пойму как советник понимает, какой ордер должен быть открыт, лимитный или стоповый?

Здесь ставит только стоповые.

Как реализовать проверку выставлен ли лимитный ордер у новых ордеров, которые превратились в рыночные.?

Смотрите этот код:
if(NormalizeDouble(OrderPrice(),Digits)!=NormalizeDouble(OrderOpenPrice()-Delta*Point,Digits)) PutOrder(5,OrderOpenPrice()-Delta*Point);


5-селлстоп для лимитника будет тоже только 2:

PutOrder(2,OrderOpenPrice()-Delta*Point);
avatar

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

  • 20 мая 2016, 14:31

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