beton2011

 
Уровень 14

  Моя торговля


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


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

Рейтинг 2086



РЕКОМЕНДУЮ



Советник по свечам

Здравствуйте Андрей, нужна ваша помощь.

Есть одна идея для написания советника, мне это еще пока не по силам написать.

Т3

Открытие ордера на покупку

Тень свечи больше тела свечи и тень ниже тела свечи.

Открытие ордера на продажу

Тень свечи больше тела свечи и тень выше тела свечи.

Закрытие ордера

По истечению времени в минутах

По ТП

По СЛ

По обратному сигналу

Обязательные параметры советника

Минимум тела свечи в пунктах

Минимум тени свечи в пунктах

Мартингейл

Все :) 
  • +2
  • Просмотров: 3100
  • 5 декабря 2016, 20:07
  • beton2011
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Начну делать сейчас.
avatar

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

  • 5 декабря 2016, 20:09
+
0
Нарисуйте паттерны для входа?
avatar

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

  • 5 декабря 2016, 20:18
+
0
Все как в ТЗ надо, только забыл добавить что цвет тела свечи может быть любой, но если получится добавьте и выбор цвета, только так чтоб можно было отключить.
avatar

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

  • 5 декабря 2016, 20:35
+
0
Вот смотрите сколько условий чтобы распознать простейший паттерн *shock*  и это еще не все т.к. путаница возникает при распознавании:

if(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]<Close[1] && MathAbs(Open[1]-Low[1])>MathAbs(Close[1]-Open[1]))
avatar

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

  • 5 декабря 2016, 20:57
+
0
Этот код покупает, если бычья с хвостиком, продает. если медвежья с хвостом:




//+------------------------------------------------------------------+
//|                                                    TenSvechi.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       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int Slip          = 30;       // реквот
extern int Telo          = 30;       // тело
extern int Ten           = 30;       // тень
extern int CloseTime     = 30;       // >0-закрытие по времени
extern int CloseSig      = 0;        // 1-закрытие по сигналу
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| 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;

   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 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 OpenPos()
  {
   if(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]<Close[1] && MathAbs(Open[1]-Low[1])>MathAbs(Close[1]-Open[1]))
     {
      PutOrder(0,Ask);
     }

   if(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]>Close[1] && MathAbs(High[1]-Open[1])>MathAbs(Close[1]-Open[1]))
     {
      PutOrder(1,Bid);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()<0)
        {
         lot=OrderLots()*KLot;
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   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(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]>Close[1] && MathAbs(High[1]-Open[1])>MathAbs(Close[1]-Open[1]))
                 {
                  CloseAll(0);
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]<Close[1] && MathAbs(Open[1]-High[1])>MathAbs(Close[1]-Open[1]))
                 {
                  CloseAll(1);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime OrderOpen()
  {
   datetime t=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) t=OrderOpenTime();
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1)
     {
      OpenPos();
     }
   if(CloseSig>0) ClosePos();
   if(TimeCurrent()-OrderOpen()>CloseTime*60 && CloseTime>0) CloseAll();
  }
//+------------------------------------------------------------------+

avatar

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

  • 5 декабря 2016, 21:19
+
0
Цвет свечи может быть любой. Я как то по другому представлял как вы будете делать, я думал вы сделаете типа два счетчика, один подсчитывает тело свечи а другой тень свечи, и если тело и тень свечи как минимум какое то количество пунктов, тогда открывается ордер на открытии новой свече, как то так.
avatar

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

  • 5 декабря 2016, 21:44
+
0
Вроде так тоже нормально, только вот надо убрать распознавание по цвету свечи.
avatar

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

  • 5 декабря 2016, 21:51
+
0
если делать без цвета свечи совсем огроменные условия получаются и у меня где то ошибка закралась и ее не выловишь больно то теперь:


   if((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]<Close[1] && MathAbs(Open[1]-Low[1])>MathAbs(Close[1]-Open[1]))||(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]>Close[1] && MathAbs(Close[1]-Low[1])>MathAbs(Close[1]-Open[1])))
     {
      PutOrder(0,Ask);
     }

   if((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]>Close[1] && MathAbs(High[1]-Open[1])>MathAbs(Close[1]-Open[1]))||((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]<Close[1] && MathAbs(High[1]-Close[1])>MathAbs(Close[1]-Open[1]))))
     {
      PutOrder(1,Bid);
     }
avatar

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

  • 5 декабря 2016, 22:05
+
0
Я пока не знаю, может завтра что то в голову придет.
avatar

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

  • 5 декабря 2016, 22:26
+
0
А еще когда 2 длинных хвоста обратное условие на закрытие приводит к множественным переоткрытиям:


