Чё та меня уже совсем запутали. Вот 3 функции, каждая из которых получает свой канкретный сигнал по конкретному индюку.
Это функция получает общий сигнал от всех индюков, и принимает решение КУПИТЬ или ПРОДАТЬ.
И вот это функция главная, где получается общий сигнал, тут мы получает значения индюков через цикл, чтоб пройтись есс-но по всем барам.. И потом полученные значения по ссылке передаются в соответствующие ф-ции, где эти значения нужны т.е. в ф-ции:
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
void GetMomentumSignal() , в принципе тоже можно запихнуть туда же.
Таким образом получается, что все рассчёты индюков будут в одной главной ф-ции получения сигнала. Тут же всё логично..
TarasBY:
Виктор! Логика у Вас присутствует, а вот знаний пока маловато. Первое, если не бросите это дело, поможет пойти дальше учебника, а чтобы "победить" второе - с него же (с учебника) и надо пока начинать. Вы не готовы (пока) строить СВОЮ логическую структуру кода, вернитесь к азбучному варианту. P.S. Что "бросается в глаза" в Вашем коде:
в функции GetSignal() для поиска пересечения двух линий МОЖНО использовать цикл for, НО ЛУЧШЕ использовать цикл while, хотя это личные предпочтения. А для начала, чтобы код исполнял Вами озвученное, нужно перенести скобочку, как и в "Казнить, нельзя помиловать". Почему-то в этой (результирующей) функции отсутствуют рузультаты двух функций: GetStochSignal() и GetMomentumSignal(), - это НЕМНОЖКО не логично.
в функциях GetCrossingMa() и GetStochSignal() нет НИКАКОГО смысла передавать параметры по ссылкам, потому, что это имело бы смысл, если бы эти переменные внутри функции МЕНЯЛИ свои значения.
функция void GetMomentumSignal() НИЧЕГО не возвращает.
Хотя я допускаю, что со стороны "хуже видно"... :)))
Вот альтернативный вариант функции, получающей сигналы с МАш(ки)ек:
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+#define BULL 0#define BEAR 1#define STOP -1//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+externint Use_ChangeTrend.MA = 0; // 0 - off; Брать сигнал на смене тренда:
//1 - ТОЛЬКО на первом; 2 - ТОЛЬКО не на первом; 3 - на всехexterndouble MA_K_Period = 3.0; // коэффициент получения периода 2-ой МАшки.externint MA_Period = 14;
/*extern*/int MA_Shift = 0;
externint MA_Method = 7;
externint MA_Price = 7;
/*extern*/int Color_Mode = 0;
int bia_PeriodMA[2];
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+//| Автор : TarasBY, taras_bulba@tut.by |//+-----------------------------------------------------------------------------------+//| Получаем сигнал по наклону MA или по пересечению 2-х MA |//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+int fGet_SignalMA (string fs_Symbol, // Symbolint fi_TF, // Таймфреймdouble fd_Deviation = 0, // расхождение м/у МАшкамиbool fb_ControlBeginChangeTrend = False, // Контроль начала смены трендаint fi_BarSignal = 1, // Бар на котором считываем сигналint fi_VerificationBars = 1) // Количество баров для подтверждения сигнала
{
staticint li_preSignal = STOP;
double lda_MA[2];
bool lb_twice = (MA_K_Period > 1.0), lb_Condition;
int li_BAR = fi_BarSignal, li_Trend = STOP, li_VerificationBars = 0, li_cmd = 1;
//----//---- Если работаем с 2-мя МАшкамиif (lb_twice)
{
for (int li_IND = 0; li_IND < 2; li_IND++)
{lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, bia_PeriodMA[li_IND], MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR);}
//---- На 1-ом проверяемом баре фиксируем расхождение МАшекdouble ld_Deviation = fControl_Deviation (lda_MA, lb_Condition, li_cmd, li_Trend, fd_Deviation);
}
//---- Если работаем с 1-ой МАшкойelse
{
for (li_IND = 0; li_IND < 2; li_IND++)
{lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, MA_Period, MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR + li_IND);}
double ld_Price = fGet_PriceOnBar (PRICE_TYPICAL, fs_Symbol, fi_TF, li_BAR);
//---- На 1-ом проверяемом баре фиксируем расхождение МАшек
ld_Deviation = fControl_Deviation (lda_MA, lb_Condition, li_cmd, li_Trend, fd_Deviation);
if (NDD (li_cmd * (lda_MA[0] - ld_Price)) >= 0.0) return (STOP);
}
//---- Если фиксируем на баре пересечение или горизонтальное расположение МА - выходимif (ld_Deviation == 0.0) return (STOP);
int li_cnt = 0;
while (lb_Condition == true)
{
li_BAR++;
//---- Собираем показания МАшек в массивif (lb_twice)
{
for (li_IND = 0; li_IND < 2; li_IND++)
{lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, bia_PeriodMA[li_IND], MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR);}
bool lb_AddCondition = true;
li_cnt++;
}
else
{
for (li_IND = 0; li_IND < 2; li_IND++)
{lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, MA_Period, MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR + li_IND);}
ld_Price = fGet_PriceOnBar (PRICE_TYPICAL, fs_Symbol, fi_TF, li_BAR);
lb_AddCondition = (NDD (li_cmd * (lda_MA[0] - ld_Price)) < 0.0);
}
//---- Фиксируем расхождение МАшек или наклон 1-ой МА
ld_Deviation = NDD (lda_MA[0] - lda_MA[1]);
//---- Определяем условия контроля пересечения МАшек или изменение наклонаif (li_Trend == BULL) lb_Condition = (ld_Deviation >= 0.0); else lb_Condition = (ld_Deviation <= 0.0);
//---- Производим подсчёт баров, на которых выполняется означенное расхождениеif (lb_AddCondition)
{
if (fd_Deviation != 0.0) {if (MathAbs (ld_Deviation) >= fd_Deviation) li_VerificationBars++;}
else li_VerificationBars++;
}
else li_cnt++;
//---- Если не отслеживаем начало смены трендаif (!fb_ControlBeginChangeTrend) {if (li_VerificationBars == fi_VerificationBars) return (li_Trend);}
else
{
//---- Если баров, на которых выполняются заданные нами условия, > fi_VerificationBars - выходимif (li_VerificationBars > fi_VerificationBars) {li_preSignal = STOP; return (STOP);}
elseif (!lb_Condition)
{
if (li_VerificationBars == fi_VerificationBars) {return (li_Trend);}
//---- Если не набрали нужное количество подтверждений сиганала после пересечения
// или смены наклона - выходимelseif (li_VerificationBars < fi_VerificationBars) return (STOP);
}
}
//---- Предусматриваем уход от зацикливания (на начале отсчёта)if (li_cnt > MA_Period) return (STOP);
}
//----return (STOP);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+//| Автор : TarasBY, taras_bulba@tut.by |//+-----------------------------------------------------------------------------------+//| Контролируем расхождение 2-ух МАшек или наклон 1-ой МАшки |//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+double fControl_Deviation (double ar_MA[], // массив входящих значенийbool& fb_Condition, // состояние трендаint& fi_cmd, // "знак тренда"int& fi_Trend, // трендdouble fd_Deviation = 0) // расхождение м\у МАшками
{
double ld_Deviation = NDD (ar_MA[0] - ar_MA[1]);
//----//---- Если фиксируем на баре пересечение или горизонтальное расположение МА - выходимif (ld_Deviation == 0.0) return (0.0);
//---- Проверяем расхождение на нужную величину (если задано)if (fd_Deviation != 0.0) {if (MathAbs (ld_Deviation) < fd_Deviation) return (0.0);}
if (ld_Deviation > 0.0) {fb_Condition = (ld_Deviation >= 0.0); fi_Trend = BULL;}
else {fb_Condition = (ld_Deviation <= 0.0); fi_Trend = BEAR; fi_cmd = -1;}
//----return (ld_Deviation);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
Как можно понять из комментариев, сигнал можно получить по наклону одной МА (при MA_K_Period <= 1.0) или по пересечению 2-ух МА (при MA_K_Period > 1.0). Период 2-ой Машки расчитывается самостоятельно (за пределами данной функции):
В функции можно задать и условие на расхождение 2-х Машек (при fd_Deviation > 0.0). Также можно отслеживать факт пересечения (fb_ControlBeginChangeTrend = TRUE) или просто фиксировать нахождение Fast и Slow относительно друг друга.
Чтобы посмотреть как работает этот код, в архив положил индикатор, который по сигналам данной функции рисует стрелочки. Запускаемся через шаблон Signal_MA.tpl (для одной МА) или Signal_MA2.tpl (для 2-ух). Кстати, и МАшки могут браться разные.
Вот альтернативный вариант функции, получающей сигналы с МАш(ки)ек:
Как можно понять из комментариев, сигнал можно получить по наклону одной МА (при MA_K_Period <= 1.0) или по пересечению 2-ух МА (при MA_K_Period > 1.0). Период 2-ой Машки расчитывается самостоятельно (за пределами данной функции):
В функции можно задать и условие на расхождение 2-х Машек (при fd_Deviation > 0.0). Также можно отслеживать факт пересечения (fb_ControlBeginChangeTrend = TRUE) или просто фиксировать нахождение Fast и Slow относительно друг друга.
Чтобы посмотреть как работает этот код, в архив положил индикатор, который по сигналам данной функции рисует стрелочки. Кстати, и МАшки могут браться разные.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Он уже спрашивал в другой ветке об этом. Ответили... Но он в коде не понимает - сам писал об этом.
Ему скрипт нужен (готовое решение - нажал клавишу (запустил скрипта) - на экране посмотрел).
Остаётся одно, пригласить его инвестировать наши счета! :))
Остаётся одно, пригласить его инвестировать наши счета! :))
Идея хорошая, но трудно реализуемая
Чё та меня уже совсем запутали. Вот 3 функции, каждая из которых получает свой канкретный сигнал по конкретному индюку.
Это функция получает общий сигнал от всех индюков, и принимает решение КУПИТЬ или ПРОДАТЬ.
И вот это функция главная, где получается общий сигнал, тут мы получает значения индюков через цикл, чтоб пройтись есс-но по всем барам.. И потом полученные значения по ссылке передаются в соответствующие ф-ции, где эти значения нужны т.е. в ф-ции:
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
void GetMomentumSignal() , в принципе тоже можно запихнуть туда же.
Таким образом получается, что все рассчёты индюков будут в одной главной ф-ции получения сигнала. Тут же всё логично..
Виктор! Логика у Вас присутствует, а вот знаний пока маловато. Первое, если не бросите это дело, поможет пойти дальше учебника, а чтобы "победить" второе - с него же (с учебника) и надо пока начинать. Вы не готовы (пока) строить СВОЮ логическую структуру кода, вернитесь к азбучному варианту.
P.S. Что "бросается в глаза" в Вашем коде:
в функции GetSignal() для поиска пересечения двух линий МОЖНО использовать цикл for, НО ЛУЧШЕ использовать цикл while, хотя это личные предпочтения. А для начала, чтобы код исполнял Вами озвученное, нужно перенести скобочку, как и в "Казнить, нельзя помиловать". Почему-то в этой (результирующей) функции отсутствуют рузультаты двух функций: GetStochSignal() и GetMomentumSignal(), - это НЕМНОЖКО не логично.
в функциях GetCrossingMa() и GetStochSignal() нет НИКАКОГО смысла передавать параметры по ссылкам, потому, что это имело бы смысл, если бы эти переменные внутри функции МЕНЯЛИ свои значения.
функция void GetMomentumSignal() НИЧЕГО не возвращает.
Хотя я допускаю, что со стороны "хуже видно"... :)))
Вот альтернативный вариант функции, получающей сигналы с МАш(ки)ек:
Как можно понять из комментариев, сигнал можно получить по наклону одной МА (при MA_K_Period <= 1.0) или по пересечению 2-ух МА (при MA_K_Period > 1.0). Период 2-ой Машки расчитывается самостоятельно (за пределами данной функции):
В функции можно задать и условие на расхождение 2-х Машек (при fd_Deviation > 0.0). Также можно отслеживать факт пересечения (fb_ControlBeginChangeTrend = TRUE) или просто фиксировать нахождение Fast и Slow относительно друг друга.
Чтобы посмотреть как работает этот код, в архив положил индикатор, который по сигналам данной функции рисует стрелочки. Запускаемся через шаблон Signal_MA.tpl (для одной МА) или Signal_MA2.tpl (для 2-ух). Кстати, и МАшки могут браться разные.
Вот альтернативный вариант функции, получающей сигналы с МАш(ки)ек:
Как можно понять из комментариев, сигнал можно получить по наклону одной МА (при MA_K_Period <= 1.0) или по пересечению 2-ух МА (при MA_K_Period > 1.0). Период 2-ой Машки расчитывается самостоятельно (за пределами данной функции):
В функции можно задать и условие на расхождение 2-х Машек (при fd_Deviation > 0.0). Также можно отслеживать факт пересечения (fb_ControlBeginChangeTrend = TRUE) или просто фиксировать нахождение Fast и Slow относительно друг друга.
Чтобы посмотреть как работает этот код, в архив положил индикатор, который по сигналам данной функции рисует стрелочки. Кстати, и МАшки могут браться разные.
Захотите ускорить работу индикатора - обращайтесь
Захотите ускорить работу индикатора - обращайтесь
Доброго дня! Модификация ордера-ошибка 4051. Час ужу думаю. Ну вроде верный там параметр!!! Короче, побуквено. Параметр цена- цена открытия ордера, OrderOpenPrice(), стандартно.
Стоп несём на 10 пунктов ниже цены открытия ордера, а цену запромнили. Запомнили в переменной tsena , при открытии ордера.
Ордеров два, один с профитом другой без. Вот, вроде понятно расказал. Откуда ошибка?? Что же ему ещё?
Да, условие вроде понятно, хоть это уже не к делу. Тоесть, цена ушла на 30 пунктов-условие сработало.( tsena+30*Point ).
Носим один раз perenos=true; Эти условия собственно вроде работают.
Сам уж не знаю как думать.
Собственно Носим один раз perenos=true; Эти условия наблюдать-то и не пришлось, т.к. никуда и не носит.
Там собствено есть ещё нималоважный параметр-тикет. Однако я его присваиваю переменной так int tacket=OrderSend и так int tucket=OrderSend,
а использую соотвецтвено так OrderModify( tacket, и короче формально я ошибки там как бы не вижу!!!
Во, блин... 2012.11.14 22:40:17 2012.08.16 15:30 василийпрр EURGBP,M30: 1Error 0 tacket 5 то есть ордер откріли, тикет присвоили.
А чуть дальше он уже равен нолю! То есть внутри следующего участка кода, что занимается модификацией.
2012.11.14 23:05:27 2012.08.17 11:03 василийпрр EURGBP,M30: tacket 0 OrderOpenPrice() 0.7845 tsena-10*Point 0.7835 OrderTakeProfit() 0.789
Вне указаного віше участка кода переменная вобще не играет!
Не могу раскладку украинскую сминить никакой комбинацией клавиш, а написана вопще русская!
Там собствено есть ещё нималоважный параметр-тикет. Однако я его присваиваю переменной так int tacket=OrderSend и так int tucket=OrderSend,
а использую соотвецтвено так OrderModify( tacket, и короче формально я ошибки там как бы не вижу!!!
Повидимому, ДЦ не принимает сразу с СЛ и ТП. После открытия модифицируйте СЛ и ТП. И 2ю позицию надо открывать не сразу, со следущим тиком!