実現したいこと
Marketspeedからのリアルタイムデータを高精度で取得したく、下記のサイトのコードを試そうとしていますが、多数のエラーがあり、手に負えないのでMSのCopiloでアドバイス受けながら試行錯誤しながら進めていましたが、
どうしても、表題のエラーが解決しません。
参考サイト
C#でMarketSpeedからのリアルタイムデータを取得するプログラム
https://note.com/kornie701/n/n69771c26931d
発生している問題・エラーメッセージ
コンパイル時に エラー (アクティブ) CS7025 アクセシビリティに一貫性がありません。 イベント型 'EventHandler<OnTickArgs>' のアクセシビリティはイベント 'RSS.OnTick' よりも低く設定されています RSSClient C:\kabusapi\RSSClient3\RSSClient\RSS.cs 22 エラー (アクティブ) CS7025 アクセシビリティに一貫性がありません。 イベント型 'EventHandler<DDEerrorArgs>' のアクセシビリティはイベント 'RSS.DDEerror' よりも低く設定されています RSSClient C:\kabusapi\RSSClient3\RSSClient\RSS.cs 23
該当のソースコード
RSSCLient.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using NDde.Client; namespace RSSClient { public class Tick { public string RawPrice { get; set; } public string RawTime { get; set; } public string RawVolume { get; set; } } public class RSSClient { } } RSS.cs using NDde.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RSSClient { public class RSS { private string _Topic; private Tick tick = new Tick(); private DdeClient ddeClient; private List<Tick> _TimeAndSales = new List<Tick>(); public string Topic => _Topic; public List<Tick> TimeAndSales => _TimeAndSales; public DateTime SessionDate { get; set; } public event EventHandler<OnTickArgs> OnTick; // ****Error Line 22 public event EventHandler<DDEerrorArgs> DDEerror; // ****Error Line 23 public RSS(string topic) { _Topic = topic; } public void ReceiveData() { ResistTopic(); StartCallBack(); } void ResistTopic() { ddeClient = new DdeClient("RSS", _Topic); ddeClient.Advise += (s, e) => { if (e.Item == "現在値") { tick.RawPrice = e.Text; } else if (e.Item == "現在値詳細時刻") { tick.RawTime = e.Text; } else if (e.Item == "出来高") { tick.RawVolume = e.Text; var t = new Tick { RawPrice = tick.RawPrice, RawTime = tick.RawTime, RawVolume = tick.RawVolume }; _TimeAndSales.Add(t); //OnTick?.Invoke(this, new OnTickArgs(t)); // イベント発火 } }; ddeClient.Disconnected += (s, e) => Console.WriteLine(this._Topic + " is disconnected"); } public void StartCallBack() { var timeout = 5000; try { ddeClient.Context.Encoding = Encoding.Default; ddeClient.Connect(); while (!ddeClient.IsConnected) Thread.Sleep(100); tick.RawPrice = ddeClient.Request("現在値", timeout); tick.RawVolume = ddeClient.Request("出来高", timeout); //DDEerror?.Invoke(this, new DDEerrorArgs(_Topic + " : " + tick.RawPrice + " : " + tick.RawVolume)); // イベント発火 Thread.Sleep(500); ddeClient.StartAdvise("現在値", 1, true, false, timeout, this); ddeClient.StartAdvise("現在値詳細時刻", 1, true, false, timeout, this); ddeClient.StartAdvise("出来高", 1, true, false, timeout, this); } catch { string message = _Topic + " の登録に失敗しました。"; Console.WriteLine(message); //DDEerror?.Invoke(this, new DDEerrorArgs(message)); // イベント発火 } } public void StopAdvise() { var timeout = 5000; try { ddeClient.StopAdvise("出来高", timeout); ddeClient.StopAdvise("現在値詳細時刻", timeout); ddeClient.StopAdvise("現在値", timeout); } catch { //DDEerror?.Invoke(this, new DDEerrorArgs(_Topic.ToString())); } if (ddeClient.IsConnected) ddeClient.Disconnect(); ddeClient.Dispose(); ddeClient = null; } public void ExportTimeAndSales(string file) { if (_TimeAndSales.Count == 0) return; try { using (var sw = new System.IO.StreamWriter(file, false)) _TimeAndSales.ForEach(tick => sw.WriteLine("{0},{1},{2}", tick.RawTime, tick.RawPrice, tick.RawVolume)); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } } public void ClearTimeAndSales() => _TimeAndSales.Clear(); } } DDEerrorArgs.cs using System namespace RSSClient { internal class DDEerrorArgs : EventArgs { public string ErrorMessage { get; } public DDEerrorArgs(string errorMessage) { ErrorMessage = errorMessage; } } } OnTickaArgs.cs using System namespace RSSClient { internal class OnTickArgs : EventArgs { public Tick TickData { get; } public OnTickArgs(Tick tick) { TickData = tick; } } } Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace RSSClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { } } }
試したこと
Copilotのアドバイスで、元のサイトのコードから、名前空間関係のエラーを区別すべく、クラスを追加したり、受信データの成形に関するTrytoDoubleなどの機能部分を、生のデータを出力するなどの修正追加を少なからず行っています。
Copilotと3日間にわたり述べ10時間くらいやっていましたが、このエラーが解決せず。こちらにお尋ねすることにしました。しかし、Copilotは大したものですね。全コードを提示すると、いろんなアプローチを次から次へと提案して、それらを試しながら行ったのです。しかし、原コードは動いていると思うので、きっと簡単な何かに問題があるだろうと思っています。
それから、原コードの機能で、MarketSpeedからのリアルタイムデータが原コードのNDdeで取得できる仕組みが理解できません。ローカルサーバアドレスなども指定していないのにです。よろしければ、これもご説明願えると嬉しいです。
補足情報(FW/ツールのバージョンなど)
Visualc++2022無料版 windows10 64bit
回答1件
あなたの回答
tips
プレビュー