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

Рейтинг 27



индикатор должен писать и звонить на мт4 при пересечении 3 -х средних на 4 парах союзниках в одну сторону (sell или buy ) одновременно.

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

можно это чудо заставить работать как надо???

условия для работы.
1. 3 средних должны пересечься одновременно на 4 парах в одну и ту же сторону (sell или buy )
2. дать сигнал звуковой и письменный.
3. если есть возможность блокировать альты от других индикаторов (по возможности )

signal pri peressechenii srednih na 4 parah.mq4 (15 Kb)


//+------------------------------------------------------------------+
//|                   сигнал при перессечении средних на 4 парах.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4

//---- plot Line
#property indicator_label4  "ARROW"
#property indicator_color4  clrOrange

#property indicator_label3  "MA3"
#property indicator_color3  clrYellow

#property indicator_label2  "MA2"
#property indicator_color2  clrMagenta

#property indicator_label1  "MA1"
#property indicator_color1  clrAqua
enum name_MA_method {
   Simple,
   Exponential,
   Smoothed,
   Linear_Weighted,
};
enum name_MA_price {
   CLOSE,
   OPEN,
   HIGH,
   LOW,
   MEDIAN,
   TYPICAL,
   WEIGHTED,
};
//+------------------------------------------------------------------+
//| валютные пары для работы                                         |
//+------------------------------------------------------------------+
input string s1="GBPUSD";
input string s2="EURUSD";
input string s3="AUDUSD";
input string s4="NZDUSD";
input ENUM_TIMEFRAMES tf=PERIOD_M1;
//+------------------------------------------------------------------+
//| мувинги  для работы                                              |
//+------------------------------------------------------------------+
//------- Внешние параметры -----------------------------------------+
extern bool           Alert_Sound       = true;
extern bool           showAlert         = true;        // Показывать алерт
input  string         name_MA1          = "______________MA_1________________"; // параметры MA 1
extern int            ma1_period        = 6;           // Период
extern int            ma1_shift         = 0;           // Сдвиг
extern name_MA_method ma1_method        = Exponential; // Метод MA
extern name_MA_price  ma1_applied_price = CLOSE;       // Применить к
input  string         name_MA2          = "______________MA_2________________"; // параметры MA 2
extern int            ma2_period        = 14;          // Период
extern int            ma2_shift         = 0;           // Сдвиг
extern name_MA_method ma2_method        = Exponential; // Метод MA
extern name_MA_price  ma2_applied_price = CLOSE;       // Применить к
input  string         name_MA3          = "______________MA_3________________"; // параметры MA 3
extern int            ma3_period        = 26;          // Период
extern int            ma3_shift         = 0;           // Сдвиг
extern name_MA_method ma3_method        = Exponential; // Метод MA
extern name_MA_price  ma3_applied_price = CLOSE;       // Применить к
//+------------------------------------------------------------------+
input int bars=11111;
double up[],dn[];


//------- Глобальные переменные советника -------------------------------------+
string   Symb;
int      maxPeriod;
datetime timePrev    = -1;
//--- indicator buffers
double MA1_Buffer[], MA2_Buffer[], MA3_Buffer[], arrow_Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(3, arrow_Buffer);
   SetIndexStyle (3, DRAW_ARROW, 252, 2);
   
   SetIndexBuffer(2, MA3_Buffer);
   SetIndexStyle (2, DRAW_LINE, 0, 1);
   
   SetIndexBuffer(1, MA2_Buffer);
   SetIndexStyle (1, DRAW_LINE, 0, 1);
   
   SetIndexBuffer(0, MA1_Buffer);
   SetIndexStyle (0, DRAW_LINE, 0, 1);  
   
   
   maxPeriod = ma1_period;
   if(ma2_period>maxPeriod) maxPeriod = ma2_period;
   if(ma3_period>maxPeriod) maxPeriod = ma3_period;
   
   Symb = Symbol();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated==0) {
     for(int i=rates_total-maxPeriod-1; i>0; i--) {
       MA1_Buffer[i] = iMA(Symb, 0, ma1_period, ma1_shift, method_MA(ma1_method), price_MA(ma1_applied_price), i);
       MA2_Buffer[i] = iMA(Symb, 0, ma2_period, ma2_shift, method_MA(ma2_method), price_MA(ma2_applied_price), i);
       MA3_Buffer[i] = iMA(Symb, 0, ma3_period, ma3_shift, method_MA(ma3_method), price_MA(ma3_applied_price), i);
       arrow_Buffer[i] = EMPTY_VALUE;
       
       if (crossMA (i)) arrow_Buffer[i] = MA1_Buffer[i];
     }
   }
   MA1_Buffer[0] = iMA(Symb, 0, ma1_period, ma1_shift, method_MA(ma1_method), price_MA(ma1_applied_price), 0);
   MA2_Buffer[0] = iMA(Symb, 0, ma2_period, ma2_shift, method_MA(ma2_method), price_MA(ma2_applied_price), 0);
   MA3_Buffer[0] = iMA(Symb, 0, ma3_period, ma3_shift, method_MA(ma3_method), price_MA(ma3_applied_price), 0);
   
   if(timePrev!=Time[0]) arrow_Buffer[0] = EMPTY_VALUE;
   if (crossMA (0)) {
     arrow_Buffer[0] = MA1_Buffer[0];
     if(timePrev!=Time[0]) {
       timePrev=Time[0];
       if(showAlert) Alert                    ("Пара "," Symb, "" - пересечение трех MA!" ," должно писать когда все 4 пары в одном направлении");
       
       Print                                  ("Пересечение трех MA!"" должно писать когда все 4 пары в одном направлении");
     }
   }

   return(rates_total);
  }
