新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1498 1...149114921493149414951496149714981499150015011502150315041505...1953 新评论 Maxim Kuznetsov 2021.06.09 18:08 #14971 jarikn: 伙计们,帮我在指标上栓一个警报。 到其中的指标。 int start() int init() int deinit() 把东西拧在一起不是尊重自己或他人...... 不厌其烦地按照现代界面重新设计 Oleksandr Nozemtsev 2021.06.10 12:15 #14972 Aleksei Stepanenko:如果你在一个函数中改变一个全局变量,它就会改变。但这是一种危险的编程方式,因为在代码中,随着代码的增长,在程序的不同功能中会有不明显的赋值。程序中有一个主函数,那是你进行全局变量 赋值的地方。而在其他职能部门,要这样做。或者像这样。 我同意,在大量的代码中,很容易错过一个不需要的变量变化(X)的意义。从这个角度看,每次你需要找出X的问题时,调用主函数是正确的。但问题是,在这里。如果主函数计算并输出几个不同的值(X、Y、Z),并且相当大,而X在程序过程中被反复使用,这种方法不会过度消耗计算能力吗?也就是说,为了得到X,我们反复运行一整块,除了X之外,我们还重新计算Y和Z,比如说,只需要一次。因此,如果算法包含从一个函数到另一个函数的顺序变化和覆盖,对程序员来说可能会更复杂(需要更多的关注和检查错误),但对机器来说就更容易了。 Ilya Prozumentov 2021.06.10 12:25 #14973 Maxim Kuznetsov:到其中的指标。 int start() int init() int deinit() 把东西拧在一起不是尊重自己或他人......不厌其烦地按照现代界面重新设计 所以告诉我它在现代界面上必须是什么样子。这个人显然从来没有编过代码(否则他就会在没有我们的情况下弄清警报)。他只是在某个地方找到了代码,把它带到这里,并希望发出警报。 Aleksei Stepanenko 2021.06.10 12:51 #14974 Oleksandr Nozemtsev:但问题是,在这里。如果主函数计算并输出几个不同的值(X、Y、Z),并且相当大,而且X在途中被多次使用 int X=0; void OnTick() { if(УсловиеДляРедкогоРасчёта) X=ТяжёлыйРедкийРасчёт(); ЛекийПостоянныйРасчёт(X); } Maxim Kuznetsov 2021.06.10 13:33 #14975 Ilya Prozumentov:告诉我们它在现代界面上应该是什么样子。看来这个人从来没有编过程序(否则他就会在没有我们的情况下想出这个警报)。他只是在某个地方找到了代码,把它带到这里,并希望发出警报。 你从哪里得到这样的 "指标 "和 "顾问"? 但如果你把它融化,源头就不会枯竭...... 网站上已经很久没有这种东西了。 如果这些指标的制造者没有成功,市场已经转移到新的MQL5(4)。他们会在那里帮助和解释事情,这对每个人都是有用的。 或去自由职业者 PapaYozh 2021.06.10 13:50 #14976 Maxim Kuznetsov:但如果糖蜜 来自糖蜜这个词,是吗? Ilya Prozumentov 2021.06.10 20:22 #14977 jarikn: 伙计们,帮我在指标上附加一个警报。 #property copyright "Subu" #property link "http://www.google.com" #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_width1 2 #property indicator_width2 2 #property indicator_chart_window double UpArrow[]; double DownArrow[]; extern int ShiftArrow = -2; extern bool FilterBullBearCandle = false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_ARROW, EMPTY,2); SetIndexArrow(0, 233); SetIndexBuffer(0, UpArrow); SetIndexEmptyValue(0,0.0); SetIndexShift(0,ShiftArrow); SetIndexStyle(1, DRAW_ARROW, EMPTY,2); SetIndexArrow(1, 234); SetIndexBuffer(1, DownArrow); SetIndexEmptyValue(1,0.0); SetIndexShift(1,ShiftArrow); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start(){ int counted_bars=IndicatorCounted(); int limit, i; //---- last counted bar will be recounted limit=Bars-counted_bars; //---- for(i = 1; i < limit; i++){ DownArrow[i] = 0; UpArrow[i] = 0; if(High[i+2]>High[i+1] && Low[i+2]>Low[i+1] && High[i+2]>High[i+3] && Low[i+2]>Low[i+3]){ if( Open[i+1]>Close[i+1] && Close[i+2] > Close[i+1]){ if(FilterBullBearCandle){ if( Open[i+2]>Close[i+2]){ DownArrow[i] = High[i+2] +0.0003;//Low[i+2] + (High[i+2]-Low[i+2]); if(counted_bars > 0) Alert("Signal down: ", DownArrow[i]); } } else{ DownArrow[i] = High[i+2] +0.0003;//Low[i+2] + (High[i+2]-Low[i+2]); if(counted_bars > 0) Alert("Signal down: ", DownArrow[i]); } } } if(High[i+2]<High[i+1] && Low[i+2]<Low[i+1] && High[i+2]<High[i+3] && Low[i+2]<Low[i+3]){ if(Open[i+1]<Close[i+1] && Close[i+2] < Close[i+1]){ if(FilterBullBearCandle){ if( Open[i+2]<Close[i+2]){ UpArrow[i] = Low[i+2] - 0.0003;//High[i+2] - (High[i+2]-Low[i+2]); if(counted_bars > 0) Alert("Signal up: ", UpArrow[i]); } } else{ UpArrow[i] = Low[i+2] - 0.0003;//High[i+2] - (High[i+2]-Low[i+2]); if(counted_bars > 0) Alert("Signal up: ", UpArrow[i]); } } } } return(0); } Алексей КоКоКо 2021.06.10 21:17 #14978 请教mql5如何从OnCalculate传递给函数open,close和TD,而不是通过函数参数,这样我就不用在调用函数时 每次都把蜡烛图的开盘和收盘写进参数了来源myfunc(int index, double open[], double close[], double high[], double low[] etc.)我想myfunc(int index)和所有条形数据(prev、rate、open[]...等)将被写入这个函数中 [删除] 2021.06.10 21:32 #14979 jarikn :伙计们。有助于将警报固定在指示器上。搞砸了 - 我不记得代码库和作者的代码 - 我需要向他们说声谢谢! - 如果他能认出他的密码 - 我要对他说声谢谢!这是您的指标 - 我做到了 - 仅在带有警报的 MT5 上。 //+------------------------------------------------------------------+ //| jarikn.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_buffers 2 //---- использовано всего два графических построения #property indicator_plots 2 //+----------------------------------------------+ //| Параметры отрисовки бычьго индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 1 в виде символа #property indicator_type1 DRAW_ARROW //---- в качестве цвета бычей линии индикатора использован розовый цвет #property indicator_color1 Lime //---- толщина линии индикатора 1 равна 4 #property indicator_width1 2 //---- отображение метки медвежьей линии индикатора #property indicator_label1 "jarikn Buy" //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 2 в виде символа #property indicator_type2 DRAW_ARROW //---- в качестве цвета медвежьей линии индикатора использован зеленый цвет #property indicator_color2 Magenta //---- толщина линии индикатора 2 равна 4 #property indicator_width2 2 //---- отображение метки бычьей линии индикатора #property indicator_label2 "jarikn Sell" //+----------------------------------------------------+ //| перечисление для вариантов транслируемых сигналов | //+----------------------------------------------------+ enum ENUM_SIGNAL_MODE { MODE_SIGNAL, //Сигналы пробоя MODE_TREND //Сигналы пробоя и тренда }; //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input int ShiftArrow = 0 ; 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 ; //Разрешение отправки сигнала на мобильный //--- indicator buffers //---- объявление динамических массивов, которые будут в //---- дальнейшем использованы в качестве индикаторных буферов double UpArrow[]; double DownArrow[]; int StartBars; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- indicator buffers mapping StartBars= 5 ; //---- превращение динамического массива в индикаторный буфер SetIndexBuffer ( 0 ,UpArrow, INDICATOR_DATA ); //---- осуществление сдвига начала отсчета отрисовки индикатора 1 PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,StartBars); //--- создание метки для отображения в DataWindow PlotIndexSetString ( 0 , PLOT_LABEL , "jarikn Buy" ); //---- символ для индикатора PlotIndexSetInteger ( 0 , PLOT_ARROW , 108 ); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries (UpArrow, true ); //--- line shifts when drawing PlotIndexSetInteger ( 0 , PLOT_SHIFT ,ShiftArrow); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer ( 1 ,DownArrow, INDICATOR_DATA ); //---- осуществление сдвига начала отсчета отрисовки индикатора 2 PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,StartBars); //--- создание метки для отображения в DataWindow PlotIndexSetString ( 1 , PLOT_LABEL , "jarikn Sell" ); //---- символ для индикатора PlotIndexSetInteger ( 1 , PLOT_ARROW , 108 ); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries (DownArrow, true ); //--- line shifts when drawing PlotIndexSetInteger ( 1 , PLOT_SHIFT ,ShiftArrow); //---- установка формата точности отображения индикатора IndicatorSetInteger ( INDICATOR_DIGITS , _Digits ); //---- имя для окон данных и лэйба для субъокон string short_name= "jarikn" ; IndicatorSetString ( INDICATOR_SHORTNAME ,short_name); //--- 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<StartBars) return ( 0 ); int limit,i; //---- расчет стартового номера first для цикла пересчета баров if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора limit=rates_total-StartBars; // стартовый номер для расчета всех баров else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries (Open, true ); ArraySetAsSeries (High, true ); ArraySetAsSeries (Low, true ); ArraySetAsSeries (Close, true ); //---- for (i = 0 ; i <= limit; i++) { DownArrow[i] = 0 ; UpArrow[i] = 0 ; if (High[i+ 2 ]>High[i+ 1 ] && Low[i+ 2 ]>Low[i+ 1 ] && High[i+ 2 ]>High[i+ 3 ] && Low[i+ 2 ]>Low[i+ 3 ]) if (Open[i+ 1 ]>Close[i+ 1 ] && Close[i+ 2 ] > Close[i+ 1 ]) { if (Open[i+ 2 ]>Close[i+ 2 ]) DownArrow[i] = High[i+ 2 ] + 0.0003 ; //Low[i+2] + (High[i+2]-Low[i+2]); } if (High[i+ 2 ]<High[i+ 1 ] && Low[i+ 2 ]<Low[i+ 1 ] && High[i+ 2 ]<High[i+ 3 ] && Low[i+ 2 ]<Low[i+ 3 ]) if (Open[i+ 1 ]<Close[i+ 1 ] && Close[i+ 2 ] < Close[i+ 1 ]) { if (Open[i+ 2 ]<Close[i+ 2 ]) UpArrow[i] = Low[i+ 2 ] - 0.0003 ; //High[i+2] - (High[i+2]-Low[i+2]); } } //--- alert BuySignal( "Alert BuySignal" ,UpArrow, 0 ,rates_total,prev_calculated,Close,spread); SellSignal( "Alert SellSignal" ,DownArrow, 0 ,rates_total,prev_calculated,Close,spread); //--- OnCalculate done. Return new prev_calculated. 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 )); //---- } //+------------------------------------------------------------------+ Aleksei Stepanenko 2021.06.10 22:49 #14980 Алексей КоКоКо: 所有条形数据(prev,rate,open[]...和TD)都以某种方式被吸进函数中。 它是如何被吸进去的?像这样吗? void MyFunc() { double high=iHigh(symbol,frame,0); } 1...149114921493149414951496149714981499150015011502150315041505...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
伙计们,帮我在指标上栓一个警报。
到其中的指标。
int start()
int init()
int deinit()
把东西拧在一起不是尊重自己或他人......
不厌其烦地按照现代界面重新设计
如果你在一个函数中改变一个全局变量,它就会改变。但这是一种危险的编程方式,因为在代码中,随着代码的增长,在程序的不同功能中会有不明显的赋值。
程序中有一个主函数,那是你进行全局变量 赋值的地方。而在其他职能部门,要这样做。
或者像这样。
我同意,在大量的代码中,很容易错过一个不需要的变量变化(X)的意义。从这个角度看,每次你需要找出X的问题时,调用主函数是正确的。但问题是,在这里。如果主函数计算并输出几个不同的值(X、Y、Z),并且相当大,而X在程序过程中被反复使用,这种方法不会过度消耗计算能力吗?也就是说,为了得到X,我们反复运行一整块,除了X之外,我们还重新计算Y和Z,比如说,只需要一次。因此,如果算法包含从一个函数到另一个函数的顺序变化和覆盖,对程序员来说可能会更复杂(需要更多的关注和检查错误),但对机器来说就更容易了。
到其中的指标。
int start()
int init()
int deinit()
把东西拧在一起不是尊重自己或他人......
不厌其烦地按照现代界面重新设计
所以告诉我它在现代界面上必须是什么样子。这个人显然从来没有编过代码(否则他就会在没有我们的情况下弄清警报)。他只是在某个地方找到了代码,把它带到这里,并希望发出警报。
但问题是,在这里。如果主函数计算并输出几个不同的值(X、Y、Z),并且相当大,而且X在途中被多次使用
告诉我们它在现代界面上应该是什么样子。看来这个人从来没有编过程序(否则他就会在没有我们的情况下想出这个警报)。他只是在某个地方找到了代码,把它带到这里,并希望发出警报。
你从哪里得到这样的 "指标 "和 "顾问"? 但如果你把它融化,源头就不会枯竭......
网站上已经很久没有这种东西了。
如果这些指标的制造者没有成功,市场已经转移到新的MQL5(4)。他们会在那里帮助和解释事情,这对每个人都是有用的。
或去自由职业者
但如果糖蜜
来自糖蜜这个词,是吗?
伙计们,帮我在指标上附加一个警报。
伙计们。有助于将警报固定在指示器上。
搞砸了 - 我不记得代码库和作者的代码 - 我需要向他们说声谢谢! - 如果他能认出他的密码 - 我要对他说声谢谢!
这是您的指标 - 我做到了 - 仅在带有警报的 MT5 上。
它是如何被吸进去的?像这样吗?