Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 34
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Покажите весь ваш индикатор - глянем что там не так.
Спасибо.
Вот он
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LawnGreen
#property indicator_color2 DeepPink
#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
extern string Stochastic = "Configure Stochastic Settings";
extern int TimeFrame1=1;
extern int KPeriod = 5;
extern int DPeriod = 3;
extern int Slowing = 3;
extern int OverBought = 80;
extern int OverSold = 20;
extern int TimeFrame2=5;
extern int KPeriod1 = 5;
extern int DPeriod1 = 3;
extern int Slowing1 = 3;
extern int OverBought1 = 55;
extern int OverSold1 = 45;
extern string Alerts = "Configure Alerts";
extern bool PopUpAlert = true; //Popup Alert
extern bool EmailAlert = true; //Email Alert
extern bool PushAlert = true; //Push Notifications Alert
// UP and DOWN Buffers
double UP[];
double DOWN[];
// Distance of arrows from the high or low of a bar
int distance = 3;
double MyPoint;
datetime CTime;
int OnInit()
{
//--- indicator buffers mapping
//UP Arrow Buffer
SetIndexEmptyValue(0,0.0);
SetIndexStyle(0,DRAW_ARROW,0,EMPTY);
SetIndexArrow(0,233);
SetIndexBuffer(0,UP);
//DOWN Arrow Buffer
SetIndexEmptyValue(1,0.0);
SetIndexStyle(1,DRAW_ARROW,0,EMPTY);
SetIndexArrow(1,234);
SetIndexBuffer(1,DOWN);
//Auto Adjustment for broker digits
if (Digits()==5||Digits()==3){MyPoint=Point*10;} else{MyPoint=Point;}
CTime=Time[0];
//---
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
//--- delete an object from a chart
Comment("");
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,TimeFrame1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,TimeFrame1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,TimeFrame2,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,TimeFrame2,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50&&Stoch50_1>Stoch50_2)
{
UP[i]=Low[i]-distance*MyPoint;
}
if(Stoch1<80 && Stoch2>80&&Stoch50_1<50&&Stoch50_1<Stoch50_2)
{
DOWN[i]=High[i]+distance*MyPoint;
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Спасибо.
Вот он
...
Уточню.
Хочу поставить стрелку вверх если линия индикатора пересекла уровень 20, на периоде М1, и линия индикатора направлена вверх, находится выше уровня 50 , на периоде М5.
Давайте посмотрим как значения получить со старшего таймфрейма, находясь на младшем:
//| iTwoStoch.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot UP
#property indicator_label1 "UP"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrLawnGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot DN
#property indicator_label2 "DN"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrDeepPink
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- enums
enum enumYN
{
enYes=1, // Да
enNo=0, // Нет
};
//--- input parameters
extern string Stochastic1 = "Параметры стохастика 1";
input ENUM_TIMEFRAMES TimeFrame1 = PERIOD_M1; // Таймфрейм
input int KPeriod1 = 5; // Период %K
input int DPeriod1 = 3; // Период %D
input int Slowing1 = 3; // Замедление
input double OverBought1 = 80; // Уровень перекупленности
input double OverSold1 = 20; // Уровень перепроданности
extern string Stochastic2 = "Параметры стохастика 2";
input ENUM_TIMEFRAMES TimeFrame2 = PERIOD_M5; // Таймфрейм
input int KPeriod2 = 5; // Период %K
input int DPeriod2 = 3; // Период %D
input int Slowing2 = 3; // Замедление
input double OverBought2 = 55; // Уровень перекупленности
input double OverSold2 = 45; // Уровень перепроданности
extern string Alerts = "Configure Alerts";
input enumYN UsePopUpAlert = enYes; // Popup Alert
input enumYN UseEmailAlert = enYes; // Email Alert
input enumYN UsePushAlert = enYes; // Push Notifications Alert
//--- indicator buffers
double BufferUP[];
double BufferDN[];
//--- global variables
int kperiod1; // Период %K стох.1
int dperiod1; // Период %D стох.1
int slowing1; // Замедление стох.1
double overBought1; // Уровень перекупленности стох.1
double overSold1; // Уровень перепроданности стох.1
//---
int kperiod2; // Период %K стох.2
int dperiod2; // Период %D стох.2
int slowing2; // Замедление стох.2
double overBought2; // Уровень перекупленности стох.2
double overSold2; // Уровень перепроданности стох.2
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferUP);
SetIndexBuffer(1,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
SetIndexArrow(0,233);
SetIndexArrow(1,234);
//---
kperiod1=(KPeriod1<1?1:KPeriod1);
kperiod2=(KPeriod2<1?1:KPeriod2);
dperiod1=(DPeriod1<1?1:DPeriod1);
dperiod2=(DPeriod2<1?1:DPeriod2);
slowing1=(Slowing1<1?1:Slowing1);
slowing2=(Slowing2<1?1:Slowing2);
//---
overBought1=(OverBought1>100.0?100.0:OverBought1<0.1?0.1:OverBought1);
overSold1=(OverSold1<0?0:OverSold1>99.9?99.9:OverSold1);
if(overBought1<=overSold1) overBought1=overSold1+0.1;
if(overSold1>=overBought1) overSold1=overBought1-0.1;
//---
overBought2=(OverBought2>100.0?100.0:OverBought2<0.1?0.1:OverBought2);
overSold2=(OverSold2<0?0:OverSold2>99.9?99.9:OverSold2);
if(overBought2<=overSold2) overBought2=overSold2+0.1;
if(overSold2>=overBought2) overSold2=overBought2-0.1;
//---
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(rates_total<2) return(0);
int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-2;
ArrayInitialize(BufferUP,EMPTY_VALUE);
ArrayInitialize(BufferDN,EMPTY_VALUE);
}
for(int i=limit; i>=0; i--) {
int bar_sto2_0=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i));
int bar_sto2_1=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i+1));
double sto1_0=iStochastic(Symbol(),TimeFrame1,kperiod1,dperiod1,slowing1,MODE_SMA,STO_LOWHIGH,MODE_MAIN,i);
double sto1_1=iStochastic(Symbol(),TimeFrame1,kperiod1,dperiod1,slowing1,MODE_SMA,STO_LOWHIGH,MODE_MAIN,i+1);
double sto2_0=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_SMA,STO_LOWHIGH,MODE_MAIN,bar_sto2_0);
double sto2_1=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_SMA,STO_LOWHIGH,MODE_MAIN,bar_sto2_1);
Comment(
"\n",
"Stoch ",EnumToString(TimeFrame1),
", бар ",(i+1)," > время: ",TimeToString(time[i+1],TIME_MINUTES),", значение: ",DoubleToString(sto1_1,Digits()),
"; бар ",i," > время: ",TimeToString(time[i],TIME_MINUTES),", значение: ",DoubleToString(sto1_0,Digits()),"\n",
//---
"Stoch ",EnumToString(TimeFrame2),
", бар ",bar_sto2_1," > время: ",TimeToString(iTime(Symbol(),TimeFrame2,bar_sto2_1),TIME_MINUTES),", значение: ",DoubleToString(sto2_1,Digits()),
"; бар ",bar_sto2_0," > время: ",TimeToString(iTime(Symbol(),TimeFrame2,bar_sto2_0),TIME_MINUTES),", значение: ",DoubleToString(sto2_0,Digits())
);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
А дальше попробуйте вместо Comment() сделать логику, которую хотите.
Поглядим...
Давайте посмотрим как значения получить со старшего таймфрейма, находясь на младшем:
А дальше попробуйте вместо Comment() сделать логику, которую хотите.
Поглядим...
Спасибо, всё получилось )
В советнике, при вызове индикатора, достаточно просто указать число нужного таймфрейма, а в индикаторе “пляски” со сдвигом. Где об этом почитать подробнее?
Спасибо, всё получилось )
В советнике, при вызове индикатора, достаточно просто указать число нужного таймфрейма, а в индикаторе “пляски” со сдвигом. Где об этом почитать подробнее?
Нигде не читал об этом - не подскажу даже.
Ну вот сами представьте себе: вы идёте в цикле по барам на М1. Берёте значения индикатора с номера бара, на который ссылается индекс цикла i.
В табличке в заголовке вверху индекс цикла М1, ниже - значение времени бара, на которое ссылается индекс М1
В самом низу индекс цикла М5, выше - значение времени бара, на которое ссылается индекс М5
Вот когда вы передаёте в функцию iCustom() значение индекса с текущего тф, на котором цикл, то получаете значения индикатора со старшего тф по индексу. А индекс не ссылается на нужный вам бар, что и видно из таблички.
И так нужно поступать и в советниках, иначе - вы берёте значения не с ожидаемого бара, а думаете, что получили его верно. Получили-то верно, но не с того бара. Это нужно знать и учитывать.
Т.е., при мультитаймовом получении данных нужно опираться на время, и пересчитывать его в номер бара на нужном тф.
Артём, помогите и мне пожалуйста, с индикаторами у меня проблемы.
Нужно найти вот такие конструкции, и поставить на них стрелки, функции в советнике работают и подключаются просто, ну это и понятно - там нужны только текущие значения, а вот как их перенести в индикатор, чтоб рисовал совпадения на истории...?
Стрелки рисовать на свече, сразу при совпадении условия: High[1] и Low[1]
//| iTwo.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot UP
#property indicator_label1 "UP"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrLawnGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot DN
#property indicator_label2 "DN"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrDeepPink
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1;
input string dSymbol = "AUDUSD";
//--- indicator buffers
double BufferUP[];
double BufferDN[];
//--- global variables
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferUP);
SetIndexBuffer(1,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
SetIndexArrow(0,233);
SetIndexArrow(1,234);
//---
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(rates_total<2) return(0);
int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-2;
ArrayInitialize(BufferUP,EMPTY_VALUE);
ArrayInitialize(BufferDN,EMPTY_VALUE);
}
int NumFrUp = GetFractalBar(dSymbol,PERIOD_CURRENT,0,MODE_UPPER); // номер бара Up
int NumFrDn = GetFractalBar(dSymbol,PERIOD_CURRENT,0,MODE_LOWER); // номер бара Dn
Comment( "Bear: " , GetBearBull(dSymbol, TimeFrame, 3) == 1, // Подряд 3 бара вверх
"\nBull: ", GetBearBull(dSymbol, TimeFrame, 3) == 2, // Подряд 3 бара вниз
"\nNumFrUp: " , NumFrUp, // номер бара Up
"\nNumFrDn: ", NumFrDn, // номер бара Dn
"\nPriceFrUp: " ,iHigh(dSymbol,PERIOD_CURRENT,NumFrUp), // Цена верхнего фрактала
"\nPriceDn: ", iLow(dSymbol,PERIOD_CURRENT,NumFrDn) // Цена нижнего фрактала
);
for(int i=limit; i>=0; i--) {
//--
if(/* что сюда */0)
{
BufferUP[i]=Low[i]-50*_Point;
}
//--
if(/* что сюда */0)
{
BufferDN[i]=High[i]+50*_Point;
}
} // end for
//--- return value of prev_calculated for next call
return(rates_total);
}
//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
for(int i=3; i<iBars(symb, tf)-1; i++) {
if(mode==MODE_LOWER){
f=iFractals(symb, tf, MODE_LOWER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}
if(mode==MODE_UPPER){
f=iFractals(symb, tf, MODE_UPPER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}}
return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
double open1=0,close1=0,open2=0,close2=0;
int b=1,s=1;
for(int i=1; i<ne; i++) {
open1=iOpen(symb,tf,i);
close1=iClose(symb,tf,i);
open2= iOpen(symb,tf,i+1);
close2= iClose(symb,tf,i+1);
if(open2<close2 && open1<close1 && open2<open1) { // бычьи
b++;
if(b==ne) { return(1);}
}
if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
s++;
if(s==ne) { return(2);}
}
}
return(0);
}
//===============================================================================================
Потом по аналогии буду пробовать вписывать другие паттерны, чтоб не гонять советники.
Спасибо!
Артём, помогите и мне пожалуйста, с индикаторами у меня проблемы.
Нужно найти вот такие конструкции, и поставить на них стрелки, функции в советнике работают и подключаются просто, ну это и понятно - там нужны только текущие значения, а вот как их перенести в индикатор, чтоб рисовал совпадения на истории...?
Стрелки рисовать на свече, сразу при совпадении условия: High[1] и Low[1]
...
Потом по аналогии буду пробовать вписывать другие паттерны, чтоб не гонять советники.
Спасибо!
Для разных паттернов - своя логика должна быть, ведь не все они одинаковы. Да и для одного и того же паттерна разные программисты напишут по-разному логику.
А что именно, какой паттерн, вы хотите определять?
Начнём с этого.
Для разных паттернов - своя логика должна быть, ведь не все они одинаковы. Да и для одного и того же паттерна разные программисты напишут по-разному логику.
А что именно, какой паттерн, вы хотите определять?
Начнём с этого.
Картинку прикрепил.
Нужно условие: фрактал "3" выше фрактала "2", и фрактал "1" выше "2" - FrDn3 > FrDn2 && FrDn2 < FrDn1 При этом смотрим свечи, фракталы уже образовались, и ждут подтверждения свечной модели,
и если есть "3" подряд растущие - покупка (стрелка) - GetBearBull(dSymbol,0,3)==1 (1 - покупка)
Для продаж - наоборот.
В советник это засунуть просто, а вот в индикатор ...
Картинку прикрепил.
Нужно условие: фрактал "3" выше фрактала "2", и фрактал "1" выше "2" - FrDn3 > FrDn2 && FrDn2 < FrDn1 При этом смотрим свечи, фракталы уже образовались, и ждут подтверждения свечной модели,
и если есть "3" подряд растущие - покупка (стрелка) - GetBearBull(dSymbol,0,3)==1 (1 - покупка)
Для продаж - наоборот.
В советник это засунуть просто, а вот в индикатор ...
В индикаторе логика наоборот - если в советнике вы начинаете поиск вглубь истории, то в индикаторе - от её начала. Ищите сначала левый фрактал, затем средний, затем правый.
Управляем флагами.
В индикаторе логика наоборот - если в советнике вы начинаете поиск вглубь истории, то в индикаторе - от её начала. Ищите сначала левый фрактал, затем средний, затем правый.
Управляем флагами.
Если-бы мог, то без вопросов, логику понимаю, а вот в коде реализовать не могу, поэтому прошу показать готовым вариантом, Я его единоразово увижу, и вопросы в будущем отпадут, а пока их тысяча и решить сам не могу.
Что со всем этим делать в индикаторе - не представляю(
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
for(int i=3; i<iBars(symb, tf)-1; i++) {
if(mode==MODE_LOWER){
f=iFractals(symb, tf, MODE_LOWER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}
if(mode==MODE_UPPER){
f=iFractals(symb, tf, MODE_UPPER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}}
return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
double open1=0,close1=0,open2=0,close2=0;
int b=1,s=1;
for(int i=1; i<ne; i++) {
open1=iOpen(symb,tf,i);
close1=iClose(symb,tf,i);
open2= iOpen(symb,tf,i+1);
close2= iClose(symb,tf,i+1);
if(open2<close2 && open1<close1 && open2<open1) { // бычьи
b++;
if(b==ne) { return(1);}
}
if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
s++;
if(s==ne) { return(2);}
}
}
return(0);
}
//===============================================================================================
Если-бы мог, то без вопросов, логику понимаю, а вот в коде реализовать не могу, поэтому прошу показать готовым вариантом, Я его единоразово увижу, и вопросы в будущем отпадут, а пока их тысяча и решить сам не могу.
Что со всем этим делать в индикаторе - не представляю(
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
for(int i=3; i<iBars(symb, tf)-1; i++) {
if(mode==MODE_LOWER){
f=iFractals(symb, tf, MODE_LOWER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}
if(mode==MODE_UPPER){
f=iFractals(symb, tf, MODE_UPPER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}}
return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
double open1=0,close1=0,open2=0,close2=0;
int b=1,s=1;
for(int i=1; i<ne; i++) {
open1=iOpen(symb,tf,i);
close1=iClose(symb,tf,i);
open2= iOpen(symb,tf,i+1);
close2= iClose(symb,tf,i+1);
if(open2<close2 && open1<close1 && open2<open1) { // бычьи
b++;
if(b==ne) { return(1);}
}
if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
s++;
if(s==ne) { return(2);}
}
}
return(0);
}
//===============================================================================================
Разве вам нужна функция, возвращающая номер бара фрактала по его номеру?
Вам нужна ф-ция, возвращающая наличие фрактала на нужном баре (индексе цикла+3)