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

Рейтинг 2146



РЕКОМЕНДУЮ




Лучшее от Kofa



Пробой канала Мартин Комментариев 29
2017-03-13 11:59:50Рейтинг 0

Пробой канала Мартин

Здравствуйте господа программисты и участники форума. Мой уровень не позволяет сделать заказ самостоятельно, поэтому надеюсь, что моя идея кого-то заинтересует и он поручится. Идея в принципе не нова, но есть дополнения. Советник на индикаторе price channel Для МТ4.
progi-forex.ru/indicator%20price%20channel.html
Суть алгоритма такова: Ставятся два отложенных ордера на пробой на границе канала + дельта размером LOT. При движении цены границы канала смещаются, ордера должны следовать за каналом. Сработал первый ордер на пробой, противоположный меняется на аналогичный, но размером LOT*К. Важно, чтоб он следовал за краем канала, а не оставался на месте. Такое наращивание лота идет пока не будет получен общий ТП. СЛ отсутствует. Для первого ордера ТП и БУ. ТП2 если ордеров больше 2-х (Для того, чтоб можно было его сделать меньше, чем основной. Чтобы сетка скорее закрылась)
Настроки:
Период канала
Дельта
Лот (Если не проблема % от свободных средств)
Коэфф мартина
БУ (работает только если 1 ордер в рынке)
ТП (Работает только если 1 ордер в рынке. При срабатывании второго ордера-удаляется)
ТП2 (общий профит для двух и более ордеров)
Магик

Настройками ТП и БУ для первого ордера можно пренебречь (если проблемно их программировать)
Всем добра!
  • +4
  • Просмотров: 3332
  • 13 марта 2017, 11:59
  • Kofa
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Если Андрей готов взяться — готов подписаться на заказ.(Если не против? добавить параметр время работы советника)
avatar

  13  Pesha Сообщений: 222 - ¯\_(ツ)_/¯

  • 13 марта 2017, 12:02
+
0
Интересная, кстати, идея, мне нравится.
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 13 марта 2017, 12:09
+
0
добавить параметр время работы советника)

Да, кстати, спасибо за напоминание. После окончания времени торговли доводит сетку до ТП, а новые «первые» отложки не выставляет
Редактирован: 13 марта 2017, 12:15
avatar

  8  Kofa Автор Сообщений: 42

  • 13 марта 2017, 12:13
+
0
Завтра буду смотреть.
avatar

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

  • 13 марта 2017, 17:23
+
0
Завтра буду смотреть.

Отлично! Пока не начал, додумал еще кое что. При взятии ТП цена в этот момент скорее всего будет «облизывать» край канала, и следующий стоп ордер подхватит почти сразу (тут смотря какая дельта). Как то бы этого избежать. Например выставлять стоп ордер, если цена не ближе N пунктов. Вы как считаете?
avatar

  8  Kofa Автор Сообщений: 42

  • 13 марта 2017, 17:36
+
0
Нужно смотреть подробнее и на картинках с пояснениями к ним. И еще не известно возьмусь ли я за такой мудреный алгоритм.
avatar

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

  • 14 марта 2017, 19:11
+
0
avatar

  8  Kofa Автор Сообщений: 42

  • 14 марта 2017, 20:02
+
0
А можно индикатор сюда выложить. Там на сайте их 5-ть штук разных, один установил но не работает советник по нему, короче дайте индикатор пожалуйста.
avatar

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

  • 15 марта 2017, 12:06
+
0
avatar

  8  Kofa Автор Сообщений: 42

  • 15 марта 2017, 12:13
+
0
avatar

  8  Kofa Автор Сообщений: 42

  • 14 марта 2017, 20:23
+
+1
Реально сделать, только нужно больше свободного времени. Поэтому как только так сразу :) 
avatar

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

  • 14 марта 2017, 20:47
+
0
Я повторяю свой вопрос: «Ура?»… (Владимир Вишневский)
avatar

  8  Kofa Автор Сообщений: 42

  • 14 марта 2017, 21:10
+
0
Пока такой набросок. Выставляет отложки тянет по границе канала, при срабатывании ордера противоположный удаляет и заменяет его увеличенным в 2 раза.

