如何编码? - 页 305

 
gmailer:
^ 谢谢--这可能是它。你知道如何摆脱那些在底部和顶部的 "绿色和粉色点 "吗?

对不起--我实际上是在看我的其他Stoch,那里有这样的点。在回答我的第一个帖子时建议的那个是好的。谢谢!

 

也许只有一个建议:

当你有一块 "砖头"(一个函数,一个片段,一部分代码)工作正常时,不要改变它。函数是好的,因为你可以改变它们的输入,它们根据输入工作。而且,一旦你在各种情况下测试了函数,你就不必考虑它是否工作正常。这样一来,你就可以在搜索错误时缩小你必须查看的代码范围(这可以极大地加快开发时间)。

crsnape@btinternet.com:
你好,我完全同意你的观点,你提供的GetLots函数确实在正常工作;我把它作为我的代码的一部分进行了测试,它起作用了。

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

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

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

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

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

谢谢你:-)
 

我不太清楚的是函数 的括号和其中的内容。

如果我在一个函数中写一个函数,我是否需要把这个函数的名字放在括号里?

例如,如果我有一个函数LastOpenTicket(),在一个名为GetLots的函数中调用,我是否需要把LastOpenTicket()放在括号里,比如GetLots(LastOpenTicket())?

还需要把()也放在里面吗?如果是LastOpenTicket(int number, int digit, int anotherone),在这种情况下,是否也要把所有这些放在函数GetLots的括号里,例如GetLots(int number, int digit, int anotherone...以及函数中的任何其他变量?)

 

...

1.将{}括号对想象成 "开始 "和 "结束"

2.你不能在mql中写嵌套函数(pascal允许,但mql不允许--嵌套函数将是在其他函数的主体中声明一个函数。请看这里:嵌套函数--维基百科,自由百科全 书)。你可以在你的代码的任何部分放置对任何函数的调用

3.你可以使用这种形式的调用(直接调用,比如你的例子GetLots(LastOpenTicket())),或者你可以把LastOpenTicket()的返回值分配给某个变量,然后把它作为调用GetLots()的一个参数。

crsnape@btinternet.com:
我不确定的是函数的括号和其中的内容。

如果我在一个函数中写一个函数,我需要把这个函数的名字放在括号里吗?

例如,如果我有一个函数LastOpenTicket(),这些函数在一个名为GetLots的函数中被调用,我是否需要把LastOpenTicket()放在括号里,比如GetLots (LastOpenTicket())?

另外,我是否需要把()也放在里面?如果是LastOpenTicket(int number, int digit, int anotherone),在这种情况下,所有这些是否也要放在函数GetLots的括号里,例如GetLots(int number, int digit, int anotherone...以及函数中的任何其他变量等?)
 

这两者之间有什么区别?有什么区别吗?

double GetLots (int number, int call, int specialcall, int order)

{

和。

double GetLots ()

{

int number;

int call;

int specialcall;

int order;

?

 

...

第一个是一个接受参数的函数

第二个是一个没有参数的函数,所以你不能在函数体外改变 "数字"、"调用"、"特殊调用 "和 "顺序 "的值。

关于声明函数的一些更有用的信息可以在这个主题中找到:https://www.mql5.com/en/forum/173005

crsnape@btinternet.com:
这两者之间有什么区别?有什么区别吗?

double GetLots (int number, int call, int specialcall, int order)

{

和...

double GetLots ()

{

int number;

int call;

int specialcall;

int order;

?
 

在过去的几天里,我一直在玩我的函数,但我仍然得到空白的结果。我简直要把我的头发撕掉了。

我按照你的建议修改了计算RiskSize的函数(我同意它现在是一个更好的系统),并在我的GetLots函数中使用它。这就是它。

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates()。

双重MinLots, MaxLots, LotStep;

双倍 LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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;

如果(AccountBalance() > AccountFreeMargin())

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

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

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

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

返回(LotsLong)。

}

其还抱怨RiskLong--变量没有定义。但这是在其调用的函数GetRiskLong下定义的。

如果仅凭我发布的代码很难提供帮助,我可以把它发给你吗?

 

...

首先,没有必要为多头和空头分别做手。使用一个函数(已经提供给你了)来处理两种订单(计算短线和长线的手数必须完全相同),如果你希望不同的计算方式,只需改变风险或止损 距离即可。

你所得到的错误是因为在函数中声明的变量只在函数中 "可见"。你调用的函数有一个叫你所告诉的名字的变量,这并不重要:它只对被调用的函数是本地的,其他部分的代码不 "知道 "它,不能访问它。

crsnape@btinternet.com:
在过去的几天里,我一直在玩我的函数,但我仍然得到空白的结果。我简直要把我的头发撕碎了。

我按照你的建议修改了计算RiskSize的函数(我同意它现在是一个更好的系统),并在我的GetLots函数中使用它。这就是它。

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates()。

双重MinLots, MaxLots, LotStep;

双倍 LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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;

如果 (AccountBalance() > AccountFreeMargin())

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

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

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

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

返回(LotsLong)。

}

其还抱怨RiskLong--变量没有定义。但这是在其调用的函数GetRiskLong下定义的。

如果仅凭我发布的代码很难提供帮助,我可以把它发给你吗?
 
mladen:
首先是一个接受参数的函数

其次是一个没有参数的函数,所以你不能在函数体外改变 "数字"、"呼叫"、"特殊呼叫 "和 "顺序 "的值。

关于声明函数的一些更有用的信息可以在这个主题中找到:https://www.mql5.com/en/forum/173005

谢谢你的建议。因此,如果我从一个叫GetLots的函数中调用一个叫GetRisk的函数,我需要把函数GetRisk的变量放在GetLots的括号里(...),因为这些值是在函数GetLots之外计算的?

 

...

让我试试这种方式。

2个问题(假设我们知道账户的当前$状态):

问题1:我愿意冒(不知道)%的风险,带(不知道)点的止损。我的手数应该是多少?

问题2:我愿意承担1%的风险,100点的止损。我的手数应该是多少?

很明显,第一个问题的答案是不可能的,因为你不知道我愿意承担的风险百分比,也不知道我将使用的止损。但在第二个例子中,由于你知道所有这些,所以有可能计算出手数。现在,这些都是参数:因为我们预测rsik%和止损可能会变化,所以我们把这些作为可变参数提供给手数计算,当函数被调用时,这些参数将被 "告诉 "函数。

希望这澄清了函数中的参数(parameters)的作用。每一个函数的工作原理都是一样的:如果你预测到计算的某些部分会出现问题,就把它作为一个参数给函数。

下面是一些更多的编码函数的例子:https://en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
谢谢你的回答。因此,如果我从一个叫GetLots的函数中调用一个叫GetRisk的函数,我需要把函数GetRisk的变量放在GetLots的括号里(...),因为这些值是在函数GetLots之外计算的?
原因: