Recent, mai multe și mai des am auzit de la mulți comercianți cerere, care este foarte cool să știe un limbaj de programare și de a scrie roboți. Mulți încearcă din greu pentru a studia moda în timpurile recente limbajului C #. Cu toate acestea, un novice de la zero pentru a scrie orice aplicație utilă va fi destul de dificil. In acest articol voi încerca să dea o cunoaștere minimă a limbajului de programare, pentru a arăta logica de construire a aplicației, proiectarea și începe robot de tranzacționare pentru terminalul QUIK.
La uite acum la ce resurse sunt prezentate în acest moment, pentru dezvoltarea de roboți și crearea de sisteme automate de tranzacționare algoritmică:
1) Instrumente încorporate în terminal
- Qpile - built-in limba in cel mai popular terminal de tranzacționare Quik, limba este destul de simplu. Cu toate acestea, această simplitate în adiție avantaje evidente în dezvoltarea pulmonare, există dezavantaje evidente ca funcționalitate limitată, complexitatea depanare.
- LUA - un alt limbaj simplu pentru terminale QUIK. Ea are o funcționalitate mai mult decât Qpile. Cu toate acestea, popularitatea în creștere nu a fost încă dobândit. Codul se execută direct în terminalul QUIK.
2) Produse cutie externe - foarte asemănătoare în funcționalitate: posibilitatea de testare pe date istorice, scrierea de sisteme de tranzacționare în limba NET (de obicei, C #), integrarea terminalului de tranzacționare.
3) Programe externe dezvoltate independent. În acest caz, puteți folosi orice limbaj de programare pe care o persoană știe. Acum câțiva ani, a existat o grămadă de popular QUIK terminal și Excel cu robotul, scris în Visual Basic. În acest moment, puteți utiliza biblioteca destul de puternic și flexibil pentru a scrie roboți stoc #, dar nu programator va fi foarte dificil să-l înțeleagă.
Pentru dezvoltarea robotului „de la zero“ este definit cu o listă de sarcini:
1) Punerea în aplicare a acestor importuri de la terminalul QUIK în programul nostru
2) Programarea algoritm de tranzacționare
3) Crearea unui mecanism pentru a trimite cereri de a efectua operațiuni de tranzacționare în terminal
Această listă poate fi împărțită în mai multe sub-elemente, pe care le va formula în timpul punerii în aplicare a acestor măsuri.
Înainte de a începe să realizeze importul de date de la terminalul Quik în programul nostru, amintiți-vă elementele de bază ale programării. Nu este de a transforma articol într-un alt manual plictisitor pe programare, descrie limba de bază de design de care avem nevoie doar de a dezvolta programul.
În C #, există două moduri de a construi interfețe aplicații client. Primul - de a utiliza un Windows Forms - aplicații de construcții de tehnologie, care este deja mai mult de 10 de ani, este utilizat în proiectarea interfeței vizuale. În al doilea rând - Windows Presentation Foundation (WPF) - destul de un nou sistem pentru a construi o interfață are capacitatea de a crea elemente de ochi-prinderea de utilizare a 3D-grafica foloseste MVC-abordare, cu toate acestea, este nevoie de mai multe resurse de calculator decât WinForms. Deoarece Windows Forms cere resurse mai ușor și mai puțin, vom folosi aceasta tehnologie.
Fig. 1. Crearea unei aplicații pentru Windows Forms
După înființarea, vom vedea formulare - este elementele vizuale și arborele de fișiere vor fi puse la dispoziție, inclusiv fișier de cod (Figura 2, 3.). Pentru a merge la codul de aplicație, trebuie să apăsați tasta F7.
Fig. 3. Codul de aplicare
Dacă te uiți la codul, care a fost creat de Visual Studio, vom vedea că platforma am creat în mod automat o clasă de obiecte formular. Clasa - o structură logică, permițându-vă să creați propriile tipuri personalizate prin gruparea variabilelor de alte tipuri, metode și evenimente. Clasa este ca un desen. Acesta definește tipul de date și de comportament. Clasa și obiect - acestea sunt lucruri diferite, deși, în unele cazuri, acestea sunt interschimbabile. Clasa definește tipul de obiect, dar nu obiectul în sine. Obiectul - o substanță specifică, bazată pe clasa, și, uneori, menționate ca un exemplu.
De asemenea, trebuie să ne amintim că este variabilă. Variabilele sunt declarate după cum urmează:
int i = 10; // variabila număr întreg
string st = "text"; // variabila de tip string
pavilion bool = true; // tip logic variabilă doar ia valori adevărate sau false
O variabilă este un număr sau un obiect string sau clasă. Valoarea stocată în variabila se poate schimba, dar numele rămâne același.
În mod similar desemnate și matrice care reprezintă un set de date de același tip.
Înainte de a începe să scrie codul pentru a importa datele, a determina ce date avem nevoie de a importa din QUIK în programul nostru. Într-o versiune simplificată pentru noi vor fi cele mai importante prețuri istorice și curente lumânările tranzacționate instrumente.
Fig. 4. Descărcați portofoliu
Fig. 5. Deschiderea și portofoliul de lansare
Figura 6. Rezultatul deschiderii portofoliului
Acum, să se gândească la modul în care puteți obține datele de la terminalul QUIK. QUIK de date pot fi obținute în trei moduri:
1) date de export prin intermediul ODBC
2) date de export prin DDE
3) să ia date direct din memoria
A treia metodă este foarte programare intensivă a forței de muncă, deși este cel mai rapid pentru a obține datele. ieșire de date prin intermediul ODBC, dezvoltatorii Quik a scrie este mai lent decât de ieșire prin DDE. Prin urmare, vom folosi modul cel mai simplu - prin retragerea DDE.
Configurați imediat QUIK datelor de ieșire (Fig. 7). Pentru a face acest lucru, selectați tabelul dorit și apăsați export meniul Date - Încheierea DDE. Ca un server DDE, trebuie să specificați numele «DDEServer». Ca un registru de lucru trebuie să specifice următoarele:
1) pentru o masă de lumânări istorice - «lumânări»
2) pentru masa de citate si unelte - «citate»
3) cereri pentru masa - «ordine»
Nu uitați să setați caseta „ecran prin apăsarea Ctrl + Shift + L».
Fig. tabelul de ieșire 7. Configurarea DDE
Ca rezultat, va apărea fereastra QUIK după cum urmează:
Pentru a importa DDE, avem nevoie de:
1) Clasa XLTable, pune în aplicare aduce date din formatul Excel la vizualizarea normală (toate fișierele necesare sunt în anexa la articol)
2) NDde.dll Biblioteca pentru a crea un server DDE
Pentru a adăuga o bibliotecă dinamică, care conține setul necesar de caracteristici pentru aplicația noastră, trebuie să selectați „Adăugați un link“ în Solution Explorer, și deschideți fișierul NDde.dll (fig. 4).
Fig. 9. DLL Import
Vom forma o clasă de a lucra cu serverul DDE:
clasa MyDDEServer. DdeServer
MyDDEServer publice (serviciu șir de caractere). bază (serviciu)
În această clasă, trebuie să fie furnizate setul minim de funcții:
1) Înregistrarea serverului
2) Deconectare server
3) Timer declanșator de evenimente pentru a primi date noi
4) Metoda de prelucrare a datelor recepționate
Adăugați la forma obiectului, care are aceste evenimente (Fig. 5).
Fig. 10. Butoanele de pe formularul
Acum atribuiți butonul „Start“ Eveniment făcând clic pe mouse-ul prin dublu-clic pe butonul din proiectantul și adăugați codul rula serverul DDE:
privat void buttonRunDDEServer_Click (expeditor obiect, EventArgs e)
Server = new MyDDEServer ( "DDEServer"); // Crearea unui server de obiect DDE
server.Register (); // l Înregistrează-
În acest caz, am creat obiectul MyDDEServer clasă și apoi apela o metodă acestui registru obiect (). Constructorul clasei are o singură valoare - o variabilă șir de caractere, care se referă la numele serverului nostru. Clasa de implementare MyDDEServer constructor, vom folosi un timer care va fi responsabilă de notificare atunci când noi date:
System.Timers.Timer _Timer = new System.Timers.Timer ();
MyDDEServer publice (serviciu șir de caractere). bază (serviciu)
_Timer.Elapsed + = this.OnTimerElapsed; // abona la adoptarea unui eveniment de date
_Timer.Interval = 100; // Intervalul temporizator în ms
Să considerăm acum o metodă de obținere a datelor prin DDE:
supracontrol protejate PokeResult OnPoke (DdeConversation conversație, element string, byte [] date, formatul int)
XLTable tabel = new XLTable (date);
// Tabele de date și titluri
dublu [,] impdata = new double [table.Rows, table.Columns];
string [,] imptitles = new string [table.Rows, table.Columns];
// Conversia datelor în vizualizare clară
XLTable.BytesToMatrix (date, impdata ref, imptitles ref);