如何编码? - 页 304

 

...

1.一般来说,没有,检查它没有意义,因为大多数情况下,你会有比移动平均线 "稳定 "所需的多得多的条形。这不是一个旧的错误,而是对历史上有多少个条形的简单检查。

2.2.是的。请记住,由于iClose()(以及类似的iOpen()、iHigh()和iLow())是函数,而Close[]、Open、High[]、Low[]是一个简单的数组,对数值的访问快得多,所以你必须权衡你是否真的需要函数的灵活性而不是数组 的速度和简单的访问

zzz:
你好,我是编程新手,但不是交易新手。我有一段时间没有发帖,现在,自从我开始开发我的EA,我有很多问题。我先从建立一个指标开始,一旦它达到我想要的效果,我就会进一步开发。我阅读了所有我能找到的手册,所以现在是时候让我继续编写代码了。

对不起,如果这是个错误的主题--请让我知道我应该在哪里发布这样的问题。

我现在有两个,可能是基本的问题,请问。

1.在许多使用MAs的指标中,我看到了检查图表上有多少条的线条。那么,如果我需要MA200,而图表上只有,比如说,100条,那么iMA200能工作吗?我想是的--我检查过了,任何MA在任何图表上绘制都没有问题,所以我想这是Metaquotes现在修复的一个旧的错误。那么,在绘制MA或使用iMA功能时,是否有必要检查图表上有多少条?

2.2.Close和iClose之间有什么区别?我的理解是,Close只能返回当前图表上的收盘价,而iClose可以返回任何货币对和任何时间框架的任何收盘价。在这两种情况下,为了获得最后一个收盘条,我必须使用索引[1]。我的看法正确吗?

谢谢你。
 

MT4的DoubleStochastic,真正的DoubleStochastic

大家好--新的MT4用户。

我正在努力寻找MT4的DoubleStochastic指标。它是我在VTT平台上最喜欢的指标。我指的是真正的DoubleStochastic - 而不是Bressert DoubleStochastic,它提供的指示与原始DoubleStochastic完全不同。请看所附文件--VTT的Double与MT4的Double给出的指示有点不同。

有谁能帮我把VTT'2 DoubleStochastic编码到MT4中吗?以下是VTT代码和逻辑。

快速%K = ((今天的收盘价-%K期的最低价)/(%K期的最高价-%K期的最低价))* 100

慢速%K = 快速%K的N期移动平均值

双重%K = ((今天的慢速%K -%K期间的最低慢速%K) / (%K期间的最高慢速%K -%K期间的最低慢速%K))* 100

双倍慢速%K = 双倍%K的N期移动平均数

%D = 双倍慢速%K的3期简单移动平均数

以及代码本身。

St:=Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100, Sl,Mt);

DSt:=Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K))*100,Sl,Mt);

DStD:=Mov(DSt,D,MtD)。

有谁能流利地使用MT4?

我已经习惯了VTT的版本,以至于我无法使用其他版本。

 

...

gmailer

在这里发布了一个双重随机性:https://www.mql5.com/en/forum/177239/page28(为了把所有版本的随机性放在一个地方)。

我想这就是你要找的东西。

gmailer:
大家好--新的MT4用户。

我正在努力寻找MT4的DoubleStochastic指标。它是我在VTT平台上最喜欢的指标。我指的是真正的DoubleStochastic--而不是Bressert Double Stochastic,后者提供的指示与原始DoubleStochastic完全不同。请看附件 - VTT的Double和MT4的Double给出的指示有点不同。

有谁能帮我把VTT'2 DoubleStochastic编码到MT4中吗?以下是VTT代码和逻辑。

快速%K = ((今天的收盘价-%K期的最低价)/(%K期的最高价-%K期的最低价))* 100

慢速%K = 快速%K的N期移动平均值

双重%K = ((今天的慢速%K -%K期间的最低慢速%K) / (%K期间的最高慢速%K -%K期间的最低慢速%K))* 100

双倍慢速%K = 双倍%K的N期移动平均数

%D = 双倍慢速%K的3期简单移动平均数

以及代码本身。

St:=Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100, Sl,Mt);

DSt:=Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K))*100,Sl,Mt);

DStD:=Mov(DSt,D,MtD)。

有谁能流利地使用MT4?

我已经习惯了VTT的版本,以至于我无法使用其他版本。
 

^ 谢谢--这可能是它。你知道如何去掉底部和顶部的那些 "绿色和粉红色的点 "吗?

 

谢谢你,这很有意义。

 

大家好。

