程序库: mt-R - 页 3

 
cgarbelli:

你好


我正在尝试使用 RAssignStringVector函数,但似乎只有每个项的第一个字符会被复制到 R 会话中。

例如,MQL5 向量

{"abcd","2000","2000}

复制到 R 中为

{"a", "2", "2"}

这是一个问题还是我弄错了?

请注意,我使用 RAssignVector 和 double vector 时都没有问题。


谢谢。

克劳迪奥

我不使用 MT5,抱歉

 

注意!
在 R.mqh 文件中,变量向量 矩阵 的名称在编译时开始产生错误。将它们重命名为其他变量名后,一切正常。我使用了 vectr 和 matr。

编辑器会用蓝色高亮显示这些词的数据类型,如intdouble。显然,它们为新类型保留了字词。

 

所有函数的说明(从旧版本复制https://www.mql5.com/en/code/11112)

/**
* 返回 dll 版本。
* 返回值的高 16 位是主版本,低 16 位是次版本。
* 在 RInit() 中使用,以确保本头文件与
* zz the dll 相匹配。
*/
int RGetDllVersion();

/**
* 该函数不会被直接调用,它将在版本检查成功后被
* RInit() 调用。
*
*/
long RInit_(string commandline,int debuglevel);

/**
* 终止 R 会话。
* 此后句柄不再有效。
*/
void RDeinit(long rhandle);

/**
* 如果属于此句柄的 R 会话
* 仍在运行,则返回 true。如果您发送的
* 代码中出现任何致命错误,R 将终止运行。您应该在启动函数
* 的开头检查这一点,并停止所有操作。崩溃前的最后一条
* 命令将在日志中找到。
* 如果 R 不再运行,该库将不再发出任何
* 日志信息,并默默忽略所有命令。
*/
bool RIsRunning(long rhandle);

/**
* 如果 R 仍在执行命令,则返回 true(由调用 RExecec 命令产生)
。* 调用 RExecuteAsync() 后产生)
*/
bool RIsBusy(long rhandle);

/**
* 执行代码,不等待。但任何后续调用
* 都将等待,因为在
* 任何时候都只能有一个线程在执行。使用 RIsBusy() 检查是否已完成
*/
void RExecuteAsync(long rhandle,string code);

/**
* 执行代码并等待,直到执行完毕。
* 不会返回任何内容。使用
* RGet*()函数基本上也可以实现同样的功能,评估表达式也是
* 执行代码,唯一的区别是
* RGet*() 函数会额外尝试解析并返回
* 输出,而 RExecute() 函数只是执行、等待并
* 忽略所有输出。
*/
void RExecute(long rhandle,string code);

/**
* 给变量名分配一个 bool。在 R 中,这种类型称为 "逻辑"
*/
void RAssignBool(long rhandle,string variable,bool value);

/**
* 为变量名赋值一个整数。
*/
void RAssignInteger(long rhandle,string variable,int value);

/**
* 为变量名赋值一个 double。
*/
void RAssignDouble(long rhandle,string variable,double value);

/**
* 为变量名分配一个字符串。在 R 中,这种类型被称为 "字符"
*/
void RAssignString(long rhandle,string variable,string value);

/**
* 为变量名分配一个向量。

*/
void RAssignVector(long rhandle,string variable,double &vectr[],int size);

/**
* 为变量赋值字符向量(字符串数组)。如果需要
* 因数,则应在此命令后执行代码进行转换。在
* 最新版本的 R 中,字符串向量并不需要比
* 因数更多的内存,而且更容易添加新元素。
*/
void RAssignStringVector(long rhandle,string variable,string &vectr[],int size);

/**
* 为变量名分配一个矩阵。矩阵必须以行号作为
* 第一个维度(原始数据将使用 byrow=TRUE)。该函数比通过 RRowBindVector() 在末尾为每一行添加
* 新行来从头开始构建一个庞大的矩阵(数百行)要快得多
*。
* 通过使用带有原始二进制数据
* 的文件-IO,该函数经过优化,只需调用一次函数即可获得巨大的吞吐量。对于只有少量元素的小型矩阵和矢量,
* 这可能会造成过多的开销,而其他函数会更快。一旦
* 将可能有数千行的矩阵传输到 R,那么
* 就应该只使用 RRowBindVector() 在单个新的
* 数据矢量到来时进一步缓慢增长矩阵,而不是总是发送整个矩阵的新副本。
*/
void RAssignMatrix(long rhandle,string variable,double &matr[],int rows,int cols);

/**
* 向矩阵或数据帧追加一行。这将执行
* variable <- rbind(variable, vector)
* 如果大小与实际数组大小不匹配,可能会发生不好的事情。
*/
void RAppendMatrixRow(long rhandle,string variable,double &vectr[],int size);

/**
* 如果变量存在,则返回 true,否则返回 false。
*/
bool RExists(long rhandle,string variable);

/**
* 评估表达式并返回一个 bool。表达式可以是任何 R 代码,
* 可以求值为逻辑值。如果是逻辑向量,则只返回
* 第一个元素。
*/
bool RGetBool(long rhandle,string expression);

/**
* 评估表达式并返回一个整数。表达式可以是任何 R 代码,
* 可以求值为整数。

*/
int RGetInteger(long rhandle,string expression);

/**
* 评估表达式并返回一个 double。表达式可以是任何可以求浮点数的 R 代码
*,如果是矢量,则
* 只返回第一个元素。
*/
double RGetDouble(long rhandle,string expression);

/**
* 评估表达式并返回一个双数值向量。表达式可以是
* 任何求值为浮点数向量的内容。
* 返回值是可复制到
* 数组中的元素个数。
* 如果大小不匹配,会在调试级别 1 输出警告。
*>> 限制为 100000 个元素
*/
int RGetVector(long rhandle,string expression,double &vectr[],int size);

/**
* 为调试目的进行 print(expression) 操作。

*/
void RPrint(long rhandle,string expression);

mt4R for new MQL4
mt4R for new MQL4
  • www.mql5.com
mt4R, modified for supporting new MQL4
 
干得好!

您能否帮助解决在特定情况下出现的问题?

1) 运行两个不同经纪商的两个 mt5 终端
2) 相互复制所有内容
3) 使用您的 dll 运行专家,并将数组从 mt5 发送到 Rterm
4) 等待几分钟
两个 mt5 终端中的一个将被关闭。
为什么会这样?

谢谢。