Группа "Напишу исправлю советник индикатор MQL4"

Рейтинг 27



просьба добавить в советник который вы сделали еще 2 индикатора MACD и AC (accelerator oscillator) для фильтра при входе в рынок .

forextime добрый день извиняюсь за назойливость не могли бы вы когда у вас будет свободное время добавить в советник еще 2 индикатора MACD и AC(accelerator oscillator) для фильтра при входе в рынок.
popitka signal s 3 vremennih promegutkov.mq4 (26 Kb)

//+------------------------------------------------------------------+
//|          ПОМОШНИК РАБОТАЕТ ТОЛКО ПРИ СИГНАЛЕ СРЕДНИХ.            |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
enum trade
  {
   Auto,  //Авто
   Fixed  //Ручная
  };
//+----------------+
extern trade  MethodTrade = Auto;  //Торговля, выбор МЕНЮ ==>>

extern double Lots        = 0.3;   //Фиксированный лот
extern double MaxLot      = 1.2;   //MAX лот
extern double KLot        = 2.0;   //Увеличение лота

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
extern double ProfitCL    = 200.0;  //Закрыть общий профит $ (=0 откл)
extern double LossCL      = 70.0;   //Общий убыток $ (=0 откл)

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
extern int    TakeProfit  = 220;     //Тейк профит (=0 откл)
extern int    DistNewOrd  = 150;   //Дистанция новый ордер
extern int    MaxOrd      = 3;    //MAX ордеров
int Magic = 777; //Магик ордеров в анализе не учавствует

extern string Ind         = "=== Сигналы индикаторов ==="; //=====================
extern int    BarSignal   = 0;     //Бар сигнала (=0 текущий)

extern string MAfast      = "=== Быстрый MA ==="; //Индикатор ==>>
extern int    FastPeriod  = 77;    //Период
extern int    FastShift   = 1;     //Сдвиг
extern ENUM_MA_METHOD FastMethod    = MODE_EMA;    //Метод
extern ENUM_APPLIED_PRICE FastPrice = PRICE_CLOSE; //Цена

extern string MAslow      = "=== Медленный MA ==="; //Индикатор ==>>
extern int SlowPeriod     = 150;    //Период
extern int SlowShift      = 1;     //Сдвиг
extern ENUM_MA_METHOD SlowMethod    = MODE_EMA;    //Метод
extern ENUM_APPLIED_PRICE SlowPrice = PRICE_CLOSE; //Цена

extern ENUM_TIMEFRAMES TimeFrameMA1 = 5;  //default chart TF
extern ENUM_TIMEFRAMES TimeFrameMA2 = 15; //default chart TF
extern ENUM_TIMEFRAMES TimeFrameMA3 = 30; //default chart TF


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//Убрать сетку при тесте
   if(IsTesting())
      ChartSetInteger(0,CHART_SHOW_GRID,false);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//Если торговля разрешена
   if(IsTradeAllowed())
     {
      //Закрытие ордеров
      if(OP(-1)>0 && //Если есть ордера
         ((PrfOP(-1)>=ProfitCL && ProfitCL!=0.0)|| //Общий профит больше значения
          (PrfOP(-1)<0 && LossCL!=0.0 && MathAbs(PrfOP(-1))>=MathAbs(LossCL))|| //Общий убыток больше значения
          (OP(0)==0 && OP(1)==0))) //Нет открытых рыночных ордеров
         DeleteAll(); //Закрыть и удалить все ордера

      //Если выбран метод торговли АВТО
      if(MethodTrade==Auto)
        {
         //+----------------------------------------------------------------------------------------------------------+
         //| записали условия для входа в сделку . но смотреть надо с старшего тайма и к меньшему .                   |
         //+----------------------------------------------------------------------------------------------------------+
         //Сигнал, факт пересечения быстрой и медленной МА
         int SignalMA=-1;
         if(FastMA(TimeFrameMA1,BarSignal)>SlowMA(TimeFrameMA1,BarSignal)
            && FastMA(TimeFrameMA2,BarSignal)>SlowMA(TimeFrameMA2,BarSignal)
            && FastMA(TimeFrameMA3,BarSignal)>SlowMA(TimeFrameMA3,BarSignal))
            SignalMA=0;

         if(FastMA(TimeFrameMA1,BarSignal)<SlowMA(TimeFrameMA1,BarSignal)
            &&FastMA(TimeFrameMA2,BarSignal)<SlowMA(TimeFrameMA2,BarSignal)
            &&FastMA(TimeFrameMA3,BarSignal)<SlowMA(TimeFrameMA3,BarSignal))
            SignalMA=1;

         //+----------------------------------------------------------------------------------------------------------+
         //| начинаем торговать .условия что нет открытых ордеров                                                     |
         //+----------------------------------------------------------------------------------------------------------+
         //Если нет ордеров, то открыть первый по сигналу МА
         if(OP(-1)==0)
           {
            double TPb=0.0,TPs=0.0;
            if(TakeProfit>0)
              {
               TPs=ND(Bid-TakeProfit*Point,Digits);
               TPb=ND(Ask+TakeProfit*Point,Digits);
              }
            //Открытие 1 раз на текущем баре
            if(NewBar()!=0)
              {
               //Сигнал МА, открыть ордер в направлении
               if(SignalMA==0)
                  Send(OP_BUY,Lots,Ask,0,TPb,Blue);
               if(SignalMA==1)
                  Send(OP_SELL,Lots,Bid,0,TPs,Red);
              }
           }
        }
      //+----------------------------------------------------------------------------------------------------------+
      //| отсюда не чего не трогаем ... начинается переворот                                                       |
      //+----------------------------------------------------------------------------------------------------------+
      //Если есть рыночные ордера то ставить отложенные
      if((OP(0)>0||OP(1)>0) && OP(-1)<MaxOrd)
        {
         //Рассчитать тейк профит для отложенных
         double TPb=0.0,TPs=0.0;
         if(TakeProfit>0)
           {
            TPs=ND(LastPrcOP(0)-(DistNewOrd+TakeProfit)*Point,Digits);
            TPb=ND(LastPrcOP(1)+(DistNewOrd+TakeProfit)*Point,Digits);
           }
         //Поставить отложенный противоположный последнему рыночному
         int Spread=int(((Ask-Bid)/Point)*2); //Дистанция нового ордера должна быть больше спреда *2
         if(DistNewOrd>0 && DistNewOrd>=Spread)
           {
            if(LastTypeOP()==0 && OP(5)==0)
               Send(OP_SELLSTOP,Lot(),ND(LastPrcOP(0)-DistNewOrd*Point,Digits),0,TPs,Magenta);
            if(LastTypeOP()==1 && OP(4)==0)
               Send(OP_BUYSTOP,Lot(),ND(LastPrcOP(1)+DistNewOrd*Point,Digits),0,TPb,Aqua);
           }
        }
     }//IsTradeAllowed END