avatar

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

  • 5 декабря 2016, 22:08
+
0
Можно убрать обратное условие на закрытие, главное чтоб по времени закрывалось. Вообще я думал советник использовать для опционов, но пока надо так проверить.
Редактирован: 5 декабря 2016, 22:23
avatar

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

  • 5 декабря 2016, 22:23
+
0
Можно убрать обратное условие на закрытие, главное чтоб по времени закрывалось.


Закрытие по минутам есть, по сигналу можно отключить. Сейчас у меня в таком виде:

//+------------------------------------------------------------------+
//|                                                    TenSvechi.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       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int Slip          = 30;       // реквот
extern int Telo          = 30;       // тело
extern int Ten           = 30;       // тень
extern int CloseTime     = 30;       // >0-закрытие по времени
extern int CloseSig      = 0;        // 1-закрытие по сигналу
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| 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;

   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 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 OpenPos()
  {
   if((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]<Close[1] && MathAbs(Open[1]-Low[1])>MathAbs(Close[1]-Open[1]))||(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]>Close[1] && MathAbs(Close[1]-Low[1])>MathAbs(Close[1]-Open[1])))
     {
      PutOrder(0,Ask);
     }

   if((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]>Close[1] && MathAbs(High[1]-Open[1])>MathAbs(Close[1]-Open[1]))||((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]<Close[1] && MathAbs(High[1]-Close[1])>MathAbs(Close[1]-Open[1]))))
     {
      PutOrder(1,Bid);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()<0)
        {
         lot=OrderLots()*KLot;
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   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((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]>Close[1] && MathAbs(High[1]-Open[1])>MathAbs(Close[1]-Open[1]))||((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]<Close[1] && MathAbs(High[1]-Close[1])>MathAbs(Close[1]-Open[1]))))
                 {
                  CloseAll(0);
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]<Close[1] && MathAbs(Open[1]-Low[1])>MathAbs(Close[1]-Open[1]))||(MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(Open[1]-Low[1])>Ten*Point && Open[1]>Close[1] && MathAbs(Close[1]-Low[1])>MathAbs(Close[1]-Open[1])))
                 {
                  CloseAll(1);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime OrderOpen()
  {
   datetime t=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) t=OrderOpenTime();
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1)
     {
      OpenPos();
     }
   if(CloseSig>0) ClosePos();
   if(TimeCurrent()-OrderOpen()>CloseTime*60 && CloseTime>0) CloseAll();
  }
//+------------------------------------------------------------------+
avatar

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

  • 6 декабря 2016, 11:55
+
0
Спасибо все отлично работает, так как я хотел. Только все таки советник начинает открывать много ордеров когда у свечи две большие тени, а так все в порядке, мне и этого хватает для тестов :) 
avatar

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

  • 6 декабря 2016, 13:38
+
0
Можно разделить эти условия или закоментарить одно из них.
avatar

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

  • 6 декабря 2016, 17:06
+
0
А может чтоб не было такого, советнику добавить условие что закрывать все ордера когда есть более двух открытых ордеров и ждать следующего сигнала.

Хотелось бы это доработать, ну чтоб уже был полноценный советник :) 

avatar

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

  • 6 декабря 2016, 19:06
+
0
Вроде так тоже нормально, только вот надо убрать распознавание по цвету свечи. Вот только я думаю как тогда будет советник распознавать куда открывать ордера *???*  Может как то по максимуму и минимуму свечи, или закрытию и открытию свечи, больше не знаю.
avatar

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

  • 5 декабря 2016, 21:55
+
0
Вот смотрите сколько условий чтобы распознать простейший паттерн


Я о потернах мало знаю, знаю некоторые, не могу помочь в этом.
avatar

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

  • 5 декабря 2016, 21:23
+
0
Можно разделить эти условия или закоментарить одно из них.


Не понял.
avatar

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

  • 6 декабря 2016, 19:07
+
0
Закоментарить прямо в коде:
/*...*/

Разелить:
if(pattern1) ...; и if(pattern2) ...;


if((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]>Close[1] && MathAbs(High[1]-Open[1])>MathAbs(Close[1]-Open[1]))/*||((MathAbs(Close[1]-Open[1])>Telo*Point && MathAbs(High[1]-Open[1])>Ten*Point && Open[1]<Close[1] && MathAbs(High[1]-Close[1])>MathAbs(Close[1]-Open[1])))*/)
avatar

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

  • 7 декабря 2016, 12:00
+
0
Извините я не понимаю как это сделать. Можно вас попросить это сделать.
Редактирован: 7 декабря 2016, 17:41
avatar

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

  • 7 декабря 2016, 17:35

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