新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 21 1...141516171819202122232425262728...1953 新评论 [删除] 2016.11.29 11:09 #201 Renat Akhtyamov:这里唯一需要考虑的是,在循环块i==x之后在这种情况下,Array[i]在for(...){}之后会返回一个数组超限的错误,就是这样了。通过这样做,你为可能出现的错误提供了肥沃的土壤,例如,如果在代码的后面,你有一个变量j,而你不小心调用了i。或者你可以写[i]而不是数组索引[1],等等。 我在这里写的不是一个特定的代码,而是一个可能是什么的例子。很可能发生的情况是,没有数组边界,错误很难被发现,你将花费许多宝贵的时间(如果不是几个小时)来定位它。 Vitaly Muzichenko 2016.11.29 21:00 #202 (我需要一个提示,我开始变得滞后了)有一个这样的结构。int RangeBar = 10; HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1)); LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));它在N个蜡烛中 找到范围 的高/低 点。问题:如何找到相同的高/低点,但不是通过影子,而是通过身体? Artyom Trishkin 2016.11.29 21:13 #203 Vitaly Muzichenko:(我需要一个提示,因为我开始变得滞后了)有一个这样的结构。int RangeBar = 10; HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1)); LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));它在N个蜡烛中 找到范围 的高/低 点。问题:如何找到相同的高/低点,但不是通过影子,而是通过身体? 我需要找到顶部的fmax(Open[i],Close[i])和底部的fmin(Open[i],Close[i)。 Vitaly Muzichenko 2016.11.29 21:19 #204 Artyom Trishkin: 我需要寻找顶部的fmax(Open[i],Close[i])和底部的fmin(Open[i],Close[i)。也就是说,做一个循环回路而不是两行寻找高/低?HighRange =iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1))。LowRange =iLow(符号,0,iLowest(符号,0,MODE_LOW,RangeBar,1))这是EA需要的,不是指标,它在EA中工作正常,但如何通过机构找到范围--我想不出。 Artyom Trishkin 2016.11.29 22:10 #205 Vitaly Muzichenko:也就是说,做一个循环回路而不是两行寻找高/低?HighRange =iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1))。LowRange =iLow(符号,0,iLowest(符号,0,MODE_LOW,RangeBar,1))。我需要它用于专家顾问,而不是用于指标,它在专家顾问中工作正常,但我不知道如何通过机构找到范围。我附上了一个测试脚本。它可能不准确,我没有在这方面下功夫。我希望你能想出办法。//+------------------------------------------------------------------+//| sFindRangeByCandlesBody.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 script_show_inputs//--- input parametersinput int Begin=1; // Бар начала диапазона поискаinput int RangeBars=20; // Диапазон поиска//---int bars=Bars(Symbol(),PERIOD_CURRENT);int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);int rangeBars=(RangeBars<2?2: RangeBars>bars-begin?bars-begin: RangeBars); // Диапазон поиска//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() {//--- MqlRates array[]; double high=0, low=0; int highest=-1, lowest=-1; if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) { ArraySetAsSeries(array,true); high=GetHighestValue(begin,array,highest); low=GetLowestValue(begin,array,lowest); } Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest); }//+------------------------------------------------------------------+double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){ int sz=ArraySize(array); if(sz==0) return(-1); double high=DBL_MIN; bar_highest=-1; for(int i=0; i<sz; i++) { double value=fmax(array[i].open,array[i].close); if(value>high) { high=value; bar_highest=bar_begin+i; } } return(high);}//+------------------------------------------------------------------+double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){ int sz=ArraySize(array); if(sz==0) return(-1); double low=DBL_MAX; bar_lowest=-1; for(int i=0; i<sz; i++) { double value=fmin(array[i].open,array[i].close); if(value<low) { low=value; bar_lowest=bar_begin+i; } } return(low);}//+------------------------------------------------------------------+ 如果你有任何问题,就请问... Any questions from newcomers 初学者的问题 MQL5 MT5 MetaTrader question Regarding reading history Vitaly Muzichenko 2016.11.29 22:33 #206 Artyom Trishkin:我刚刚抛出了一个测试脚本。可能有不准确的地方--我当场写的。我希望你能掌握其中的诀窍。//+------------------------------------------------------------------+//| sFindRangeByCandlesBody.mq4 |//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |//| https://login.mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+...//+------------------------------------------------------------------+ 如果有什么事,就问...谢谢你,它非常好用!PS。我了解到,这东西在五号机上能用? Artyom Trishkin 2016.11.29 22:43 #207 Vitaly Muzichenko:谢谢你,它非常好用!PS。我想,这东西在第五区也能用吧? 是的,试图做跨平台的代码。或者对第五种进行最小的修改。 giannis1386 2016.11.30 04:15 #208 我的手艺很差,请帮助我为卖出(slevel)添加止损。int start(){//+--------------------------------------------------------------------+//| -= stop loss в без убыток =- |//+--------------------------------------------------------------------+bool result;double stop;int cmd,error;for(int i=0;i<OrdersTotal();i++){if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS){ cmd=OrderType();double blevel=OrderStopLoss()<Bid-Point*TS;double slevel=OrderStopLoss()>Ask+Point*TS;//---if(cmd==OP_BUY || cmd==OP_SELL){while(true){if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;else stop=Ask+Point*TS; result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }else error=0;if(error==135) RefreshRates();else break;}}}} Any questions from newcomers 求助,我想请高手朋友们写一个 止盈--止损脚本 help me please , Alexey Viktorov 2016.11.30 06:19 #209 Artyom Trishkin:我附上了一个测试脚本。可能是不准确的,我没有练过手。我希望你能理解它。如果你有任何问题...对不起,Artem,但我想用一种更简单的方式来展示这个问题的解决方案 double openCandle[], closeCandle[]; CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle); CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle); double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]); double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);我希望每个人都能在他们的代码中写出它,并添加所需的检查。该功能对于mql4和mql5都是一样的。 Artyom Trishkin 2016.11.30 06:31 #210 Alexey Viktorov:对不起,Artem,但我想展示一个更简单的解决方案来解决这个问题 double openCandle[], closeCandle[]; CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle); CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle); double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]); double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);我希望每个人都能在他们的代码中写出它,并添加必要的检查。该功能对于mql4和mql5都是一样的。О!谢谢你。我自己在早上还没有猜到...这是真的,应该检查数组的填充情况。我在四合院中没有看到,在五合院中,由于缺乏历史数据,数据往往不能第一次填入。ZS.你应该多睡觉--你的思想会朝这个方向努力。 1...141516171819202122232425262728...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这里唯一需要考虑的是,在循环块i==x之后
在这种情况下,Array[i]在for(...){}之后会返回一个数组超限的错误,就是这样了。
(我需要一个提示,我开始变得滞后了)
有一个这样的结构。
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));
它在N个蜡烛中 找到范围 的高/低 点。
问题:如何找到相同的高/低点,但不是通过影子,而是通过身体?
(我需要一个提示,因为我开始变得滞后了)
有一个这样的结构。
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));
它在N个蜡烛中 找到范围 的高/低 点。
问题:如何找到相同的高/低点,但不是通过影子,而是通过身体?
我需要寻找顶部的fmax(Open[i],Close[i])和底部的fmin(Open[i],Close[i)。
也就是说,做一个循环回路而不是两行寻找高/低?
HighRange =iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1))。
LowRange =iLow(符号,0,iLowest(符号,0,MODE_LOW,RangeBar,1))这是EA需要的,不是指标,它在EA中工作正常,但如何通过机构找到范围--我想不出。
也就是说,做一个循环回路而不是两行寻找高/低?
HighRange =iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1))。
LowRange =iLow(符号,0,iLowest(符号,0,MODE_LOW,RangeBar,1))。我需要它用于专家顾问,而不是用于指标,它在专家顾问中工作正常,但我不知道如何通过机构找到范围。
我附上了一个测试脚本。它可能不准确,我没有在这方面下功夫。我希望你能想出办法。
//| sFindRangeByCandlesBody.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 script_show_inputs
//--- input parameters
input int Begin=1; // Бар начала диапазона поиска
input int RangeBars=20; // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
RangeBars>bars-begin?bars-begin:
RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
MqlRates array[];
double high=0, low=0;
int highest=-1, lowest=-1;
if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
ArraySetAsSeries(array,true);
high=GetHighestValue(begin,array,highest);
low=GetLowestValue(begin,array,lowest);
}
Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
}
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
int sz=ArraySize(array);
if(sz==0) return(-1);
double high=DBL_MIN;
bar_highest=-1;
for(int i=0; i<sz; i++) {
double value=fmax(array[i].open,array[i].close);
if(value>high) {
high=value;
bar_highest=bar_begin+i;
}
}
return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
int sz=ArraySize(array);
if(sz==0) return(-1);
double low=DBL_MAX;
bar_lowest=-1;
for(int i=0; i<sz; i++) {
double value=fmin(array[i].open,array[i].close);
if(value<low) {
low=value;
bar_lowest=bar_begin+i;
}
}
return(low);
}
//+------------------------------------------------------------------+
我刚刚抛出了一个测试脚本。可能有不准确的地方--我当场写的。我希望你能掌握其中的诀窍。
//| sFindRangeByCandlesBody.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
谢谢你,它非常好用!
PS。我了解到,这东西在五号机上能用?
谢谢你,它非常好用!
PS。我想,这东西在第五区也能用吧?
{
//+--------------------------------------------------------------------+
//| -= stop loss в без убыток =- |
//+--------------------------------------------------------------------+
bool result;
double stop;
int cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
我附上了一个测试脚本。可能是不准确的,我没有练过手。我希望你能理解它。
如果你有任何问题...
对不起,Artem,但我想用一种更简单的方式来展示这个问题的解决方案
CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);
我希望每个人都能在他们的代码中写出它,并添加所需的检查。该功能对于mql4和mql5都是一样的。
对不起,Artem,但我想展示一个更简单的解决方案来解决这个问题
CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);
我希望每个人都能在他们的代码中写出它,并添加必要的检查。该功能对于mql4和mql5都是一样的。
О!谢谢你。我自己在早上还没有猜到...这是真的,应该检查数组的填充情况。我在四合院中没有看到,在五合院中,由于缺乏历史数据,数据往往不能第一次填入。
ZS.你应该多睡觉--你的思想会朝这个方向努力。