И на будущее, чем проще будет ТЗ, тем больше у вас шансов увидеть советник в готовом виде.




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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 50;       // лось
extern int TakeProfit    = 70;       // язь
extern int Delta         = 100;      // дельта
extern int Slip          = 30;       // реквот
extern int ChannelPeriod = 14;       // период индикатора
extern int Magic         = 123;      // магик
extern string IndName    = "Price Channel";

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   int r=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,lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   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) 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()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double h=NormalizeDouble(iCustom(NULL,0,IndName,ChannelPeriod,0,0),Digits);
   double l=NormalizeDouble(iCustom(NULL,0,IndName,ChannelPeriod,1,0),Digits);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==4)
              {
               if(OrderOpenPrice()-h>0)
                 {
                  if(OrderOpenPrice()!=h)
                    {
                     mod=OrderModify(OrderTicket(),h,h-StopLoss*Point,h+TakeProfit*Point,0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==5)
              {
               if(l-OrderOpenPrice()>0)
                 {
                  if(OrderOpenPrice()!=l)
                    {
                     mod=OrderModify(OrderTicket(),l,l+StopLoss*Point,l-TakeProfit*Point,0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double h = iCustom(NULL,0,IndName,ChannelPeriod,0,0);
   double l = iCustom(NULL,0,IndName,ChannelPeriod,1,0);

   if(t!=Time[0] && (CountOrders(0)<1 && CountOrders(1)<1))
     {
      Trailing();
      if(CountOrders(4)<1 && Bid<h) PutOrder(4,h+Delta*Point,Lots);
      if(CountOrders(5)<1 && Ask>l) PutOrder(5,l-Delta*Point,Lots);
      t=Time[0];
     }

   if(CountOrders(0)>0 || CountOrders(1)>0)
     {
      DelOrder();
      if(CountOrders(0)>0 && CountOrders(5)<1) PutOrder(5,l-Delta*Point,Lots*KLot);
      if(CountOrders(1)>0 && CountOrders(4)<1) PutOrder(4,l+Delta*Point,Lots*KLot);
     }

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

avatar

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

  • 14 марта 2017, 22:44
+
0
Сейчас есть процентов 70 от ТЗ:




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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь
extern int Profit        = 70;       // язь в рублях
extern int Profit2       = 30;       // язь в рублях
extern int Delta         = 100;      // дельта
extern int Slip          = 30;       // реквот
extern int ChannelPeriod = 14;       // период индикатора
extern int Magic         = 123;      // магик
extern string IndName    = "Price Channel";

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   int r=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,lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   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) 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()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double h=NormalizeDouble(iCustom(NULL,0,IndName,ChannelPeriod,0,0),Digits);
   double l=NormalizeDouble(iCustom(NULL,0,IndName,ChannelPeriod,1,0),Digits);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==4)
              {
               if(OrderOpenPrice()-h>0)
                 {
                  if(OrderOpenPrice()!=h)
                    {
                     mod=OrderModify(OrderTicket(),h,h-StopLoss*Point,h+TakeProfit*Point,0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==5)
              {
               if(l-OrderOpenPrice()>0)
                 {
                  if(OrderOpenPrice()!=l)
                    {
                     mod=OrderModify(OrderTicket(),l,l+StopLoss*Point,l-TakeProfit*Point,0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет позиций                                                  |
//+------------------------------------------------------------------+
int CountTrades(int ot=-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()==0 && (ot==0 || ot==-1)) count++;
            if(OrderType()==1 && (ot==1 || ot==-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);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Лот для усреднителя                                              |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double h = iCustom(NULL,0,IndName,ChannelPeriod,0,0);
   double l = iCustom(NULL,0,IndName,ChannelPeriod,1,0);

   if((AllProfit()>Profit && CountTrades()==1) || (AllProfit()>Profit2 && CountTrades()>1)) CloseAll();
   
   if(t!=Time[0] && (CountOrders(0)<1 && CountOrders(1)<1))
     {
      Trailing();
      if(CountOrders(4)<1 && Bid<h) PutOrder(4,h+Delta*Point,Lots);
      if(CountOrders(5)<1 && Ask>l) PutOrder(5,l-Delta*Point,Lots);
      t=Time[0];
     }

   if(CountOrders(0)>0 || CountOrders(1)>0)
     {
      DelOrder();
      if(CountOrders(0)>0 && CountOrders(5)<1) PutOrder(5,l-Delta*Point,Lot());
      if(CountOrders(1)>0 && CountOrders(4)<1) PutOrder(4,l+Delta*Point,Lot());
     }

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

avatar

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

  • 14 марта 2017, 23:50
+
0
Да, согласен, советник сложный. Но простых на этом сайте, сделанных Вами и Вашими коллегами, очень много.
Вот нашел картинку принципа работы. Но здесь отложки выставляются на одном и том же уровне.

Редактирован: 14 марта 2017, 23:24
avatar

  8  Kofa Автор Сообщений: 42

  • 14 марта 2017, 23:23
+
0
Поэтому в затяжном флете такой сов сливает. Я думаю, что моя идея будет более жизнеспособной.
avatar

  8  Kofa Автор Сообщений: 42

  • 14 марта 2017, 23:26
+
0
Уже нашел индикатор. Что за люди, трудно было к топику индюка прикрепить ( 
avatar

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

  • 15 марта 2017, 12:13
+
0
Простите
avatar

  8  Kofa Автор Сообщений: 42

  • 15 марта 2017, 12:16
+
0
Все в файлике: www.opentraders.ru/downloads/1511/

avatar

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

  • 15 марта 2017, 20:32
+
0
Что-то не понятное творится. После взятия первого селл баи появляются не за верхней границей канала, а гораздо ближе
avatar

  8  Kofa Автор Сообщений: 42

  • 15 марта 2017, 21:59
+
0
Скиньте настройки и я посмотрю вечером.
avatar

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

  • 16 марта 2017, 06:18
+
0

avatar

  8  Kofa Автор Сообщений: 42

  • 16 марта 2017, 11:28
+
0
Поставил на отладку. Сейчас буду все проверять.
avatar

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

  • 16 марта 2017, 20:00
+
0
avatar

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

  • 16 марта 2017, 20:16
+
0
Пробовал прогнать в тестере. Не открывает файл индикатора.2017.03.17 09:24:42.208 2017.03.13 23:58:47 cannot open file 'D:\Program Files (x86)\MetaTrader 4 — RoboForex\MQL4\indicators\Price Channel.ex4' [2]
Файл в МТ4 присутствует и на график устанавливается. В чем проблема?
avatar

  11  allesgood65 Сообщений: 258

  • 17 марта 2017, 09:33
+
0
Проверьте как у вас называется индюк в терминале, здесь он идет с пробелом, значит индюку нужно добавить пробел.
Редактирован: 17 марта 2017, 10:11
avatar

  13  Pesha Сообщений: 222 - ¯\_(ツ)_/¯

  • 17 марта 2017, 10:11
+
0
Андрей, спасибо за Ваши старания, но все равно пока работает не так как надо. Теперь при взятии «первой» отложки он не меняет противоположную на бОльший лот. При взятии противоположного ордера (получается лок) другие отложки не выставляются. Еще ньюанс по задумке не указал: например цена идет вниз. Верхняя отложка тянется вслед за каналом на расстоянии дельта. Цена пошла вверх, но не пробила до отложки из-за дельты, верхняя граница канала тихонько поползла вверх. Вот тут нужно, чтобы отложка от цены не убегала.
avatar

  8  Kofa Автор Сообщений: 42

  • 18 марта 2017, 15:16
+
0
То что не получается быстро сделать к платному.
avatar

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

  • 18 марта 2017, 19:22
+
0
Хорошо. Действительно трудоемкий получился сов. Еще раз спасибо за Ваши старания. Сам я тупанул. Надо было не отложки, а вход по пробитию канала со сдвигом. Чем отложки тралить. Простите, что заставил Вас «попотеть»
avatar

  8  Kofa Автор Сообщений: 42

  • 18 марта 2017, 23:32

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