//-----------------+
  }//  OnTick END    |
//-----------------+
//+------------------------------------------------------------------+
//| Индикатор Moving Average                                         |
//+------------------------------------------------------------------+
double FastMA(int tf, int bar)
  {
   double ma=iMA(Symbol(),tf, FastPeriod,FastShift,FastMethod,FastPrice, bar);
   return(ma);
  }
//+-------------------+
double SlowMA(int tf, int bar)
  {
   double ma=iMA(Symbol(),tf, SlowPeriod,SlowShift,SlowMethod,SlowPrice, bar);
   return(ma);
  }
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int OP(int type=-1)
  {
   int op=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
        {
         if(OrderType()==type||type<0)
            op++;
        }
   return(op);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу                                      |
//+------------------------------------------------------------------+
double PrfOP(int type=-1)
  {
   double pf=0.0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol())
        {
         if(OrderType()==type||type<0)
            pf+=OrderProfit()+OrderCommission()+OrderSwap();
        }
   return(pf);
  }
//+------------------------------------------------------------------+
//| Цена последнего ордера по типу                                   |
//+------------------------------------------------------------------+
double LastPrcOP(int type=-1)
  {
   double prc=0.0;
   datetime t=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
        {
         if((OrderType()==type||type<0) && t<OrderOpenTime())
           {
            t=OrderOpenTime();
            prc=OrderOpenPrice();
           }
        }
   return(prc);
  }
//+------------------------------------------------------------------+
//| Тип последнего ордера                                            |
//+------------------------------------------------------------------+
int LastTypeOP()
  {
   int type=-1;
   datetime t=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
        {
         if(t<OrderOpenTime())
           {
            t=OrderOpenTime();
            type=OrderType();
           }
        }
   return(type);
  }


//+------------------------------------------------------------------+
//| Одно открытие на одном баре if(NewBar()!=0)                      |
//+------------------------------------------------------------------+
int NewBar()
  {
   datetime t=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
        {
         if(t<OrderOpenTime())
            t=OrderOpenTime();
        }
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
        {
         if(t<OrderCloseTime())
            t=OrderCloseTime();
        }
   return(iBarShift(Symbol(),0,t));
  }
//+------------------------------------------------------------------+
//| Расчёт лота                                                      |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=0;
   if(OP(-1)>0)
      lot=ND(Lots*MathPow(KLot,OP(-1)),2);
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| ND - нормализация числа                                          |
//-------------------------------------------------------------------+
double ND(double value, int digits)
  {
   return(NormalizeDouble(value, digits));
  }
