我正在尝试编写基本上执行以下操作的 C# 代码:
该代码连接到 MySql 表并从一个 MySql 表中读取数据(具有 r 行和 c 列) - 这里没有问题,一切正常;
然后代码在 MySqlDataReader 的帮助下定义并加载一个 DataTable - 同样,在这个阶段没有问题。代码很好;
该数据表的每一列实际上是该策略的一个策略参数(即该数据表的每一行因此变为
one parameter set of the strategy
.
话说回来:
然后代码循环遍历该数据表的所有行;
代码一一获取每一行的列值,并一一更改 XML 元素以用新的策略值替换旧的策略值 - 这就是我得到错误的地方!!!我无法在 WEALTHLAB C# 编辑器中修改 XML 文件!!
这样,每次都会为策略配置一组新参数;
然后代码调用 runDonor 并使用给定的(新)参数集运行策略 - 调用 runDonor 也没有问题!;
最后,记录某些统计数据并将其插入到一个 MySql 表中 - 这里也没有问题;
**
考虑到这段代码中有很大一部分与 richlab 命名空间无关,我首先在 Visual Studio 中编写了大部分部分,然后使用 Visual Studio 编译器在那里编译,发现代码在那里工作得很好!(即 Xelement 编辑进行得很好。当这段代码在 Visual Studio 中运行时,我可以看到 XML 文件在每个循环之后都被修改了!)
然后,我将此代码复制/粘贴到财富脚本编辑器中,但不幸的是,代码没有编译!!。
**
问题出在我开始使用 ElementAt 方法修改 XML 文档的区域。
更具体地说,ElementAt 语句在 Visual Studio 编辑器中运行良好,而在 Wealthlab 编辑器中则不行。
重复一遍,尽管我引用了相同的 DLL 并在代码顶部使用了相同的USING...
语句,Visual Studio 没有返回错误并彻底运行,而 Wealthlab 返回此错误:
'System.Collections.Generic.IEnumerable' <System.Xml.Linq> does not contain a definition for 'ElementAt'
and no extension method 'ElementAt' accepting a first argument of type
'System.Collections.Generic.IEnumerable' <System.Xml.Linq> could be found (are you
missing a using directive or an assembly reference?)"
我已经用谷歌搜索了很长时间,但还没有找到任何体面的解决方案。
而且由于我没有编程背景,我真的无法弄清楚为什么使用相同引用和相同 using 指令的相同代码在 Visual Studio 中有效,但在 Wealthlab 中产生错误。
在此链接上,发誓要提供一个解决方案替代方案,但坦率地说,这对我来说不是英语: System.Xml.Linq.XElement>' 不包含“First”的定义,并且没有扩展方法“First”接受第一个参数
**
所以,我的问题有两个:
1-如何克服这个与正确引用 System.Xml.Linq 相关的有趣错误?显然,这就是问题所在。
2-或者,让我们把它扔掉并从头开始:你们如何修改你的xmls?如果向我提供从 xml 文件读取或修改它们、保存它们的示例代码链接,那就太好了。
(请帮忙...)
为了让你们重复同样的错误,我还附上了整个代码;将此复制到您的编辑器,看看代码是否运行正常:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Components;
using System.Collections;
using System.Xml;
using System.Xml.XPath;
using System.Linq;
using System.IO;
using System.Data;
using System.Xml.Linq; // THIS IS WHERE THE PROBLEM IS THIS REFERENCE COULD NOT BE SET PROPERLY!! WHY?!!
using MySql.Data.MySqlClient;
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
// public DateTime now;
public static XElement SourceXml;
public static XElement DonorStrategyXml;
public static string SourceXmlName;
public static string Ticker;
public static int nNames;
public string DonorStrategyXmlFolder;
public string DonorStrategyXmlName;
public string DonorStrategyXmlNameWithNoXml;
public string DonorStrategyXmlPathName;
protected override void Execute()
{
//....
//....
//....
DonorStrategyXmlFolder = @"C:\Users\Aykut\AppData\Roaming\Fidelity Investments\WealthLabDev\1.0.0.0\Data\Strategies\Customized\";
DonorStrategyXmlName = "sss.xml";
DonorStrategyXmlNameWithNoXml = "sss";
string DonorStrategyXmlPathName = DonorStrategyXmlFolder + DonorStrategyXmlName;
DonorStrategyXml = XElement.Load(DonorStrategyXmlPathName);
foreach (DataRow dbBandParameterRow in dbBandParameters.Rows) {
foreach (DataRow dbNNParameterRow in dbNNParameters.Rows) {
string ResultID = dbBandParameterRow["ResultID"].ToString();
int nE = 0;
//....
//....
//.THIS IS WHERE THE PROBLEM LIES AT!!...
DonorStrategyXml.Elements("ParameterValues").Descendants("double").ElementAt(nE).Value = dbBandParameterRow["RatioForUpper"].ToString();
nE++;
DonorStrategyXml.Elements("ParameterValues").Descendants("double").ElementAt(nE).Value = dbBandParameterRow["ADXPeriodForUpper"].ToString();
// output certain statistics of the strategy onto mysql // later!!!
//....
//....
PrintDebug("NetProfit:" + sp.Results.NetProfit.ToString());
}
}
}
} // class
} // nspace