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

Рейтинг 2146



РЕКОМЕНДУЮ



Советник МТ4 на основе индикатора Зиг-заг

Советник МТ4 на основе индикатора Зиг-заг (ЗЗ).

Работа только со стоповыми ордерами.
Условие для входа на покупку. Если цена не дошла до предыдущего минимума ЗЗ на D пунктов и длина последего луча не меньше ZL, то на уровне предыдущего максимума ставим стоповый ордер на покупку с СЛ=предыдущий минимум и ТП=2*СЛ. Условия входа на продажу обратно зеркальные. Одновременно могут быть только две отложки, один на покупку и другой на продажу, при получении следующего сигнала по направлению, удаляется предыдущий стоповый ордер по направлению.

Заранее благодарю за разработку.
  • 0
  • Просмотров: 3706
  • 10 июня 2017, 14:35
  • izzatilla
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
После выходных посмотрю.
avatar

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

  • 10 июня 2017, 15:25
+
0
Сделал набросок:




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

//--- Inputs
extern double Lots        = 0.1;      // лот
extern int StopLoss       = 300;      // лось
extern int TakeProfit     = 600;      // язь
extern int Delta          = 50;       // расстояние до экстремума
extern int Gamma          = 50;       // длина луча
extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик

double up=0,dn=0;
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)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);
   
   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits); else sl=zz2;
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits); else tp=price-MathAbs(zz0-zz1)*2;
     }

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

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+PeriodSeconds(),clr);
   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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
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());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ZZPrice(int ne=0)
  {
   double zz;
   int    i,k=iBars(NULL,0),ke=0;

   for(i=1; i<k; i++)
     {
      zz=iCustom(NULL,0,"ZigZag",12,5,3,0,i);
      if(zz!=0)
        {
         ke++;
         if(ke>ne) return(zz);
        }
     }
   Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);
   double gamma = MathAbs(zz0-zz1)/Point;
   double delta = MathAbs(zz0-zz2)/Point;

   if(t!=Time[0])
     {
      if(CountTrades()<1)
        {
         if(gamma>Gamma && delta>Delta)
           {
            if(CountOrders(4)<1 && zz0<zz1) {PutOrder(4,zz1); up=zz1;}
            if(CountOrders(5)<1 && zz0>zz1) {PutOrder(5,zz1); dn=zz1;}
           }
        }
      t=Time[0];
     }

   Comment("\n zz0: ",ZZPrice(0),
           "\n zz1: ",ZZPrice(1),
           "\n zz2: ",ZZPrice(2));
  }
//+------------------------------------------------------------------+

avatar

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

  • 11 июня 2017, 16:21
+
0
ориентировочно — он удаляет стоповый ордер, потом заново ставит, лучше бы он держал отложку до срабатывания или аннулирования модели. Спасибо.
Редактирован: 11 июня 2017, 18:41
avatar

  5  izzatilla Автор Сообщений: 107 - telma

  • 11 июня 2017, 18:41
+
0
Вариант с удалением ордеров при обновлении луча зигзага:




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

//--- Inputs
extern double Lots        = 0.1;      // лот
extern int StopLoss       = 300;      // лось
extern int TakeProfit     = 600;      // язь
extern int Delta          = 50;       // расстояние до экстремума
extern int Gamma          = 50;       // длина луча
extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик

double z=0;
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)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);

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

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

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
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());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ZZPrice(int ne=0)
  {
   double zz;
   int    i,k=iBars(NULL,0),ke=0;

   for(i=1; i<k; i++)
     {
      zz=iCustom(NULL,0,"ZigZag",12,5,3,0,i);
      if(zz!=0)
        {
         ke++;
         if(ke>ne) return(zz);
        }
     }
   Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double zz0 = ZZPrice(0);
   double zz1 = ZZPrice(1);
   double zz2 = ZZPrice(2);
   double gamma = MathAbs(zz0-zz1)/Point;
   double delta = MathAbs(zz0-zz2)/Point;

   if(t!=Time[0])
     {
      if(z!=zz0) DelOrder();
      
      if(CountTrades()<1)
        {
         if(gamma>Gamma && delta>Delta)
           {
            if(CountOrders(4)<1 && zz0<zz1) PutOrder(4,zz1);
            if(CountOrders(5)<1 && zz0>zz1) PutOrder(5,zz1);
           }
        }
      z=zz0;
      t=Time[0];
     }

   Comment("\n zz0: ",ZZPrice(0),
           "\n zz1: ",ZZPrice(1),
           "\n zz2: ",ZZPrice(2));
  }
//+------------------------------------------------------------------+

avatar

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

  • 11 июня 2017, 19:57
+
0
avatar

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

  • 11 июня 2017, 20:06
+
0
Спасибо за реализацию. Пожалуйста внесите изменения согласно задаче:«Одновременно могут быть только две отложки, один на покупку и другой на продажу, при получении следующего сигнала по направлению, удаляется предыдущий стоповый ордер по направлению.»
Сейчас он заменяет байстоп на селстоп ордер, нужно было, что бы они отдельно отрабатывались, не зависимо от друг друга.
avatar

  5  izzatilla Автор Сообщений: 107 - telma

  • 12 июня 2017, 18:33
+
0
На скринах все покажите как надо?
avatar

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

  • 12 июня 2017, 18:53
+
0

Пожалуйста.
avatar

  5  izzatilla Автор Сообщений: 107 - telma

  • 12 июня 2017, 19:05
+
0
И скрины с условиями для постановки отложек, а то без наглядности я могу только догадываться как все это может выглядеть.
avatar

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

  • 12 июня 2017, 20:34
+
0
Хорошо, буду добавлять. Сейчас вопросы не остались?
avatar

  5  izzatilla Автор Сообщений: 107 - telma

  • 12 июня 2017, 20:36
+
0
Это все надо было сразу делать, чтобы у меня никаких вопросов не было. А так я с ним уже достаточно намучился. Лучше к платному.
Редактирован: 12 июня 2017, 20:48
avatar

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

  • 12 июня 2017, 20:43
+
0
Это не в спешку. Если исправите буду благодарен, если нет, то все равно спасибо. Думал все понятно по тексту.
avatar

  5  izzatilla Автор Сообщений: 107 - telma

  • 12 июня 2017, 21:06
+
0
делайте в следующий раз максимально подробное тз, чтобы не было никаких разночтений, тогда шансы получить то что нужно возрастут. и помните здесь делаю только то что можно быстро сделать.
avatar

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

  • 12 июня 2017, 21:13
+
0
Здравствуйте Андрей! Пожалуйста доработайте данного советника согласно последним вышеприведенным уточнениям в этом месяце.
Заранее благодарен.
avatar

  5  izzatilla Автор Сообщений: 107 - telma

  • 6 июля 2017, 16:54
+
0
Пусть доработка будет новым топиком.
avatar

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

  • 6 июля 2017, 17:37

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