//+------------------------------------------------------------------+
bool crossMA (int i) {
   double pr1, pr2, pr3;
   int _pr1, _pr2, _pr3;
   if(Close[i]>Open[i]) {
     if(MA1_Buffer[i]<=Close[i] && MA1_Buffer[i]>=Open[i] && MA2_Buffer[i]<=Close[i] && MA2_Buffer[i]>=Open[i] && MA3_Buffer[i]<=Close[i] && MA3_Buffer[i]>=Open[i]) {
       pr1=MA1_Buffer[i]/Point; _pr1 = (int)(MathRound(pr1));
       pr2=MA2_Buffer[i]/Point; _pr2 = (int)(MathRound(pr2));
       pr3=MA3_Buffer[i]/Point; _pr3 = (int)(MathRound(pr3));
           
       if(_pr1==_pr2 && _pr2==_pr3) {
         return (true);
       }
     }
   }
   if(Open [i]>Close[i]){
     if(MA1_Buffer[i]>=Close[i] && MA1_Buffer[i]<=Open[i] && MA2_Buffer[i]>=Close[i] && MA2_Buffer[i]<=Open[i] && MA3_Buffer[i]>=Close[i] && MA3_Buffer[i]<=Open[i]) {
       pr1=MA1_Buffer[i]/Point; _pr1 = (int)(MathRound(pr1));
       pr2=MA2_Buffer[i]/Point; _pr2 = (int)(MathRound(pr2));
       pr3=MA3_Buffer[i]/Point; _pr3 = (int)(MathRound(pr3));
           
       if(_pr1==_pr2 && _pr2==_pr3) {
         return (true);
       }
     }
   }
   return (false);
}
//+------------------------------------------------------------------+
int method_MA (name_MA_method method) {
  switch (method) {
    case Simple:          return(0);
    case Exponential:     return(1);
    case Smoothed:        return(2);
    case Linear_Weighted: return(3);
  }
  return(0);
}
int price_MA (name_MA_price applied_price) {
  switch (applied_price) {
    case CLOSE:     return(0);
    case OPEN:      return(1);
    case HIGH:      return(2);
    case LOW:       return(3);
    case MEDIAN:    return(4);
    case TYPICAL:   return(5);
    case WEIGHTED:  return(6);
  }
  return(0);
}
//+------------------------------------------------------------------+
  • +6
  • Просмотров: 3005
  • 27 января 2022, 10:54
  • eduard9898
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Во первых нет факта пересечения линий.
Во вторых исследуется только текущий символ, остальные символы не задействованы в анализе МА.
и т.д.
avatar

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

  • 27 января 2022, 12:04
+
0
так я и с этим и не могу разобраться. я пробывал вписать все пары но выскакивает много ошибок. поэтому и прошу помочь.
Редактирован: 27 января 2022, 15:33
avatar

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

  • 27 января 2022, 15:30
+
0
Покажите на графике как пересекаются одновременно три средние с разными периодами на одной паре.
«Это я должен видеть!!!:) »
Лобачевский отдыхает!!! ;) 
avatar

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

  • 27 января 2022, 21:41
