Popularni Postovi

Izbor Urednika - 2019

MQL4: Pisanje kopiranja transakcija za MetaTrader4

Dobar dan prijatelji!

Sigurno vam je potrebno više od jednom za kopiranje transakcija s jednog vašeg terminala na drugi. Na primjer, ako trebate otvoriti istu poziciju na različitim računima ili kod nekoliko brokera. Ručno ovom radu treba neko vrijeme, što se može uštedjeti ako ovaj rutinski zadatak povjerite prepisivaču. Osim toga, prepisivač može napisati i sam.

Danas ćemo naučiti kako napisati jednostavan kopiraj za transakcije za MT4. Postupak kopiranja u članku provodi se kroz zajedničku datoteku datoteka, tako da se isti pristup može koristiti za prijenos bilo koje informacije između nekoliko terminala MT4 / MT5 na jedno računalo.

Opća ideja

Ideja je ova. Svi terminali instalirani na računalu dijele direktorij jedan s drugim. U općem direktoriju, Dobavljač stvara datoteku sa svim otvorenim pozicijama. Klijentski terminal čita podatke iz datoteke i otvara potrebne pozicije.

Ovaj pristup je odabran zbog svoje svestranosti i lakoće primjene. Ali to je daleko od univerzalnog rješenja, jer za neke situacije potrebni su brzina i velika propusnost, koje datoteke ne mogu pružiti. Ipak, to će biti dovoljno za kopiranje konvencionalnog trgovanja.

Glavni problem svih copyista je sinkronizacija stanja. Prije svega, moramo na neki način povezati nalog na klijentu s narudžbom koju je otvorio davatelj. Da bismo to učinili, kao jedinstveni identifikator narudžbe (čarobni broj) koristit ćemo narudžbu davatelja usluga. U ovom se slučaju ulaznica za narudžbu može promijeniti ako je samo dio pozicije zatvoren, a ovaj slučaj također treba obraditi.

struct Params {int račun; znak charSYMBOL_LEN; int karta; int magija; int tip; dvostruki volumen; dvostruki sl; dvostruki tp; dvostruki kapital; };

Dakle, čarobnjak upisuje sve aktivne pozicije u zajedničku datoteku. Klijent zatim pročita ove podatke i stvori vlastitu kopiju datoteke u lokalnom direktoriju. Dakle, da bismo radili, moramo stvoriti funkcije za čitanje i pisanje, uz mogućnost pristupa zajedničkim i lokalnim direktorijima.

U ovoj implementaciji EA ulazi u beskonačnu petlju dok ne dobije pristup datoteci. Dijeljenje dijeljene datoteke nije omogućeno. Tako ćemo se spasiti od inferiornih podataka, koje klijent može pogrešno uzeti za signal trgovanja.

void write (naziv niza, Params & a, bool local = false) {int h; učiniti {h = lokalno? FileOpen (ime, FILE_WRITE | FILE_BIN): FileOpen (ime, FILE_WRITE | FILE_BIN | FILE_COMMON); ako (GetLastError ()! = 0) mirovanje (ODVODI); } while (h == INVALID_HANDLE); FileWriteArray (h, a); FileClose (h); } void read (naziv niza, Params & a, bool local = false) {int h; učiniti {h = lokalno? FileOpen (ime, FILE_READ | FILE_BIN): FileOpen (ime, FILE_READ | FILE_BIN | FILE_COMMON); ako (GetLastError ()! = 0) mirovanje (ODVODI); } while (h == INVALID_HANDLE); FileReadArray (h, a); FileClose (h); }

Nazivi datoteka stvaraju se u funkciji inicijalizacije. Naziv dijeljene datoteke isti je za sve, ime lokalne sigurnosne kopije je broj računa za trgovanje. Odmah zovemo sigurnosnu kopiju, koja stvara lokalni zapis (još uvijek prazan) s pozicijama u terminalnoj mapi.

void create () {account = AccountNumber (); backupName = IntegerToString (AccountNumber ()); sharedName = "podijeljeno"; sigurnosna kopija (); }

Zapravo, sigurnosna kopija stvara datoteku sigurnosne kopije kroz koju ćemo provjeriti ima li promjena na otvorenim pozicijama.

void backup () {write (backupName, zajedničko, istinito); }

Postoji i mogućnost čitanja iz datoteke, gdje se vraća broj spremljenih pozicija.

int backup (Params & a) {read (backupName, a, istina); vratiti ArraySize (a); }

Postoje iste metode za dijeljenje pozicija. "Povucite" - da biste dobili podatke o položaju iz zajedničke datoteke, "dijeli" - da biste napisali promjene u zajedničku datoteku. U "share" postoji podrška za nekoliko pružatelja usluga. Da biste uklonili sukob nekoliko glavnih računa koji pokušavaju pristupiti jednoj datoteci, svaki se pružatelj identificira brojem računa.

int pull (Params & a) {read (sharedName, a); vratiti ArraySize (a); } void share () {Params nalozi, temp; čitanje (sharedName, naloge); // pročitajte dijeljene pozicije int szO = ArraySize (nalozi); int szP = ArraySize (položaji); int szTemp = ArrayResize (temp, 0, szO + szP); // kopiraj sve "strane" naredbe u privremeni niz za (int i = 0; i

Metoda "otvoreno" vraća trenutne otvorene pozicije na računu. Na početku sam rekao da Metatrader djelomičnim zatvaranjem mijenja kartu za narudžbe, a stari piše u komentaru na novu. Stoga, kako bi klijent shvatio da to nije nova narudžba, sjetimo se stare karte pišući je u polje "magija".

for (int i = total-1; i> = 0; i--) {if (OrderSelect (i, SELECT_BY_POS) && OrderType () <= 1) {sz = ArrayResize (položaji, sz + 1); char sa; StringToCharArray (OrderSymbol (), sa); ArrayCopy (položajasz-1.simbol, sa); položajasz-1.ticket = OrderTicket (); c = OrderComment (); Positionsz-1.magic = StringToInteger (StringSubstr (c, StringFind (c, "#") + 1)); položajasz-1.volume = OrderLots (); položajasz-1.sl = OrderStopLoss (); položajasz-1.tp = OrderTakeProfit (); Positionsz-1.type = OrderType (); položajasz-1.equity = eq; }}

Glavna funkcija copyist-a, izravno kopiranje posla, provodi se metodom "mergeAndTrade". Pogledajte točnu implementaciju u punom izvoru. Ukratko, sve što radimo jest usporediti posljednju lokalnu sigurnosnu kopiju s zajedničkom datotekom. Ako su se dogodile promjene u općoj datoteci, mijenjamo trenutne pozicije ili otvaramo nove.

Radi praktičnosti, pri pozivanju svih osnovnih funkcija, instanca klase vraća pokazivač na sebe.

TradeCopier * func () {... vratiti GetPointer (ovo); }

Dakle, organizacija rada davatelja i kopirnih uređaja provodi se s samo jednim redom koda, uz uzastopni poziv potrebnih funkcija.

void OnTimer () {if (CopierType == SLAVE) {copier.mergeAndTrade (); } else if (CopierType == MASTER) {copier.opened (). share (); }}

Na kraju, stvaramo malu statičku trgovinsku klasu „Trgovina“ koja ne radi ništa drugo, otvarajući i mijenjajući pozicije. U idealnom slučaju, implementacija pametnog upravljača pogrešaka nužna je u slučaju izrazite nepodudarnosti citata. Također, logika sinkronizacije može se konfigurirati na drugi način, u slučaju isključenja ili zatvorenog tržišta. Na primjer, otvarajte kasne signale samo po povoljnijoj cijeni.

Također možete odabrati kako kopirati sveske. Fiksni volumen kopira se jedan u jedan, bez obzira na veličinu pologa. Dinamički volumen kopira se višestruko od veličine kapitala na klijenta. Odnosno, ako je pozicija od 0,1 lota s depozitom od 100 dolara otvorena na davatelju usluga, tada će se transakcija s volumenom od 0,2 lota otvoriti za klijenta s depozitom od 200 dolara.

Ako je ždrijeb dinamičan, izračunavamo omjer glavnice tekućeg računa i računa glavnog i pomnožimo ovu vrijednost s volumenom narudžbe. Također, ne zaboravite normalizirati vrijednost glasnoće.

dvostruki v = LotType == DINAMIKA? normalizeLot (CharArrayToString (p.simbol), eq / p.equity * p.volume): p.volume; statički dvostruki normalizeLot (simbol niza, dvostruki lot) {double lotMin = SymbolInfoDouble (simbol, SYMBOL_VOLUME_MIN); dvostruki lotMax = SymbolInfoDouble (simbol, SYMBOL_VOLUME_MAX); dvostruki lotStep = SymbolInfoDouble (simbol, SYMBOL_VOLUME_STEP); dvostruki c = 1,0 / lotStep; dvostruki l = kat (lot * c) / c; ako je (l lotMax) l = lotMax; vratiti l; }

Za početak kopiranja bacamo stručnjaka na grafikon i odabiremo vrstu kopirke - Master ili Slave. Broj pružatelja usluga i klijenata nije ograničen - transakcije možete kopirati s nekoliko računa bilo koje vrste na bilo koji stvarni / demo račun.

Zaključak

Dakle, u ovoj fazi implementirano:

  • Pouzdanost prijenosa - datoteke se ne koriste istovremeno u različitim procesima, dok svaki klijent ima trenutni prikaz trenutnih pozicija;
  • Kopiranje fiksnog i relativnog volumena pozicija, podrška za promjenu razine zaustavljanja i djelomično zatvaranje;
  • Mogućnost korištenja na bilo kojem broju MT4 / MT5 terminala, s neograničenim brojem pružatelja usluga / klijenata.

Nedostaci uključuju:

  • Brzina čitanja nije idealna za skalpiranje, kopiranje krpelja i sve druge operacije koje zahtijevaju minimalno kašnjenje;
  • Učitavanje diska - što je kašnjenje manje, to će se datoteka češće prepisivati.

Pogledajte video: Robot Building Tutorials #6 - Intro to MQL4 (Listopad 2019).

Ostavite Komentar