2013-04-20 13 views
7

Konwertuję kod wskaźnika TradeStation EasyLanguage na bibliotekę DLL C++. Korzystanie z interfejsu API Tradestation to możliwe, aby uzyskać dostęp do danych rynkowych w C++ DLL tak:Zmienna monitorująca C++ dla zmienionej wartości

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

Moje pytanie brzmi:

Czy jest możliwe w C++ jakoś „Watch” lub „słuchać”, gdy zmienna "currentBarDT" ma zmienioną/zaktualizowaną wartość? Chciałbym użyć zmiany wartości jako wyzwalacza do generowania sygnału z Boost.Signals2.

Odpowiedz

2

Możesz użyć zmiennej warunku dopasowanej do Twoich potrzeb.

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

w sygnałach zaktualizować swoje dane rynkowe (i)

w oczekiwaniu umieścić zmienną stanu na I (ma akcji poniżej pewnego poziomu, na przykład)

Powiadom mnie, jeśli potrzebujesz więcej informacji, mogę szczegółowo opisać.

#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; 
} 

nadzieję, że pomoże

+0

Dzięki za kod. Przejrzę to. Zasada, którą planowałem pracować, polega na tym, że 'pELObject-> DateTimeMD [iDataNumber] -> AsDateTime [0];' wskazuje na dane rynkowe Wartość DateTime zakopana w interfejsie API TradeStation. Gdy ta wartość DateTime wzrasta, tj. Czas jest przesuwany o określony przedział czasu, sygnał będzie transmitowany w celu przeprowadzenia dalszych obliczeń. – GoFaster

+0

ok, a następnie musisz przechowywać czas w zmiennej (zamiast ceny akcji), a zmienna warunku będzie na nim. Jeśli podoba ci się odpowiedź, możesz ją zaakceptować jako ważną. To pomoże innym ludziom (i uaktualni moje statystyki także :-)) – Gabriel