//+------------------------------------------------------------------+
//| Открытие, закрытие ордеров                                       |
//+------------------------------------------------------------------+
void Send(int type, double lt, double price, double sl, double tp, color clr)
  {
   int send=0;
   send=OrderSend(Symbol(),type,lt,price,30,sl,tp,"",Magic,0,clr);
   if(send>0)
      Print("Успешно открыт ордер "+TypeToStr(type),", Lot: "+(string)lt,", Ticket: "+(string)send,", Magic: "+(string)Magic);
   else
      Print("Невозможно открыть ордер "+TypeToStr(type),". Ошибка: "+string(GetLastError()));
  }
//+------------------------------------------------------------------+
void DeleteAll()
  {
   color cls=Gray;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
            cls=DeepSkyBlue;
         if(OrderType()==OP_SELL)
            cls=Magenta;
         if(!OrderSelect(OrderTicket(),SELECT_BY_TICKET)||OrderCloseTime()>0)
            return;
         if(OrderType()<2 && !OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,cls))
            Print("Невозможно закрыть ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
         if(OrderType()>1 && !OrderDelete(OrderTicket()))
            Print("Невозможно удалить ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
        }
  }
//+------------------------------------------------------------------+
string TypeToStr(int type)
  {
   switch(type)
     {
      case 0:
         return("Buy");
      case 1:
         return("Sell");
      case 2:
         return("BuyLimit");
      case 3:
         return("SellLimit");
      case 4:
         return("BuyStop");
      case 5:
         return("SellStop");
     }
   return("NONE");
  }
//--------------------------ФИНИШ-----------ФИНИШ-------------------------+
//+-----------------------------------ФИНИШ-------------------------------+
  • +4
  • Просмотров: 2566
  • 4 марта 2022, 13:26
  • eduard9898
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Напишу исправлю советник индикатор MQL4", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Доработка советника
04 февраля 2022
26 апреля 2022

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

+
0
Вроде были попытки самостоятельно обучаться и реализовывать свои идеи))
В коде же есть образец как расписывать индикатор и получать сигнал.
Как можно чему-то научиться если кто-то другой решает задачи?
avatar

  15  forextime Сообщений: 141 - ExpertFX

  • 4 марта 2022, 23:00
+
0
попытался не получилось ок буду пробывать — сделал на 2 таима и попытался выставить MACD.

//+------------------------------------------------------------------+
//| инддюк MACD |
//+------------------------------------------------------------------+
extern string ind3 = "--- MACD ---";
extern int Fast = 21;
extern int Slow = 55;
extern int Signal = 9;
extern int Price_MACD = PRICE_MEDIAN;

//+----------------------------------------------------------------------------------------------------------+
//| записали условия для входа в сделку. но смотреть надо с старшего тайма и к меньшему. |
//+----------------------------------------------------------------------------------------------------------+
//Сигнал, факт пересечения быстрой и медленной МА
int SignalMA=-1;
if(FastMA(TimeFrameMA1,BarSignal)>SlowMA(TimeFrameMA1,BarSignal)
&& FastMA(TimeFrameMA2,BarSignal)>SlowMA(TimeFrameMA2,BarSignal))
//Сигнал индикатора MACD
if( (MACD_2 < Lo_LEVEL || !Buy_Lo_Level) && MACD_1 > MACD_2 && MACD_3 >= MACD_2 ))
//условие для открытия ордера на покупку
SignalMA=0;

if(FastMA(TimeFrameMA1,BarSignal)<SlowMA(TimeFrameMA1,BarSignal)
&&FastMA(TimeFrameMA2,BarSignal)<SlowMA(TimeFrameMA2,BarSignal))
//Сигнал индикатора MACD
if( (MACD_2 > Hi_LEVEL || !Sell_Hi_Level) && MACD_1 < MACD_2 && MACD_3 <= MACD_2 ))
{
//условие для открытия ордера на продажу
SignalMA=1;


Редактирован: 5 марта 2022, 21:04
avatar

  5  eduard9898 Автор Сообщений: 77

  • 5 марта 2022, 21:01
+
0


или правильно так с добовлением tf,

Редактирован: 5 марта 2022, 21:16
avatar

  5  eduard9898 Автор Сообщений: 77

  • 5 марта 2022, 21:11
+
0
переделал



пишет 2 ошибки с скобками — кроме того надо как то чтобы сигналы от средних и от macd — совпадали и давали один сигнал ???
Редактирован: 5 марта 2022, 21:59
avatar

  5  eduard9898 Автор Сообщений: 77

  • 5 марта 2022, 21:48
+
0
1.Вставляйте код через соответствующую функцию — code.
2.Подумайте нужно ли Вам это.
АО = ExtAOBuffer[i]=iMA(NULL,0,PERIOD_FAST,0,MODE_SMA,PRICE_MEDIAN,i)-
iMA(NULL,0,PERIOD_SLOW,0,MODE_SMA,PRICE_MEDIAN,i);

МАСД = ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

Эти индикаторы производные от Ма, а Ма производная от цены.
У Вас уже есть в коде сигналы на основе Ма.
Изучайте как рассчитываются индикаторы, пригодится при торговле, избежите лишней ненужной избыточности в коде и позволит избежать самообмана.
avatar

  16  ssg Сообщений: 817

  • 5 марта 2022, 22:03
+
0
еще раз переделал ошибки не прошли — что то пропускаю
avatar

  5  eduard9898 Автор Сообщений: 77

  • 5 марта 2022, 22:28
+
0
проблемма что вход по средним — как пример правильный — отработал в плюс — закрылся и тут же открывает снова т.к условия по средним остались и в то же время уже начинается откат — результат минус. так вы с самого начала говорили что надо еще для фильтра — вот -дошло.
avatar

  5  eduard9898 Автор Сообщений: 77

  • 5 марта 2022, 22:33
+
0
Лучше добавьте запрет торговли в текущие сутки после получения профита.
avatar

  16  ssg Сообщений: 817

  • 5 марта 2022, 23:05
+
0
т.е 1 сделка в день? тоже вариант.
т.е исходя из опыта смысла добавлять еще что то нет? или есть все таки варианты
avatar

  5  eduard9898 Автор Сообщений: 77

  • 5 марта 2022, 23:21
+
0
Одна закрытая с прибылью сделка в день.
Все Ваши индикаторы — трендовые. Зачем их плодить?
avatar

  16  ssg Сообщений: 817

  • 6 марта 2022, 05:41
+
0
ок. можно и любой другой — принцип прописания то один ??
поэтому и спрашиваю — дополнительный индикатор нужен только для фильтра и чем быстрее он реагирует на цену тем лучше т.к будет изменять условия для входа.

и конечно может быть что даже после того что сделаю дополнение будет и следующее и потом еще
я не пытаюсь найти граль — мне нужен советник — помошник. (на случай если я не у компа )
avatar

  5  eduard9898 Автор Сообщений: 77

  • 6 марта 2022, 07:38
+
0
1.У Вас есть трендовый индикатор который показывает общее движение цены в настоящий момент.
2.Вам нужно на основании этого движения определить наилучший момент входа в позицию. Для этого многие используют импульсные или осциляторные индикаторы на нижнем таймфрейме.
3.Стратегия Вашего советника заключается, по факту, в том, что при определенной просадке открыть противоположенную позиции большим лотом. Расчет на то, что большим лотом возместить убыток предыдущей позиции и получить некоторую прибыль. Допуская несколько переворотов.
4.Следовательно выбор сигнала для открытия позиции отходит на второй план.
Отсюда следует нет необходимости громоздить кучу индикаторы.
Например сигналом для открытия позиции может быть просто время.
avatar

  16  ssg Сообщений: 817

  • 6 марта 2022, 13:04
+
0
вот пример закрыл в + и на том же месте советник снова открыл — что может помочь избежать этого кроме одной сделки в день



и вот результат уходим в минус
Редактирован: 11 марта 2022, 09:12
avatar

  5  eduard9898 Автор Сообщений: 77

  • 11 марта 2022, 08:55
+
0
ВОЗНИКЛА ИДЕЯ — если сделать условия открытия только при пересечении — т.е неважно что происходит — вход только когда есть момент пересечения — тогда получиться что если я в ручную закрою или ордер закроется по тейку то советник будет ждать сигнала от пересечения — и возможно так решиться проблема без добавления еще каких либо индикаторов ???
avatar

  5  eduard9898 Автор Сообщений: 77

  • 11 марта 2022, 10:43
+
0
Это уже реализовано в версии EA2ma_v1
Скачать: www.opentraders.ru/downloads/3244/
Там используется сам факт пересечения двух МА.
А в этой версии берётся направление МА на разных ТФ, а не факт пересечения, все МА в одном направлении, сигнал. Ордер закроется и откроется новый в том же направлении, т.к. сигнал ещё активен.
avatar

  15  forextime Сообщений: 141 - ExpertFX

  • 11 марта 2022, 11:11
комментарий был удален 2022-03-11 11:45:11 eduard9898

+
0
пипец. как в первом классе — пока учитель не ткнет не доходит.
пошел учиться .*wall* 
avatar

  5  eduard9898 Автор Сообщений: 77

  • 11 марта 2022, 11:48

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