+
0
Индикатор Symbols3MA
Сигнал стрелки по пересечению 3 МА
В сигнале участвует текущая валютная пара + дополнительные 3 валютные пары
Скачать: www.opentraders.ru/downloads/3237/
Редактировать: forex-time@mail.ru


Редактирован: 27 января 2022, 23:29
avatar

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

  • 27 января 2022, 23:24
+
0
У Вас средние не пересекаются одновременно, а выстраиваются друг над другом.
Вы же сами это знаете.Много лет назад народ рисовал вееры из 10-20 Ма.
Причем у Вас в коде

 bool MAbuy=(MA1_Buffer[i]>MA2_Buffer[i] && MA1_Buffer[i]>MA3_Buffer[i] && MA2_Buffer[i]>MA3_Buffer[i] &&

выражение

 MA1_Buffer[i]>MA3_Buffer[i]

можно убрать по определению исходя из логики:
если a>b && b>c следовательно a>c.
Мне было интересно посмотреть именно на пересечение.
avatar

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

  • 28 января 2022, 05:59
+
0
Если ловить сам факт пересечения 3-х линий, да ещё и одновременно с 3-х пар дополнительно, то сигнальной стрелки ни когда не будет в принципе.
Поэтому и берётся результат начальной последовательности линий в правильном порядке. Как только все выстроились в нужном направлении, сразу появляется сигнальная стрелка и когда появится разнонаправленность, сигнал снова ожидает правильность построения линий, таким образом можно по тренду заходить не однократно с каждой новой стрелкой.
P.S. если нужен факт пересечения, то требуется поправить условие
Пример:
MA1_Buffer[i]>MA2_Buffer[i] && MA1_Buffer[i+1]<=MA2_Buffer[i+1]
Редактирован: 28 января 2022, 11:48
avatar

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

  • 28 января 2022, 11:46
+
0
Да я то это все понимаю и знаю как прописать пересечение двух средних.
Мне было интересно увидеть графически именно пересечение трех средних:) 
Но у автора условия для работы.
1. 3 средних должны пересечься одновременно на 4 парах в одну и ту же сторону (sell или buy )
Так что Ваше предположение
Поэтому и берётся результат начальной последовательности линий в правильном порядке.

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

Посмотрите здесь:http://zakaz.opentraders.ru/66502.html
Я написал по пожеланию того же автора индикатор аж на 6 пар и при этом предложил стратегию его использования.
avatar

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

  • 28 января 2022, 12:23
+
0
ДА это не принципиально пусть будет две средние главное чтобы было общее движение и квакало погромче



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

СПАСИБО за индюк буду эксперементировать. можно добавить вместо стрелок чтобы выскакивало окно с надписью все пары идут на север или на юг *drinks* 

результат за один день на демо без стопов и тейков с условием общего движения

Редактирован: 28 января 2022, 16:42
avatar

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

  • 28 января 2022, 15:02
+
0
Тогда как закрываются позиции? По коду советника остается только трал:

 if(TrailingStop>0)
      TrailingAll();

   if(CountTrades()<1)
     {
      if(buy)
        {
         PutOrder(0,Ask);
         Alert(_Symbol+" Buy!");
        }
      if(sell)
        {
         PutOrder(1,Bid);
         Alert(_Symbol+" Sell!");
        }
     }

Для ограничения кол-ва позиций можно добавить например условие — одна сделка на бар.
avatar

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

  • 28 января 2022, 17:03
+
0
у меня стоит советник для ограничения убытка так поэтому не видно стопов и тейка


Редактирован: 29 января 2022, 20:09
avatar

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

  • 29 января 2022, 20:05
+
0
извеняюсь можно проверить или так индикатор должен работать ?
avatar

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

  • 30 января 2022, 09:37
+
0
Стрелка появится когда у всех вал.пар будет одно направление 3-х МА
Поэтому стрелка может быть в разных местах а не конкретно по факту пересечения МА текущей пары.
Так же по тренду может быть множество стрелок одно типа, т.к. линии МА были в одном направлении, далее разнонаправлены и далее снова в одном направлении.
avatar

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

  • 31 января 2022, 11:17
+
0
это я как раз понимаю. значит надо думать как сделать чтобы сигналы были более точными.
*bravo* 
avatar

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

  • 1 февраля 2022, 09:11

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