我正在努力寻找一种方法,当我的随机指标 线在超买(80)或超卖(20)区域内交叉时触发交易。我能够在我的线交叉时触发交易,但是我无法将其设置为只在超买或超卖区域时触发交易。有谁知道我怎样才能做到这一点,或者有什么其他地方可以参考吗?

我在一些网站上看到一些关于将一些数值设置为20.1和80.1的内容,但没有其他内容。

请帮助提供一些线索。谢谢。

谢谢

特伦斯

 

...

特伦斯。

这里有一个主题,有一些实用的代码,可以作为你所需要的例子:https://www.mql5.com/en/forum/179114

tkuan77:
大家好。

我正在努力寻找一种方法,当我的随机指数线在超买(80)或超卖(20)区域内交叉时触发交易。我能够在我的线交叉时触发交易,但是我无法将其设置为只在超买或超卖区域时触发交易。有谁知道我怎样才能做到这一点,或者有什么其他地方可以参考?

我在一些网站上看到一些关于将一些数值设置为20.1和80.1的内容,但没有其他内容。

请帮助提供一些线索。谢谢。

谢谢

特伦斯
 

你好,我已经纠正了功能,现在对它们很满意。看起来不错。然而,当我回溯测试 时,交易结果日志只包含一个买入订单。我认为这可能与我的GetLots函数有关,但我不是100%,尽管我看了好几遍--你能不能把你的目光投向它,如果你发现有什么不对,请告诉我?谢谢。

//---计算多头头寸手数的函数

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates()。

双重MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lots需要被规范化以适应LotStep。

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // 归一化并不是四舍五入,而是削减大于LotStep的任何部分。

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // 这样风险就会小一点。

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

如果(LotStep == 1.00) LotDigit = 0;

如果(LotStep == 0.10) LotDigit = 1;

如果(LotStep == 0.01) LotDigit = 2;

如果(GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

如果 (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) 。

否则 LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit)。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots)。

返回(LotsLong)。

如果(GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

如果(AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) 。

否则 LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit)。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots)。

返回(LotsLong)。

}

 

...

我发布的GetLots()的形式已经过测试,它可以正常工作。不需要对它进行任何改变。使用它作为一个函数,在开仓时确定手数。保留其余的逻辑(该函数应该只做这个:根据风险、止损和当前账户 状态找出订单大小)。

没有其他的代码,我无法帮助你。这就像我可以通过一个小洞看到整个世界一样。这是不可能的。如果你想对代码的其余部分保密,我所能帮助的就是你在这里发布的代码,我再重复一遍:请放心,原始形式的GetLots()可以正常工作,它应该以原始形式使用。

如果你想用可变的结果来使用它,请动态地改变风险或止损的输入(在GetLots()之前的代码中 "决定 "风险或止损,然后用这些改变的风险或止损来调用它--该函数将对给定的改变的输入进行正确计算),不需要改变该函数的代码

crsnape@btinternet.com:
你好,我已经纠正了这些函数,现在对它们很满意。看起来不错。然而,当我回测时,交易结果日志只包含一个买入订单。我认为这可能与我的GetLots函数有关,但尽管我看了好几遍,我还是不能百分之百的理解 - 你能不能把你的眼睛看一下,如果你发现有什么不对的地方,请告诉我?谢谢。

//---计算多头头寸手数的函数

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates()。

双重MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lots需要被规范化以适应LotStep。

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // 归一化并不是四舍五入,而是削减大于LotStep的任何部分。

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // 这样风险就会小一点。

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

如果(LotStep == 1.00) LotDigit = 0;

如果(LotStep == 0.10) LotDigit = 1;

如果(LotStep == 0.01) LotDigit = 2;

如果(GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

如果 (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) 。

否则 LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit)。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots)。

返回(LotsLong)。

如果(GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

如果(AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) 。

否则 LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit)。

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit)。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots)。

返回(LotsLong)。

}
 

Hi mladen 我完全同意你的观点,你提供的GetLots函数 确实在正常工作;我把它作为我的代码的一部分进行了测试,它很有效。

我对它进行了修改,只是因为我想根据我是赢还是输来改变我的风险 peramter。我基本上对现有的代码进行了阐述(或者说是尝试),加入了额外的资金管理规则。

我可以诚实地说,我的代码不是秘密;我相信许多其他人已经考虑并在代码中实现了我想做的事情;但我想有一个隐私的因素,因为我个人花了这么多时间开发它。

我将继续审查我的代码,我显然想尝试自己解决任何问题,因为我对从头开始学习和做事情感到自豪。

但我理解你的最后一段;我将使用一个'风险'变量,并在一个函数的输出上相应地改变这个风险。

总之,再次感谢你的回复,这个论坛没有你就不一样了,你已经帮助我无数次了。

干杯:-)