新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 208 1...201202203204205206207208209210211212213214215...1953 新评论 Sile Si 2017.05.17 19:15 #2071 你好,请帮助。现在我只在一个仪器上测试这个条件。string SYMBOL_N = "EURUSD"; if(iOpen(SYMBOL_N, PERIOD_CURRENT, 1)< iClose(SYMBOL_N, PERIOD_CURRENT, 1)&&iOpen(SYMBOL_N, PERIOD_CURRENT, 2)> iClose(SYMBOL_N, PERIOD_CURRENT, 2)); {Alert("UP" SYMBOL_N); }我想检查不同乐器的状况。这样,外部的就可以写成以下样子input string SYMBOL_N = "EURUSD, GBPUSD, USDJPY, USDCHF"; Alexey Viktorov 2017.05.18 05:44 #2072 Sile Si:你好,请帮助。现在我只在一个仪器上测试这个条件。我想检查不同乐器的状况。我希望能够像这样在外部的写上它使用数组而不是变量string SYMBOL_N[4] = "EURUSD, GBPUSD, USDJPY, USDCHF";并在循环中检查它。for(int i = 0; i < 4; i++) { if(iOpen(SYMBOL_N[i], PERIOD_CURRENT, 1)< iClose(SYMBOL_N[i], PERIOD_CURRENT, 1)&&iOpen(SYMBOL_N[i], PERIOD_CURRENT, 2)> iClose(SYMBOL_N[i], PERIOD_CURRENT, 2)); Alert("UP" SYMBOL_N[i]); }要通过输入法输入这一切,你需要一个字符串"EURUSD, GBPUSD, USDJPY, USDCHF"在输入中分割它并将其放入一个数组。有一些字符串函数用于此。而且你可以在CodeBase中找到这种操作的例子。 Konstantin Erin 2017.05.18 06:08 #2073 Alexey Viktorov: 使用数组而不是变量string SYMBOL_N[4] = "EURUSD, GBPUSD, USDJPY, USDCHF";一个数组的最佳定义如下 string SYMBOL_N[4] = {"EURUSD", "GBPUSD", "USDJPY", "USDCHF"}; Alexey Viktorov 2017.05.18 06:13 #2074 STARIJ:最好按以下方式设置阵列 这是完全正确的。但编译器很清楚地告诉我们不注意的问题。 Andrei Savchenko 2017.05.18 19:41 #2075 你好。我有一个指标问题,它通常发生在M1和M5。它看起来像是在地下室窗口和主窗口的所有指标上同时跳动,在截图上可以看到。其中一个指标的代码。#property indicator_chart_window #property indicator_buffers 8 #property indicator_color1 Blue #property indicator_color2 Green #property indicator_color3 Green #property indicator_color4 Red #property indicator_color5 LightSeaGreen #property indicator_color6 Red #property indicator_color7 LightSeaGreen #property indicator_color7 LightSeaGreen extern bool sig_Vred=false; extern bool sig_Vsea=false; extern bool sig_Vgreen=false; extern bool sig_Ngreen=false; extern bool sig_Nsea=false; extern bool sig_Nred=false; extern int BandsPeriod=70; extern int BandsShift=0; extern int PeriodsATR= 70; static int sig, my; static double plus; //static string gn2, gnm, gns; double MovingBuffer[]; double UpperBuffer[]; double UpperBmax[]; double UpperBuffer2[]; double LowerBuffer[]; double LowerBmax[]; double LowerBuffer2[]; int init() { SetIndexBuffer(0,MovingBuffer); SetIndexStyle(0,DRAW_NONE); SetIndexBuffer(1,UpperBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,LowerBuffer); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(3,UpperBmax); SetIndexStyle(3,DRAW_LINE); SetIndexBuffer(4,UpperBuffer2); SetIndexStyle(4,DRAW_LINE);//,STYLE_SOLID,2); SetIndexBuffer(5,LowerBmax); SetIndexStyle(5,DRAW_LINE); SetIndexBuffer(6,LowerBuffer2); SetIndexStyle(6,DRAW_LINE);//,STYLE_SOLID,2); SetIndexDrawBegin(0,BandsPeriod+BandsShift); SetIndexDrawBegin(1,BandsPeriod+BandsShift); SetIndexDrawBegin(2,BandsPeriod+BandsShift); SetIndexDrawBegin(3,BandsPeriod+BandsShift); SetIndexDrawBegin(4,BandsPeriod+BandsShift); SetIndexDrawBegin(5,BandsPeriod+BandsShift); SetIndexDrawBegin(6,BandsPeriod+BandsShift); if(Digits==5){if(Close[0]>1)plus=0.0001; else plus=0.00007;} if(Digits==3){if(Close[0]>100)plus=0.01; else plus=0.007;} if(Period()<10)plus=0; if(Period()>60)plus=plus*2; if(Period()>1) my=0; else my=3; return(0); } int start() { static datetime time0; static double hig, loww; if(time0!=Time[0]){ time0=Time[0]; hig=0; loww=1000;} if((High[0]>hig)||(Low[0]<loww)) {hig=High[0]+plus; loww=Low[0]-plus; int i,k,counted_bars=IndicatorCounted(); double deviation; double sum,oldval; if(Bars<=BandsPeriod) return(0); if(counted_bars<1) for(i=1;i<=BandsPeriod;i++) { MovingBuffer[Bars-i]=EMPTY_VALUE; UpperBuffer[Bars-i]=EMPTY_VALUE; UpperBmax[Bars-i]=EMPTY_VALUE; UpperBuffer2[Bars-i]=EMPTY_VALUE; LowerBuffer[Bars-i]=EMPTY_VALUE; LowerBmax[Bars-i]=EMPTY_VALUE; LowerBuffer2[Bars-i]=EMPTY_VALUE; } int limit=Bars-counted_bars; if(counted_bars>0) limit++; for(i=0; i<limit; i++) MovingBuffer[i]=iMA(NULL,0,BandsPeriod,BandsShift,my,PRICE_CLOSE,i); i=Bars-BandsPeriod+1; if(counted_bars>BandsPeriod-1) i=Bars-counted_bars-1; if(Period()==1)i++; while(i>=0) { sum=0.0; k=i+BandsPeriod-1; oldval=MovingBuffer[i]; deviation=iATR(NULL,0,PeriodsATR,i); UpperBmax[i]=oldval+deviation*6.618; UpperBuffer2[i]=oldval+deviation*4.236; UpperBuffer[i]=oldval+deviation*1.618; LowerBuffer[i]=oldval-deviation*1.618; LowerBuffer2[i]=oldval-deviation*4.236; LowerBmax[i]=oldval-deviation*6.618; i--; } if(sig_Vred==true && sig==0 && Close[0]>UpperBmax[0]){sig=1; Alert(Symbol()+" Vred "+Period());}// if((Hour()>7)&&(Hour()<23)) PlaySound("sigvhod");} if(sig_Nred==true && sig==0 && Close[0]<LowerBmax[0]){sig=1; Alert(Symbol()+" Nred "+Period());}// if((Hour()>7)&&(Hour()<23)) PlaySound("sigvhod");} if(sig_Vsea==true && sig==0 && Close[0]>UpperBuffer2[0]){sig=1; Alert(Symbol()+" Vsea "+Period());}// if((Hour()>7)&&(Hour()<23)) PlaySound("sigvhod");} if(sig_Nsea==true && sig==0 && Close[0]<LowerBuffer2[0]){sig=1; Alert(Symbol()+" Nsea "+Period());}// if((Hour()>7)&&(Hour()<23)) PlaySound("sigvhod");} if(sig_Vgreen==true && sig==0 && Close[0]>UpperBuffer[0]){sig=1; Alert(Symbol()+" Vgreen "+Period());}// if((Hour()>7)&&(Hour()<23)) PlaySound("sigvhod");} if(sig_Ngreen==true && sig==0 && Close[0]<LowerBuffer[0]){sig=1; Alert(Symbol()+" Ngreen "+Period());}// if((Hour()>7)&&(Hour()<23)) PlaySound("sigvhod");} } return(0); } Sile Si 2017.05.19 01:10 #2076 Alexey Viktorov:使用数组而不是变量并在循环中检查它。要通过输入法输入所有这些,你需要一个字符串分裂,并把它塞进一个数组。有一些字符串函数用于此。而且你可以在CodeBase中找到这种操作的例子。谢谢,这似乎是有效的,但如果一个条件同时在几个货币对上得到满足,警报就只在一个货币对上。有时它只说 "上升",而不说货币对。如何解决这个问题?#property strict #property indicator_chart_window extern string Symbols = "EURUSD, GBPUSD, USDJPY"; // string symbols_arr[100]; datetime time_b; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorShortName("UP DN"); SetSymbols(Symbols); //--- return(INIT_SUCCEEDED); } void SetSymbols(string text) { int i = 0, j; for(i=0; i<100; i++) symbols_arr[i]=""; i=0; string fValue; string Str = text; while (StringLen(Str)>0) { j = StringFind(Str, ","); if(j>=0) { fValue = StringSubstr(Str, 0, j); Str = StringSubstr(Str, j+1); } else { fValue = Str; Str = ""; } fValue=StringTrimLeft(fValue); fValue=StringTrimRight(fValue); symbols_arr[i]=fValue; i++; } //colCount = i; } // ----------------- //+------------------------------------------------------------------+ //| 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[]) { //--- for(int i = 0; i < 100; i++) { if(iOpen(symbols_arr[i], PERIOD_CURRENT, 1)< iClose(symbols_arr[i], PERIOD_CURRENT, 1)&&iOpen(symbols_arr[i], PERIOD_CURRENT, 2)> iClose(symbols_arr[i], PERIOD_CURRENT, 2)) { if(time_b!=iTime(symbols_arr[i], PERIOD_CURRENT, 0)) { Alert("UP - " ,symbols_arr[i]); time_b=iTime(symbols_arr[i], PERIOD_CURRENT, 0); } } } //--- return value of prev_calculated for next call return(rates_total); } //+---- Artyom Trishkin 2017.05.19 01:56 #2077 Sile Si: 谢谢,它似乎在工作,但如果几个货币对的条件同时得到满足,警报就只出现在一个货币对上。有时它只显示 "上升",而没有显示货币对。如何解决这个问题?为什么你需要100次的循环迭代?为什么你需要100个阵列? 为什么不把它变成动态的,当你在初始化字符串 中找到一个新的符号时,增加它的大小并填充数组?然后在填充数组的大小上进行迭代次数的循环。你检查过你在阵列中的内容吗? Alekseu Fedotov 2017.05.19 03:59 #2078 Sile Si: 谢谢,它似乎在工作,但如果几个货币对上的条件同时得到满足,警报就只出现在一个货币对上。有时它只显示 "上升",而没有显示货币对。我怎样才能解决这个问题呢? 要像这样做int Size_symbols=ArraySize(symbols_arr) for(int i = 0; i < Size_symbols; i++) { // бла..бла..бла }Dob.而在inite中,当你向其添加一个值时,增加数组的数量 Artyom Trishkin 2017.05.19 04:15 #2079 Sile Si: 谢谢,它似乎在工作,但如果几个货币对上的条件同时得到满足,警报就只出现在一个货币对上。有时它只显示 "上升",而没有显示货币对。如何解决这个问题?好吧,试试吧。//+------------------------------------------------------------------+ //| Test.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"; // Список символов, разделитель - запятая string symbols_array[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorShortName("UP DN"); ushort sz=SetSymbols(Symbols,symbols_array); if(sz==0) { Print("Список символов пуст!"); return(INIT_FAILED); } //--- 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[]) { //--- static datetime time_b=0,time_s=0; for(int i=0; i<ArraySize(symbols_array); i++) { if(Condition(symbols_array[i],1)==ORDER_TYPE_BUY) { if(time_b!=iTime(symbols_array[i],PERIOD_CURRENT,0)) { Alert("UP - " ,symbols_array[i]); time_b=iTime(symbols_array[i],PERIOD_CURRENT,0); } } if(Condition(symbols_array[i],1)==ORDER_TYPE_SELL) { if(time_s!=iTime(symbols_array[i],PERIOD_CURRENT,0)) { Alert("Down - " ,symbols_array[i]); time_s=iTime(symbols_array[i],PERIOD_CURRENT,0); } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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,string &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]=sy; //--- Посмотрим корректность найденного символа и записи его в массив Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz]); } return((ushort)ArraySize(array)); } //+------------------------------------------------------------------+ bool CheckSymbol(string symbol_name,string &array[]){ for(short i=0; i<ArraySize(array); i++) if(array[i]==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); } //+------------------------------------------------------------------+ 关于"......但如果同时在几对上满足了条件,警报只在一对上...... " 我要说的是。你检查一个符号上的时间,但你把它写进一个单一的变量,用于你拥有的所有符号。当然,而且只有在当前这根柱子上的第一个符号才会有警报。你需要一个结构数组,每个符号有两个字段--名称字段和时间字段,并且已经将每个符号的警报时间写入其中。 例如,像这样。//+------------------------------------------------------------------+ //| Test.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 IndicatorShortName("UP DN"); ushort sz=SetSymbols(Symbols,symbols_array); if(sz==0) { Print("Список символов пуст!"); return(INIT_FAILED); } //--- 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[]) { //--- 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; } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ Alexey Viktorov 2017.05.19 05:40 #2080 Sile Si: 谢谢,它似乎在工作,但如果几个货币对上的条件同时得到满足,警报就只出现在一个货币对上。有时它只显示 "上升",而没有显示货币对。我怎样才能解决这个问题呢?问题出在这一行if(time_b!=iTime(symbols_arr[i], PERIOD_CURRENT, 0))因为我在一个柱子上检查几种货币,除了时间,我还应该检查货币,以避免在一个柱子和一个符号上重复警报,但允许在同一个柱子上用不同的符号发出警报。乍一看,我们还需要一个带有标志的数组,以确定该符号是否被查看。一般来说,要么在这一行增加符号检查,要么只在新条形图 打开的条件下重复循环。但我有一个担心,当使用这个指标的符号上有一个新的条形图时,新的条形图还没有在另一个符号上绘制。结论是:我们必须使我们的头部肌肉紧张,以确定每个符号上是否出现了新的条形符号,但同时又不能把线的数量拉到无限大。我没有现成的解决方案。而且我不喜欢通过写代码来建议... 1...201202203204205206207208209210211212213214215...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我想检查不同乐器的状况。
这样,外部的就可以写成以下样子
我想检查不同乐器的状况。
我希望能够像这样在外部的写上它
使用数组而不是变量
并在循环中检查它。
要通过输入法输入这一切,你需要一个字符串
"EURUSD, GBPUSD, USDJPY, USDCHF"
在输入中分割它并将其放入一个数组。有一些字符串函数用于此。而且你可以在CodeBase中找到这种操作的例子。
一个数组的最佳定义如下
最好按以下方式设置阵列
你好。我有一个指标问题,它通常发生在M1和M5。它看起来像是在地下室窗口和主窗口的所有指标上同时跳动,在截图上可以看到。其中一个指标的代码。
使用数组而不是变量
并在循环中检查它。
要通过输入法输入所有这些,你需要一个字符串
分裂,并把它塞进一个数组。有一些字符串函数用于此。而且你可以在CodeBase中找到这种操作的例子。
有时它只说 "上升",而不说货币对。如何解决这个问题?
有时它只显示 "上升",而没有显示货币对。如何解决这个问题?
为什么你需要100次的循环迭代?为什么你需要100个阵列?
为什么不把它变成动态的,当你在初始化字符串 中找到一个新的符号时,增加它的大小并填充数组?
然后在填充数组的大小上进行迭代次数的循环。
你检查过你在阵列中的内容吗?
有时它只显示 "上升",而没有显示货币对。我怎样才能解决这个问题呢?
要像这样做
Dob.而在inite中,当你向其添加一个值时,增加数组的数量
有时它只显示 "上升",而没有显示货币对。如何解决这个问题?
好吧,试试吧。
关于"......但如果同时在几对上满足了条件,警报只在一对上...... " 我要说的是。
你检查一个符号上的时间,但你把它写进一个单一的变量,用于你拥有的所有符号。当然,而且只有在当前这根柱子上的第一个符号才会有警报。你需要一个结构数组,每个符号有两个字段--名称字段和时间字段,并且已经将每个符号的警报时间写入其中。
例如,像这样。
有时它只显示 "上升",而没有显示货币对。我怎样才能解决这个问题呢?
问题出在这一行
因为我在一个柱子上检查几种货币,除了时间,我还应该检查货币,以避免在一个柱子和一个符号上重复警报,但允许在同一个柱子上用不同的符号发出警报。乍一看,我们还需要一个带有标志的数组,以确定该符号是否被查看。
一般来说,要么在这一行增加符号检查,要么只在新条形图 打开的条件下重复循环。但我有一个担心,当使用这个指标的符号上有一个新的条形图时,新的条形图还没有在另一个符号上绘制。
结论是:我们必须使我们的头部肌肉紧张,以确定每个符号上是否出现了新的条形符号,但同时又不能把线的数量拉到无限大。我没有现成的解决方案。而且我不喜欢通过写代码来建议...