新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 209 1...202203204205206207208209210211212213214215216...1953 新评论 Artyom Trishkin 2017.05.19 06:02 #2081 Alexey Viktorov:问题出在这一行由于我想在一个柱子上检查几种货币,我应该检查时间和货币,以避免在一个柱子和一个符号上重复发出警报,但允许在同一个柱子上以不同的符号发出警报。乍一看,我们还需要一个带有标志的数组,以确定该符号是否被抓取。一般来说,我们必须在这一行添加一个符号检查,或者只在出现新条形 的时候重复循环。但是我有一个担心,当用这个指标在符号上出现一个新条形时,另一个符号上还没有出现新条形。结论是:我们必须使我们的头部肌肉紧张,以确定每个符号上是否出现了新的条形符号,但同时又不能把线的数量拉到无限大。我没有现成的解决方案。而且我不喜欢通过写代码来建议...而我还没有解决他的问题?也许我漏掉了什么地方--我在膝盖上写了代码。 Alexey Viktorov 2017.05.19 09:12 #2082 Artyom Trishkin:而我还没有解决他的问题?也许我漏掉了什么地方--我在膝盖上写了代码。Artem,我帖子的最后一句话解释了一切。甚至没有看你的代码。打开第一个未读,问题中引用了我之前的回复,我回答了,然后看到了其他建议。我不怀疑你的代码的正确性,甚至从我的膝盖上... Artyom Trishkin 2017.05.19 10:37 #2083 Alexey Viktorov:Artyom,我帖子的最后一句话解释了一切。甚至没有看你的代码。打开第一个未读,问题中引用了我之前的回答,我回答了,然后看到了其他建议。我不怀疑你的代码的正确性,甚至从我的膝盖上...本来想说的是懒惰;)即使是第一眼,你也可以看到该代码取决于当前符号的刻度。因此,我们必须从OnTick()中删除循环,并将其塞入一个定时器。并稍微修改一下时间警报的定义。 виталик 2017.05.19 11:17 #2084 大家好,有一个误解的过程,在函数 "start "中循环mm++;并通过Print() 跟踪它的变化;所以问:"为什么不是1、2、3、4等弹出四位数?"代码本身int start() { int counted_bars=IndicatorCounted(); int limit, i; int mm=0; // ======= ПЕРВОЕ======== if(counted_bars<0) return(-1); limit=(Bars-counted_bars)-1; for (i=limit; i>=0;i--) { if (TimeDayOfWeek(Time[i]) != 0) {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];} if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0) { mm++; // ==========ВТОРОЕ========== Print(" TEST= ",mm);// ========ТРЕТЬЕ======== LastLow=Open[i]; LastHigh=Open[i]; /* ObjectMove("Pivot", 0, Time[i],P); ObjectMove("S1", 0, Time[i],S1); ObjectMove("R1", 0, Time[i],R1); */ } // S1Buffer[i]=S1; // R1Buffer[i]=R1; } //---- return(0); } //+------------------------------------------------------------------+ Alekseu Fedotov 2017.05.19 12:51 #2085 виталик:大家好,有一个误解的过程,在函数 "start "中循环mm++;并通过Print()跟踪它的变化;所以问:"为什么不是1、2、3、4等弹出四位数?"代码本身 在第一次运行时,10秒IndicatorCounted()=0 limit=(Bars-counted_bars)-1;所以限制=历史上的最大条数-1 виталик 2017.05.19 13:48 #2086 Alekseu Fedotov: 在第一次运行时,10秒内IndicatorCounted()=0意思是极限=历史上的最大条数-1 仍然不清楚,声明和初始化在循环外的零 int mm=0; 而放在循环中的mm++;print() 显示四位数的数字只在下降的方向上有一个单位的差异,这是由于某种原因。 Artyom Trishkin 2017.05.19 13:56 #2087 виталик: 仍然不清楚,声明和初始化在循环外的零 int mm=0; 而放在循环中的 mm++; print() 显示四位数的变化,相差一个单位,只是在下降的方向上有一些原因 并非所有的印刷品都印在本日志中。在文件中寻找。 Sile Si 2017.05.19 17:43 #2088 Alexey Viktorov:...你必须使你的头部肌肉紧张...感谢每个人的回应。Artyom Trishkin: 像这样。 Artem,你为什么要写你还没有解决这个问题?它为所有的工具发送信号,但它只是大量地加载系统。是否有可能降低负荷?在一个新条上限制检查是行不通的,因为也会有一些条件必须在每个勾 上检查。我尝试在你的代码中加入OnTimer(),在EA中OnTick()时它是有效的,但如何在OnCalculate中做到这一点?int OnInit() { EventSetMillisecondTimer(1); //--- indicator buffers mapping IndicatorShortName("UP DN"); ushort sz=SetSymbols(Symbols,symbols_array); if(sz==0) { Print("Список символов пуст!"); return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } void OnDeinit(const int reason) {// --- EventKillTimer(); // --- } void OnTimer() { RefreshRates(); // OnTick(); OnCalculate(); } Sile Si 2017.05.19 17:59 #2089 Ibragim Dzhanaev:你能告诉我为什么订单不能打开吗?好的,它将被打开。//пересечение вверх bool PeresVverh() {//Объявление пересечения вверх //if(Ma(MaPer1,2)>Ma(MaPer2,2)) if(Ma(MaPer1,1)>=Ma(MaPer2,1)) if(Ma(MaPer1,0)<Ma(MaPer2,0)) return(true); return(false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool PeresVniz() {//Объявление пересечения вниз //if(Ma(MaPer1,2)<Ma(MaPer2,2)) if(Ma(MaPer1,1)<=Ma(MaPer2,1)) if(Ma(MaPer1,0)>Ma(MaPer2,0)) return(true); return(false); } Artyom Trishkin 2017.05.19 18:30 #2090 Sile Si:感谢每个人的回应。Artyom,你为什么写说你没有解决这个问题?它在所有的仪器上发出信号,但它对系统的负荷很重。有什么办法可以减轻负担吗?在一个新的条形图上进行检查的限制是不行的,因为还有一些条件必须在每个刻度 上进行检查。在你的代码中,我尝试添加OnTimer(),当OnTick()时在EA中起作用,但如何在OnCalculate中做到?用一个200毫秒的定时器试试。//+------------------------------------------------------------------+ //| Test_01.mq4 | //| Copyright 2017, Artem A. Trishkin, Skype artmedia70 | //| https://login.mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70" #property link "https://login.mql5.com/ru/users/artmedia70" #property version "1.00" #property strict #property indicator_chart_window input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая //--- struct SSymbolsData { string name; // Имя символа datetime time_alert; // Время последнего алерта }; SSymbolsData symbols_array[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping EventSetMillisecondTimer(200); IndicatorShortName("UP DN"); ushort sz=SetSymbols(Symbols,symbols_array); if(sz==0) { Print("Список символов пуст!"); return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); } //+------------------------------------------------------------------+ //| 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[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- for(int i=0; i<ArraySize(symbols_array); i++) { if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) { datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);; if(symbols_array[i].time_alert!=tm) { Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES)); symbols_array[i].time_alert=tm; } } if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) { datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0); if(symbols_array[i].time_alert!=tm) { Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES)); symbols_array[i].time_alert=tm; } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int Condition(string symbol_name,int shift) { MqlRates array[]; if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){ if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY); if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL); } return(WRONG_VALUE); } //+------------------------------------------------------------------+ ushort SetSymbols(string symbols_list,SSymbolsData &array[]){ symbols_list+=","; // Добавим признак конца строки short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list); string sy=""; Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке while(beg<len) { beg++; end=(short)StringFind(symbols_list,",",beg); if(end==beg || end<0) continue; sy=StringSubstr(symbols_list,beg,end-beg); if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue; ushort sz=(ushort)ArraySize(array); ArrayResize(array,sz+1); array[sz].name=sy; array[sz].time_alert=0; //--- Посмотрим корректность найденного символа и записи его в массив Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name); } return((ushort)ArraySize(array)); } //+------------------------------------------------------------------+ bool CheckSymbol(string symbol_name,SSymbolsData &array[]){ for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true); return(false); } //+------------------------------------------------------------------+ bool IsPresentSymbol(string symbol_name){ for(ushort i=0; i<SymbolsTotal(false); i++){ if(SymbolName(i,false)==symbol_name) { SymbolSelect(symbol_name,true); return(true); } } return(false); } //+------------------------------------------------------------------+ 1...202203204205206207208209210211212213214215216...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
问题出在这一行
由于我想在一个柱子上检查几种货币,我应该检查时间和货币,以避免在一个柱子和一个符号上重复发出警报,但允许在同一个柱子上以不同的符号发出警报。乍一看,我们还需要一个带有标志的数组,以确定该符号是否被抓取。
一般来说,我们必须在这一行添加一个符号检查,或者只在出现新条形 的时候重复循环。但是我有一个担心,当用这个指标在符号上出现一个新条形时,另一个符号上还没有出现新条形。
结论是:我们必须使我们的头部肌肉紧张,以确定每个符号上是否出现了新的条形符号,但同时又不能把线的数量拉到无限大。我没有现成的解决方案。而且我不喜欢通过写代码来建议...
而我还没有解决他的问题?
也许我漏掉了什么地方--我在膝盖上写了代码。
而我还没有解决他的问题?
也许我漏掉了什么地方--我在膝盖上写了代码。
Artem,我帖子的最后一句话解释了一切。甚至没有看你的代码。打开第一个未读,问题中引用了我之前的回复,我回答了,然后看到了其他建议。我不怀疑你的代码的正确性,甚至从我的膝盖上...
Artyom,我帖子的最后一句话解释了一切。甚至没有看你的代码。打开第一个未读,问题中引用了我之前的回答,我回答了,然后看到了其他建议。我不怀疑你的代码的正确性,甚至从我的膝盖上...
本来想说的是懒惰;)
即使是第一眼,你也可以看到该代码取决于当前符号的刻度。因此,我们必须从OnTick()中删除循环,并将其塞入一个定时器。并稍微修改一下时间警报的定义。
大家好,有一个误解的过程,在函数 "start "中循环mm++;并通过Print() 跟踪它的变化;所以问:"为什么不是1、2、3、4等弹出四位数?"
代码本身
大家好,有一个误解的过程,在函数 "start "中循环mm++;并通过Print()跟踪它的变化;所以问:"为什么不是1、2、3、4等弹出四位数?"
代码本身
在第一次运行时,10秒IndicatorCounted()=0
所以限制=历史上的最大条数-1
在第一次运行时,10秒内IndicatorCounted()=0
意思是极限=历史上的最大条数-1
仍然不清楚,声明和初始化在循环外的零 int mm=0; 而放在循环中的 mm++; print() 显示四位数的变化,相差一个单位,只是在下降的方向上有一些原因
Alexey Viktorov:
...你必须使你的头部肌肉紧张...
感谢每个人的回应。
Artyom Trishkin: 像这样。
在一个新条上限制检查是行不通的,因为也会有一些条件必须在每个勾 上检查。
我尝试在你的代码中加入OnTimer(),在EA中OnTick()时它是有效的,但如何在OnCalculate中做到这一点?
你能告诉我为什么订单不能打开吗?
感谢每个人的回应。
Artyom,你为什么写说你没有解决这个问题?它在所有的仪器上发出信号,但它对系统的负荷很重。有什么办法可以减轻负担吗?
在一个新的条形图上进行检查的限制是不行的,因为还有一些条件必须在每个刻度 上进行检查。
在你的代码中,我尝试添加OnTimer(),当OnTick()时在EA中起作用,但如何在OnCalculate中做到?
用一个200毫秒的定时器试试。