- Открытый бар , и проверку преведущих баров с SetIndexBuffer
- Тема для трейдеров.
- Мультитаймфреймовые индикаторы
Как можно сделать что бы Alert сигналил когда, к примеру текущий график составляет 1 час, и показывает линии с 5 минутного нижнего текущего графика. Обобщим когда 2 линии на одном открытом баре примеру 1 часовом, Alert сигналил. (Линии с нижних тайфремах)
А Вы когда не будь пользовались этой страничкой https://www.mql5.com/ru/code - там чего только нет. И поверти, там точно будет.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Когда я понял, что без каких не будь вспомогательных функции, сложно заработать на форексе. Я на этой страничке сутками жил, почти каждый код проверял в тестере, что бы понять
как он работает.
А Вы когда не будь пользовались этой страничкой https://www.mql5.com/ru/code - там чего только нет. И поверти, там точно будет.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Когда я понял, что без каких не будь вспомогательных функции, сложно заработать на форексе. Я на этой страничке сутками жил, почти каждый код проверял в тестере, что бы понять
как он работает.
Да )
for ( int i=2 ; i== Lin ; i++) if ( Lin && Open[0] && Timee2 != Time[0]) { if (EnableNativeAlerts) Alert("Sig "+Symbol()+" TF: "+Period()); Timee2=Time[0]; }
Получилось только что сигналит на 1 а на 2 нет
Вот я нашёл от этого автора https://www.mql5.com/ru/users/godzilla - Алерт который почти в любой Индикатор можно внедрить
//+------------------------------------------------------------------+ //| AlertSample.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_plots 0 //+----------------------------------------------------+ //| перечисление для вариантов транслируемых сигналов | //+----------------------------------------------------+ enum ENUM_SIGNAL_MODE { MODE_SIGNAL, //Сигналы пробоя MODE_TREND //Сигналы пробоя и тренда }; input group "---- Входные переменные для алертов ----" input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Вариант подачи сигнала input uint NumberofBar=0; //Номер бара для подачи сигнала input bool SoundON=true; //Разрешение алерта input uint NumberofAlerts=1; //Количество алертов input bool EMailON=false; //Разрешение почтовой отправки сигнала input bool PushON=false; //Разрешение отправки сигнала на мобильный //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- 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[]) { //--- /* //--- alert BuySignal("Alert ",BufferTop,0,rates_total,prev_calculated,close,spread); SellSignal("Alert ",BufferLower,0,rates_total,prev_calculated,close,spread); */ //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Buy signal function | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname,// текст имени индикатора для почтовых и пуш-сигналов double &ColorArray[],// цветовой индексный буфер int ColorIndex,// индекс цвета в цветовом индескном буфере для подачи сигнала const int Rates_total, // текущее количество баров const int Prev_calculated, // количество баров на предыдущем тике const double &Close[], // цена закрытия const int &Spread[]) // спред { //--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool BuySignal=false; bool SeriesTest=ArrayGetAsSeries(ColorArray); int index,index1; if(SeriesTest) { index=int(NumberofBar); index1=index+1; } else { index=Rates_total-int(NumberofBar)-1; index1=index-1; } if(SignMode==MODE_SIGNAL) { if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true; } else { if(ColorArray[index]==ColorIndex) BuySignal=true; } if(BuySignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=_Point*Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex)) { if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } else { if(SoundON) Alert("Up Trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": Up Trend signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": Up Trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } } //--- } //+------------------------------------------------------------------+ //| Sell signal function | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname,// текст имени индикатора для почтовых и пуш-сигналов double &ColorArray[], // цветовой индексный буфер int ColorIndex, // индекс цвета в цветовом индескном буфере для подачи сигнала const int Rates_total, // текущее количество баров const int Prev_calculated, // количество баров на предыдущем тике const double &Close[], // цена закрытия const int &Spread[]) // спред { //--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool SellSignal=false; bool SeriesTest=ArrayGetAsSeries(ColorArray); int index,index1; if(SeriesTest) { index=int(NumberofBar); index1=index+1; } else { index=Rates_total-int(NumberofBar)-1; index1=index-1; } if(SignMode==MODE_SIGNAL) { if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true; } else { if(ColorArray[index]==ColorIndex) SellSignal=true; } if(SellSignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=_Point*Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex)) { if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } else { if(SoundON) Alert("Down trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": Down trend signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": Down trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } } //--- } //+------------------------------------------------------------------+ //| Получение таймфрейма в виде строки | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- } //+------------------------------------------------------------------+
Тут нужно только подогнать - что бы заработало - где жёлтым мечено нужно заменить
//+------------------------------------------------------------------+ //| 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[]) { //--- /* //--- alert BuySignal("Alert ",BufferTop,0,rates_total,prev_calculated,close,spread); SellSignal("Alert ",BufferLower,0,rates_total,prev_calculated,close,spread); */ //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
ещё вариант когда всего один буфер
//--- alert BuySignal("Alert ",Buffer,1,rates_total,prev_calculated,close,spread); SellSignal("Alert ",Buffer,0,rates_total,prev_calculated,close,spread);
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования