新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 176

 
mila.com:

阅读,但绝不会猜到在循环之前打开文件)

也许我没有仔细阅读 )
甚至还有一个从头到尾逐行读取文件的例子...
 

有一个专家顾问,在交易时由Pinbar指导。该机器人在货币上工作正常,在CFD上则完全无法预测。

你能告诉我这是如何发生的吗?

 
RichLux:

我写了一个机器人,它在交易时是基于Pinbar的。该机器人在货币上工作正常,在CFD上则完全无法预测。

你能告诉我这是如何发生的吗?

这里是 为你的案件提供的一切。
 

以下是Pinbar的定义函数

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

当我把它插入到专家顾问中时,对于货币对来说,该函数工作正常(即专家顾问在与该函数的条件相对应的条形图之后的下一个条形图上设置交易)。然而,差价合约的交易在任何地方都可以打开。

对于这个功能,差价合约和货币对之间有什么区别?

 
RichLux:

以下是Pinbar的定义函数

当我把它插入到专家顾问中时,对于货币对来说,该函数工作正常(即专家顾问在与该函数的条件相对应的条形图之后的下一个条形图上设置交易)。然而,差价合约的交易在任何地方都可以打开。

对于这个功能,差价合约和货币对之间有什么区别?

首先,用{}替换所有的&&,这样每个条件都在自己的区块中--然后你可以在每个区块中取消打印测试结果--看看你在日志中得到什么值。
 
Artyom Trishkin:
首先,用{}替换所有的&&,这样每个条件都在自己的区块中--然后你可以在每个区块中解开测试结果--在日志中看看你得到了什么值。

谢谢,我听从了建议,明白了自己的错误所在。因为我的EA是以5位数移动的,而CFD只有2位数,我期望EA的反应最小为50点,但得到的反应是5点。我搞砸了。

请在这个方面帮助我。

代码中有这样一个部分。

MathAbs(Close1-Open1)/(High1-Low1)

有时会发生High1=Low1的情况。然后测试者产生了关键错误,说它不能除以零。

如何解决这个问题?

 
RichLux:

谢谢,我听从了建议,明白了自己的错误所在。因为我的EA是以5位数移动的,而CFD只有2位数,我期望EA的反应最小为50点,但得到的反应是5点。我搞砸了。

请在这个方面帮助我。

代码中有这样一个部分。

有时会发生High1=Low1的情况。然后测试者产生了关键错误,说它不能除以零。

如何解决这个问题?

你可以不假思索地做。

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

你好,在编译过程中遇到了一个问题。


空白的OnTick()

{

double minprice=999999, mp, maxprice=-999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

如果(mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

如果(mp > maxprice)

maxprice = mp;

}

Comment("Minprice: " + DoubleToString(minprice, 5) + "\n "+

"Maxprice: " + DoubleToString(maxprice, 5))

}


源代码包含编译器发誓的iLow和iHigh的函数,以及字符串模式下的变量Simbol(),但它解决了例子中的另一个问题。我在上面的代码中需要修正什么。我 被卡住了,无法编译循环来检查它。

课本中的

如果你想获得与当前不完整条对应的值,那么

你可以使用第一种形式的调用,指定start_pos=0和count=1。

例子。

#财产版权 "2009,MetaQuotes软件公司"。

#属性链接 "https://www.mql5.com"

#财产版本 "1.00"

#property description "High[i]和Low[i]值的输出示例"

#财产描述 "用于随机选择的酒吧"

双重High[],Low[]。

//+------------------------------------------------------------------+

//| 获取给定条数的低点。

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double low=0。

ArraySetAsSeries(low,true)。

int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low)。

if(copied>0 && index<copied) low=Low[index];

return(low)。

}

//+------------------------------------------------------------------+

//|获取所给条形图的高点。

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double high=0。

ArraySetAsSeries(high,true)。

int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High)。

if(copied>0 && index<copied) high=High[index];

return(high)。

}

//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

你好,在编译过程中遇到了一个问题。


空白的OnTick()

{

double minprice=999999, mp, maxprice=-999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

如果(mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

如果(mp > maxprice)

maxprice = mp;

}

Comment("Minprice: " + DoubleToString(minprice, 5) + "\n "+

"Maxprice: " + DoubleToString(maxprice, 5))

}


源代码包含编译器发誓的函数iLow和iHigh b变量Simbol()在那里是字符串模式,但它解决了例子中的另一个问题。我在上面的代码中需要修正什么。我 被卡住了,无法编译循环来检查它。

课本中的

如果你想获得与当前不完整条对应的值,那么

你可以使用第一种形式的调用,指定start_pos=0和count=1。

例子。

#财产版权 "2009,MetaQuotes软件公司"。

#属性链接 "https://www.mql5.com"

#财产版本 "1.00"

#property description "High[i]和Low[i]值的输出示例"

#财产描述 "用于随机选择的酒吧"

双重High[],Low[]。

//+------------------------------------------------------------------+

//| 获取给定条数的低点。

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double low=0。

ArraySetAsSeries(low,true)。

int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low)。

if(copied>0 && index<copied) low=Low[index];

return(low)。

}

//+------------------------------------------------------------------+

//|获取所给条形图的高点。

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double high=0。

ArraySetAsSeries(high,true)。

int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High)。

if(copied>0 && index<copied) high=High[index];

return(high)。

}

//+------------------------------------------------------------------+


Simbol() 这个词里有一个错误,你应该写成Symbol() 或_Symbol。
 
Sergey Gritsay:

你在这个词中有一个错误Simbol() - Symbol() 或 _Symbol 应该被写成

谢谢你,关于Simbol的错误已经通过正确拼写Symbol而得到纠正。我的iLow 和iHigh功能 有问题。

MQL4和MQL5之间的区别是什么? 否则我每次看MQL4的视频教程时都要挠头。

附加的文件:
1.png  64 kb
原因: