собрал индикатор который должен давать сигнал при пересечении мувингов на 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);
}
//+------------------------------------------------------------------+
Комментарии (13)
Во вторых исследуется только текущий символ, остальные символы не задействованы в анализе МА.
и т.д.
15 forextime Сообщений: 141 - ExpertFX
6 eduard9898 Автор Сообщений: 81
«Это я должен видеть!!!
Лобачевский отдыхает!!!
16 ssg Сообщений: 817
Сигнал стрелки по пересечению 3 МА
В сигнале участвует текущая валютная пара + дополнительные 3 валютные пары
Скачать: www.opentraders.ru/downloads/3237/
Редактировать: forex-time@mail.ru
15 forextime Сообщений: 141 - ExpertFX
Вы же сами это знаете.Много лет назад народ рисовал вееры из 10-20 Ма.
Причем у Вас в коде
выражение
можно убрать по определению исходя из логики:
если a>b && b>c следовательно a>c.
Мне было интересно посмотреть именно на пересечение.
16 ssg Сообщений: 817
Поэтому и берётся результат начальной последовательности линий в правильном порядке. Как только все выстроились в нужном направлении, сразу появляется сигнальная стрелка и когда появится разнонаправленность, сигнал снова ожидает правильность построения линий, таким образом можно по тренду заходить не однократно с каждой новой стрелкой.
P.S. если нужен факт пересечения, то требуется поправить условие
Пример:
MA1_Buffer[i]>MA2_Buffer[i] && MA1_Buffer[i+1]<=MA2_Buffer[i+1] Редактирован: 28 января 2022, 11:48
15 forextime Сообщений: 141 - ExpertFX
Мне было интересно увидеть графически именно пересечение трех средних
Но у автора условия для работы.
1. 3 средних должны пересечься одновременно на 4 парах в одну и ту же сторону (sell или buy )
Так что Ваше предположение
это только Ваше предположение.
Возможно автор это и имел ввиду. Я только обратил внимание на не корректность постановки задачи и как следствие Ваш код с Вашими домыслами.
Вот так и рождаются разногласия между желаниями и реальным кодом.
Посмотрите здесь:http://zakaz.opentraders.ru/66502.html
Я написал по пожеланию того же автора индикатор аж на 6 пар и при этом предложил стратегию его использования.
16 ssg Сообщений: 817
советник на эту тему работает только на одну сделку и призакрытии первой тут же открывает следущую т.к условия сохраняются и получаеться не очень хорошо — так решил продолжать в ручную а индикатор должен звонить когда есть условия и входить в рынок.
СПАСИБО за индюк буду эксперементировать. можно добавить вместо стрелок чтобы выскакивало окно с надписью все пары идут на север или на юг
результат за один день на демо без стопов и тейков с условием общего движения
6 eduard9898 Автор Сообщений: 81
Для ограничения кол-ва позиций можно добавить например условие — одна сделка на бар.
16 ssg Сообщений: 817
6 eduard9898 Автор Сообщений: 81
6 eduard9898 Автор Сообщений: 81
Поэтому стрелка может быть в разных местах а не конкретно по факту пересечения МА текущей пары.
Так же по тренду может быть множество стрелок одно типа, т.к. линии МА были в одном направлении, далее разнонаправлены и далее снова в одном направлении.
15 forextime Сообщений: 141 - ExpertFX
6 eduard9898 Автор Сообщений: 81
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий