如何编码? - 页 302

 

...

是的,你可以

唯一的限制是,当它以一个死循环结束时,你不会遇到 "循环调用"。除此以外,对函数调用 没有任何限制。

crsnape@btinternet.com:
说得好。我得看看这个问题。

关于函数的一个问题,是否可以在一个函数中调用一个函数?例如,我有这样一个函数。

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

如果(......等

然后我再调用它。

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)
 

我输入了这段代码来检索最后打开的订单。

//------计算最后打开的订单的票号的函数

int LastOpenTicket()

{

datetime lastTime = 0;

int lastTicket = -1; // 没有打开。

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

如果(OrderSelect(pos, SELECT_BY_POS) // 只有我的订单w/)

&& OrderMagicNumber() == MagicNumber // 我的神奇数字

&& OrderSymbol() == Symbol() // 和我的配对。

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket()。

}

返回(lastTicket)。

}

它是一个从我的GetLots函数中调用的函数--编译器没有错误,但当我回测时,结果部分是完全清楚的。没有交易。这是因为在上面的代码中,第一笔交易没有以前的交易可以调用吗?

在日志中,它加载了外部变量(其中加载了神奇的42号,但在我的代码中是42552......),但此后就没有了。

 

...

你的魔法号码的声明是什么(应该是int MagicNumber; )

crsnape@btinternet.com:
我输入这段代码是为了找回最后一笔开仓的订单。

//-----计算最后一次开票的票号的函数

int LastOpenTicket()

{

datetime lastTime = 0;

int lastTicket = -1; // 没有打开。

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

如果(OrderSelect(pos, SELECT_BY_POS) // 只有我的订单w/)

&& OrderMagicNumber() == MagicNumber // 我的神奇数字

&& OrderSymbol() == Symbol() // 和我的配对。

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket()。

}

返回(lastTicket)。

}

它是一个从我的GetLots函数中调用的函数--编译器没有错误,但当我回测时,结果部分是完全清楚的。没有交易。这是因为在上面的代码中,第一笔交易没有以前的交易可以调用吗?

在日志中,它开始加载外部变量(其中加载了神奇的42号,但在我的代码中是42552......),但此后就没有了。
 

是的,它是int MagicNumber = 42557

 

...

那么,我无法从你发布的代码中看出它为什么做错了(例如,为什么它接收了错误的MagicNumber)。如果有任何指定的MagicNumber的订单被打开,该代码应该工作(它将在已打开的订单中循环),如果没有已打开的订单或MagicNumber和符号不匹配,它将返回-1(正如你所期望的),所以该代码是正确的(现在测试了它,它工作得很好)。

对不起,但这是我从你发布的代码中所能做的一切

crsnape@btinternet.com:
是的,它是int MagicNumber = 42557
 

如果以前没有开过单,而这是第一个,会发生什么?我知道它返回-1,但代码EA会不会运行失败,因为我的GetLots函数依赖于调用最后打开的订单票号

 

如果它依赖于至少有一个先前打开的订单存在,那么它将失败

在你的条件中添加类似这样的内容。

如果(LastOpenOrder()==-1)

...那么你可以打开订单,如果所有其他的条件都满足的话

否则

...像以前一样检查 最后打开的订单,再加上其他的条件

(只是在猜测你现在如何写你的EA条件)

crsnape@btinternet.com:
如果以前没有开过单子,而这是第一个,会发生什么情况?我知道它返回-1,但EA代码会不会运行失败,因为我的GetLots函数依赖于调用最后开出的订单票号。
 

你好,姆拉登。

你知道当随机 线在20级或80级交叉时如何设置开仓交易吗?

举例来说。

当随机指数在20级时相互交叉(超卖),做多

当随机指数在80级相互交叉时(超买),做空

问候

阮文杰

 

我在这段代码中增加了几行--这就是使用LastOpenTicket()函数的地方,但它还是不喜欢它。我添加了-1选项。你觉得这里有什么问题吗?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

如果(OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

如果(OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

返回(WinLossPreviousShort)。

}

如果((OrderProfit() < 0 && OrderType() == OP_SELL)|| LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

返回 (WinLossPreviousShort);

}

}

}

 

...

你为什么不在该函数 中增加一个可能的结果:比如当LastOpenTicket() == -1时,WinLossPreviousShort="Na"

crsnape@btinternet.com:
我在这段代码中增加了几行--这就是使用LastOpenTicket()函数的地方,但它仍然不喜欢。我添加了-1选项。你觉得这里有什么问题吗?

//---- 判断之前的卖单是否有利可图

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

如果(OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

如果(OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

返回(WinLossPreviousShort)。

}

如果((OrderProfit() < 0 && OrderType() == OP_SELL)|| LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

返回 (WinLossPreviousShort);

}

}

}