函数实现的参数列表和预声明的参数列表不符合,事件处理机制问题终于解决了!!!!


根据错误信息,问题在于函数实现的参数列表和预声明的参数列表不符合。这通常是因为在定义函数时,参数列表与之前声明的不一致。

函数定义(Defs)必须与函数声明的参数列表完全一致。检查代码中发现,在Defs部分定义的函数,其参数列表必须与在Events或其他地方调用时使用的参数列表一致。

但是,请注意,在TradeBlazer中,通常不会像C++那样先声明函数原型再定义函数。而是直接在Defs部分定义函数。所以,这个错误可能是由于函数定义与函数调用时的参数不匹配。

观察错误行号280和285,需要查看这些行附近的函数定义。

然而,并没有看到Defs部分有函数定义?实际上,在之前的代码中,定义了很多函数,比如CalcTargetPrice, IsPriceInRange等。

现在,如果在Defs中定义了一个函数,那么在Events中调用它时,参数必须匹配。

但是,示例提供的代码中,并没有定义任何函数,而是直接使用A_SendOrderEx。所以,错误可能出现在之前定义的函数中.所以,错误可能是在之前的代码中,定义了一些函数,但是这些函数的参数列表与声明不一致。

所以需要检查之前代码中Defs部分的函数定义。

由于错误信息指向了行号280和285,在之前提供的代码中。确实定义了很多函数。例如,定义了SendTradeOrderEx函数,但是它的参数列表是:

Bool SendTradeOrderEx(String sym, Numeric direction, Numeric action, Numeric volume, Numeric price)

而在OnBar中,调用的是A_SendOrderEx,并不是SendTradeOrderEx。所以,如果在代码中保留了SendTradeOrderEx函数,并且它的定义与声明不一致,则会出现错误。

但是,在TradeBlazer中,函数定义不需要单独声明,所以不存在声明和定义不一致的问题。除非我们在Defs中定义了同一个函数两次,或者函数定义与系统内置函数冲突。

另一种可能:错误信息可能指的是系统内置函数的参数列表与调用时不一致。但是,A_SendOrderEx是系统内置函数,它的参数列表是固定的。

注意到,A_SendOrderEx的参数列表为:

A_SendOrderEx(Enum_Buy, Enum_Entry, 3, Q_AskPrice, orders, "", A_GetOrderCreateSource)

而根据TradeBlazer文档,A_SendOrderEx的参数列表为:

Bool A_SendOrderEx(Numeric nDirection, Numeric nOffset, Numeric nVolume, Numeric fPrice, ArrayRef<Integer> aOrderIDs, String strGroupName = "", String strCreateSource = "")

所以,参数列表是匹配的。

因此,错误可能出现在之前定义的函数中。例如,之前定义的SendTradeOrderEx函数,在定义时参数列表与调用时不一致。

所以,解决方案是:检查代码中Defs部分定义的函数,确保每个函数的参数列表与调用时一致。如果不需要这些函数,可以删除。

并直接使用A_SendOrderEx。

使用A_SendOrderEx,可以重写代码,去掉自定义的SendTradeOrderEx函数,并在需要的地方直接调用A_SendOrderEx。

下面,只使用A_SendOrderEx,并去掉Defs部分。

但是,由于代码逻辑比较复杂,需要保留一些辅助函数。如果保留,则必须确保函数定义正确。

由于错误信息指出函数实现的参数列表和预声明的参数列表不符合,可以检查Defs中每个函数的参数列表,确保它们与函数定义时的参数列表一致。

例如,之前定义的函数:

Bool SendTradeOrderEx(String sym, Numeric direction, Numeric action, Numeric volume, Numeric price)

这个函数有5个参数,但是在调用时,可能会传递5个参数,所以定义和调用是一致的。

那么,为什么会出现1039错误呢?

在TradeBlazer中,1039错误通常是由于函数重载导致的。TradeBlazer不支持函数重载,所以如果定义了两个同名函数,就会报错。

所以,请检查代码中是否定义了同名的函数。

另外,如果函数定义与系统内置函数同名,也会报错。

由于之前定义了一个SendTradeOrderEx函数,而系统没有这个函数,所以不会冲突。

但是,如果定义了一个与系统函数同名的函数,比如A_SendOrderEx,那么就会报错。

所以,请确保没有函数与系统函数同名。

直接使用A_SendOrderEx的代码版本,以避免函数定义错误。

但是,由于原来的代码逻辑需要,无法完全去除所有自定义函数。因此,只保留必要的函数,并确保其参数列表正确。

代码示例中,并没有使用SendTradeOrderEx,而是直接使用A_SendOrderEx,可以将代码中所有使用SendTradeOrderEx的地方替换为A_SendOrderEx,并删除SendTradeOrderEx函数的定义。

同时,确保其他自定义函数的参数列表与调用处一致。

去掉SendTradeOrderEx函数,并直接使用A_SendOrderEx。

注意:A_SendOrderEx需要传递ArrayRef<Integer>参数来获取委托ID,以及两个字符串参数(组名和创建源)。

修改平仓和开仓函数,使用A_SendOrderEx,并调整参数。

由于代码较长,只修改关键部分。

重新编写OpenLongPositionEx、OpenShortPositionEx、CloseLongPositionEx、CloseShortPositionEx函数,使用A_SendOrderEx。

同时,保留一些必要的辅助函数,如CalcTargetPrice、IsPriceInRange等。

只给出修改后的部分函数示例,其余类似。

例如,修改OpenLongPositionEx函数:

Bool OpenLongPositionEx()
{
String sym = GetTradeSymbol();
Numeric volume = Min(Lots, MaxPosition);
volume = volume * PositionRatio;
volume = IntPart(volume);
If(volume < 1) volume = 1;


注意:A_SendOrderEx的返回值通过result接收,错误信息通过errorMsg接收。还需要将返回的委托ID数组中的每个ID添加到跟踪列表中。

同样,需要修改其他开平仓函数。

由于代码量很大,不再这里完整重写。只给出修改方向。


错误,函数实现的参数列表和预声明的参数列表不符合,
函数实现的参数列表和预声明的参数列表不符合,请问如何修改
A_GetPosition函数调用时的参数数目与声明时不符合(太多的调用参数)
老师好,请问函数调用时的参数数目与声明时不符合,怎么解决这个问题啊?如下图
公式参数可以列表显示吗?
公式参数中数组变量必须使用列表初始化
委托列表与成交列表
TBq上变量mid函数调用时的参数数目也声明时不符合(太少的调用参数)怎么解决
公式管理--调用列表--子级函数 是空的
Def公示使用过程提示【函数调用时的参数数目与声明不符合(太少的调用参数)】

你想说明什么情况呢 ?

好像也不是在问问题?