20

VB6にコードがあります。誰かがそれを書く方法を教えてもらえますかC#?このコードは以下のとおりです。

Set Amibroker = CreateObject("Broker.Application")
Set STOCK = Amibroker.Stocks.Add(ticker)
Set quote = STOCK.Quotations.Add(stInDate)

quote.Open = stInOpen
quote.High = stInHigh
quote.Low = stInlow
quote.Close = stInYcp
quote.Volume = stInVolume


Set STOCK = Nothing
Set quote = Nothing

CreateObjectC#での同等物は何ですか?comオブジェクトへの参照を追加しようとしましたが、Broker.Applicationまたはamibrokerとしてcomオブジェクトが見つかりません

4

4 に答える 4

41

.net 4以降を使用しているため、を使用できる場合はdynamic、これを非常に簡単に行うことができます。これは、Excel自動化インターフェイスを使用する例です。

Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
dynamic ExcelInst = Activator.CreateInstance(ExcelType);
ExcelInst.Visible = true;

ダイナミックを使用できない場合は、はるかに厄介です。

Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
object ExcelInst = Activator.CreateInstance(ExcelType);
ExcelType.InvokeMember("Visible", BindingFlags.SetProperty, null, 
    ExcelInst, new object[1] {true});

その多くを行おうとすると、あなたから生命の血を奪うでしょう。

上記のようにレイトバウンドではなくアーリーバウンドディスパッチを使用できる場合、COMは非常に簡単です。COMオブジェクトの正しい参照が見つからないのは確かですか?

于 2012-12-05T09:28:46.227 に答える
6

.NET Framework 4.0以降を使用している場合は、次のパターンを使用できます。

public sealed class Application: MarshalByRefObject {

    private readonly dynamic _application;


    // Methods
    public Application() {
        const string progId = "Broker.Application";
        _application = Activator.CreateInstance(Type.GetTypeFromProgID(progId));
    }

    public Application(dynamic application) {
        _application = application;
    }

    public int Import(ImportType type, string path) {
        return _application.Import((short) type, path);
    }

    public int Import(ImportType type, string path, string defFileName) {
        return _application.Import((short) type, path, defFileName);
    }

    public bool LoadDatabase(string path) {
        return _application.LoadDatabase(path);
    }

    public bool LoadLayout(string path) {
        return _application.LoadLayout(path);
    }

    public int Log(ImportLog action) {
        return _application.Log((short) action);
    }

    public void Quit() {
        _application.Quit();
    }

    public void RefreshAll() {
        _application.RefreshAll();
    }

    public void SaveDatabase() {
        _application.SaveDatabase();
    }

    public bool SaveLayout(string path) {
        return _application.SaveLayout(path);
    }

    // Properties
    public Document ActiveDocument {
        get {
            var document = _application.ActiveDocument;
            return document != null ? new Document(document) : null;
        }
    }

    public Window ActiveWindow {
        get {
            var window = _application.ActiveWindow;
            return window != null ? new Window(window) : null;
        }
    }

    public AnalysisDocs AnalysisDocs {
        get {
            var analysisDocs = _application.AnalysisDocs;
            return analysisDocs != null ? new AnalysisDocs(analysisDocs) : null;
        }
    }

    public Commentary Commentary {
        get {
            var commentary = _application.Commentary;
            return commentary != null ? new Commentary(commentary) : null;
        }
    }

    public Documents Documents {
        get {
            var documents = _application.Documents;
            return documents != null ? new Documents(documents) : null;
        }
    }


    public string DatabasePath {
        get { return _application.DatabasePath; }
    }

    public bool Visible {
        get { return _application.Visible != 0; }
        set { _application.Visible = value ? 1 : 0; }
    }

    public string Version {
        get { return _application.Version; }
    }
}

}

次に、すべてのAmiBrokerOLEオートメーションクラスをラップする必要があります。たとえば、Commentaryクラスをラップします。

public sealed class Commentary : MarshalByRefObject {

    // Fields
    private readonly dynamic _commentary;


    // Methods
    internal Commentary(dynamic commentary) {
        _commentary = commentary;
    }

    public void Apply() {
        _commentary.Apply();
    }

    public void Close() {
        _commentary.Close();
    }

    public bool LoadFormula(string path) {
        return _commentary.LoadFormula(path);
    }

    public bool Save(string path) {
        return _commentary.Save(path);
    }

    public bool SaveFormula(string path) {
        return _commentary.SaveFormula(path);
    }
}
于 2013-06-12T07:53:49.010 に答える
6

これは、Amibrokerを自動化するために使用したC#コードのスニペットです(そのパスをたどったときから)。System.Runtime.Interopservicesを参照する必要があります

    System.Type objType = System.Type.GetTypeFromProgID("Broker.Application");

    dynamic comObject = System.Activator.CreateInstance(objType);

    comObject.Import(0, fileName, "default.format");

    comObject.RefreshAll();

ただし、ドットを入力してもcomObject内部メソッドは表示されません。

この方法について私が言えるのは、それは魅力のように機能しますが、Davidが言ったようにそれから離れてください。この方法のインスピレーションは次のとおりです。

http://www.codeproject.com/Articles/148959/How-the-new-C-dynamic-type-can-simplify-access-to

別の迎え角については、チェックアウトすることをお勧めします(これは早期の拘束力だと思います):

http://adamprescott.net/2012/04/05/net-vb6-interop-tutorial/

これの少なくともいくつかがあなたを助けることを願っています。私はAmibrokerとC#でこれらの両方の方法を使用しましたが、結局それらを残してしまいました。COMとAmibrokerはうまく混ざりません。TJでさえそう言っています。

とにかく頑張ってください。

于 2013-11-20T16:22:01.550 に答える
0

ami2pyはAmiBrokerデータをPythonに読み込みます。現在のバージョンは.0.8.1です。警告:データの日次解像度のみを提供します。

次の数行のコードは、AmiBrokerからpandasdfにシンボルを読み取ります。

import pandas
import ami2py

folder='C:/Program Files/AmiBroker/Databases/StockCharts'
symbol='indu'
df = pandas.DataFrame()
symbolData = ami2py.AmiDataBase(folder).get_dict_for_symbol(symbol)
for z in ['Year', 'Month', 'Day', 'Open', 'High', 'Low', 'Close', 'Volume'] :
    df[symbol+':'+z] = symbolData[z]
print(df.describe())
于 2021-07-04T03:24:53.130 に答える