9

TradeStation EasyLanguage インジケーター コードを C++ DLL に変換しています。TradeStation API を使用すると、次のように C++ DLL の市場データにアクセスできます。

double currentBarDT = pELObject->DateTimeMD[iDataNumber]->AsDateTime[0];

私の質問は:

変数 'c​​urrentBarDT' の値が変更/更新されたときに、C++ で何らかの方法で 'watch' または 'listen' を行うことは可能ですか? Boost.Signals2で値の変化をトリガーにしてシグナルを発生させたい。

4

2 に答える 2

3

必要に応じて条件変数を使用できます。

http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all

市場データを更新するシグナルで (i)

iに条件変数を置く待機中(たとえば、在庫が特定のレベルを下回っています)

詳細を説明してより明確にすることができる詳細情報が必要な場合は教えてください。

#include <stdlib.h>     /* srand, rand */
#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>
#include <atomic>
std::condition_variable cv;
std::mutex cv_m;
double StockPrice;//price of the stock
std::atomic<int> NbActiveThreads=0;//count the number of active alerts to the stock market

void waits(int ThreadID, int PriceLimit)
{
      std::unique_lock<std::mutex> lk(cv_m);
      cv.wait(lk, [PriceLimit]{return StockPrice >PriceLimit ;});
      std::cerr << "Thread "<< ThreadID << "...Selling stock.\n";
      --NbActiveThreads;
}

void signals()
{
    while (true)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cerr << "GettingPrice "<<std::endl;
        std::unique_lock<std::mutex> lk(cv_m);
        /* generate secret number between 1 and 10: */
        StockPrice = rand() % 100 + 1;  
        std::cerr << "Price =" << StockPrice << std::endl;
        cv.notify_all();//updates the price and sell all the stocks if needed
        if (NbActiveThreads==0)
        {
            std::cerr <<"No more alerts "<<std::endl;
            return;
        }
    }

}

int main()
{
    NbActiveThreads=3;
    std::thread t1(waits,1,20), t2(waits,2,40), t3(waits,3,95), t4(signals);
    t1.join(); 
    t2.join(); 
    t3.join();
    t4.join();
    return 0;
}

それが役立つことを願っています

于 2013-07-21T11:48:47.413 に答える