0

我正在尝试编写基本上执行以下操作的 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
4

1 回答 1

0

财富实验室支持团队返回以下答案;它奏效了。

谢谢。

...

该代码不会在 Wealth-Lab 编辑器的当前版本 6.6 中编译。要解决此问题,请从 c:\windows\microsoft.net\framework64\v4.0.30319(64 位 WLD,或 c:\windows\microsoft.net)添加对 System.Core.dll 和 System.Xml.Linq.dll 的引用\framework\v4.0.30319 用于 32 位 WLD)。

...

于 2014-03-18T09:05:45.917 回答