基本的に次のことを行う C# コードを作成しようとしています。
コードは MySql テーブルに接続し、1 つの MySql テーブル (r 行と c 列) からデータを読み取ります。ここでは問題はありません。
次にコードは、MySqlDataReader を使用して 1 つの DataTable を定義してロードします。この段階でも問題はありません。コードは問題ありません。
このデータテーブルの各列は、実際には戦略の 1 つの戦略パラメータです (つまり、このデータテーブルの各行は
one parameter set of the strategy
.
そうは言っても:
コードは、このデータテーブルのすべての行をループします。
コードは各行の列の値を 1 つずつ取得し、XML 要素を 1 つずつ変更して、古い戦略の値を新しい値に置き換えます。これがエラーの原因です!!! WEALTHLAB C# エディター内から XML ファイルを変更できません!!
そうすれば、ストラテジーは毎回新しいパラメーター セットで構成されます。
次に、コードは runDonor を呼び出し、指定された (新しい) パラメーター セットを使用して戦略を実行します - runDonor の呼び出しも問題ありません!;
最後に、特定の統計が記録され、1 つの MySql テーブルに挿入されます。ここでも問題はありません。
**
このコードの大部分が welllab 名前空間に関連していないことを考慮して、最初にほとんどの部分を Visual Studio でコーディングし、そこで Visual Studio コンパイラを使用してコンパイルしたところ、コードが正常に機能することがわかりました。(つまり、Xelement の編集は問題なく行われました。このコードを Visual Studio で実行すると、ループごとに XML ファイルが変更されていることがわかりました!)
次に、このコードをコピーして、wealthscript エディターに貼り付けましたが、残念ながら、コードはコンパイルされませんでした!!.
**
問題は、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 ではエラーが発生する理由が本当にわかりません。
このリンクでは、1 つの解決策の選択肢が誓われていますが、率直に言って、それは私にとって英語ではありません 。
**
したがって、私の質問は 2 つあります。
1- System.Xml.Linq への適切な参照に関連するこの興味深いエラーをどのように克服できますか? 明らかに、ここに問題があります。
2- または、これを捨ててゼロから始めましょう: XML をどのように変更しますか? 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