Lemmik Postitused

Toimetaja Valik - 2020

MQL4: tehingukoopiamasina kirjutamine MetaTrader4 jaoks

Tere päevast sõbrad!

Kindlasti on teil mitu korda olnud vaja tehinguid ühest terminalist teise kopeerida. Näiteks kui peate avama sama positsiooni erinevatel kontodel või mitme maakleri juures. Käsitsi võtab see töö veidi aega, mille saab kokku hoida, kui usaldate selle rutiinse ülesande copyist'ile. Lisaks saab copyist ise kirjutada.

Täna õpime, kuidas kirjutada MT4 jaoks lihtne tehingukopeerija. Artiklis toodud kopeerimisprotsess viiakse ellu ühise failikataloogi kaudu, nii et sama lähenemisviisi saab kasutada mis tahes teabe edastamiseks ühe arvuti mitme MT4 / MT5 terminali vahel.

Üldine idee

Idee on see. Kõik arvutisse installitud terminalid jagavad omavahel kataloogi. Üldises kataloogis loob pakkuja kõigi avatud positsioonidega faili. Klienditerminal loeb andmed failist ja avab vajalikud positsioonid.

See lähenemisviis valiti selle mitmekülgsuse ja hõlpsa rakendamise tõttu. Kuid see pole kaugeltki universaalne lahendus, kuna mõnes olukorras on vaja kiirust ja suurt läbilaskevõimet, mida failid ei suuda pakkuda. Sellest hoolimata piisab tavapärase kauplemise kopeerimiseks.

Kõigi koopiamastide peamine probleem on oleku sünkroonimine. Kõigepealt peame kliendi tellimuse kuidagi ühendama pakkuja avatud tellimusega. Selleks kasutame tellimuse kordumatu identifikaatorina (maagiline number) pakkuja tellimispiletit. Sel juhul võib tellimispilet muutuda, kui ainult osa positsioonist suleti, ja ka seda juhtumit tuleb menetleda.

struct Params {int konto; char sümbolSYMBOL_LEN; int pilet; int maagia; int tüüp; kahekordne maht; kahekordne sl; kahekordne tp; topeltkapital; };

Nii kirjutab viisard kõik aktiivsed positsioonid ühisesse faili. Seejärel loeb klient need andmed ja loob kohalikku kataloogi oma failist koopia. Seega peame töötamiseks looma lugemis- ja kirjutamisfunktsioonid, võimaldades juurdepääsu jagatud ja kohalikele kataloogidele.

Selles teostuses läheb EA lõputusse ahelasse, kuni ta saab juurdepääsu failile. Jagatud faili jagamist ei pakuta. Nii päästame end madalamatest andmetest, mida klient võib ekslikult võtta kauplemissignaali saamiseks.

void write (stringi nimi, Parameetrid & a, bool local = false) {int h; kas {h = kohalik? FileOpen (nimi, FILE_WRITE | FILE_BIN): FileOpen (nimi, FILE_WRITE | FILE_BIN | FILE_COMMON); if (GetLastError ()! = 0) Sleep (DELAY); } while (h == INVALID_HANDLE); FileWriteArray (h, a); FileClose (h); } tühine lugemine (stringi nimi, parameetrid & a, loll kohalik = vale) {int h; kas {h = kohalik? FileOpen (nimi, FILE_READ | FILE_BIN): FileOpen (nimi, FILE_READ | FILE_BIN | FILE_COMMON); if (GetLastError ()! = 0) Sleep (DELAY); } while (h == INVALID_HANDLE); FileReadArray (h, a); FileClose (h); }

Failinimed luuakse initsialiseerimisfunktsioonis. Jagatud faili nimi on kõigil sama, kohaliku varukoopia nimi on kauplemiskonto number. Kutsume kohe varundusmeetodit, mis loob kohaliku kirje (endiselt tühi) koos positsioonidega terminali kaustas.

void luua () {konto = konto number (); backupName = IntegerToString (AccountNumber ()); sharedName = "jagatud"; varukoopia (); }

Tegelikult loob varundusmeetod varundusfaili, mille kaudu kontrollime siis avatud positsioonide muudatusi.

void backup () {kirjuta (backupName, jagatud, tõene); }

Samuti on võimalus failist lugemiseks, kuhu tagastatakse salvestatud positsioonide arv.

int backup (parameetrid & a) {read (backupName, a, true); tagastama ArraySize (a); }

Positsioonide jagamiseks on samad meetodid. “Tõmmake” - asukohateabe saamiseks jagatud failist, “jaga” - muudatuste kirjutamiseks jagatud failile. Jagamises on tugi mitmele pakkujale. Mitmele ühele failile juurdepääsu saamiseks proovitud põhikonto konflikti välistamiseks identifitseeritakse iga pakkuja kontonumbri järgi.

int pull (parameetrid & a) {loe (sharedName, a); tagastama ArraySize (a); } void share () {Parameetrikorraldused, temp; loe (sharedName, tellimused); // loe jagatud positsioone int szO = ArraySize (tellimused); int szP = ArraySize (positsioonid); int szTemp = ArrayResize (temp, 0, szO + szP); // kopeerige kõik "võõrad" korraldused ajutisse massiivi jaoks (int i = 0; i

“Avatud” meetod tagastab konto praegused avatud positsioonid. Alguses ütlesin, et osalise sulgemisega muudab Metatrader tellimispileti ja vana kirjutab uue kommentaaris. Seetõttu, et klient saaks aru, et see pole uus tellimus, mäletame vana piletit, kirjutades selle väljale “maagia”.

jaoks (int i = kokku-1; i> = 0; i--) {if (OrderSelect (i, SELECT_BY_POS) && OrderType () <= 1) {sz = ArrayResize (positsioonid, sz + 1); char sa; StringToCharArray (OrderSymbol (), sa); ArrayCopy (positsioonssz-1.sümbol, sa); positionssz-1.ticket = OrderTicket (); c = OrderComment (); positionssz-1.magic = StringToInteger (StringSubstr (c, StringFind (c, "#") + 1)); positionssz-1.maht = OrderLots (); positionssz-1.sl = OrderStopLoss (); positionssz-1.tp = OrderTakeProfit (); positionssz-1.type = OrderType (); positionssz-1.võrd = ekv; }}

Kopeerija põhifunktsioon, otse kopeerimise tehingud, viiakse ellu meetodil „mergeAndTrade”. Vaadake täpse teostuse täielikku allikat. Lühidalt öeldes peame võrdlema viimast kohalikku varukoopiat jagatud failiga. Kui üldises failis on tehtud muudatusi, muudame praeguseid positsioone või avame uusi.

Mugavuse huvides tagastab klassi eksemplar kõigile põhifunktsioonidele helistades kursori enda juurde.

TradeCopier * func () {... tagastab GetPointer (this); }

Nii rakendatakse pakkuja ja koopiamasina töö korraldamist vaid ühe koodireaga, vajalike funktsioonide järjestikuse väljakutsega.

tühine OnTimer () {if (CopierType == SLAVE) {copier.mergeAndTrade (); } else if (CopierType == MASTER) {copyier.opened (). share (); }}

Lõpuks loome väikese staatilise kaubandusklassi „Trade“, mis ei tee muud, kui avab ja muudab positsioone. Ideaalis on nutika veakäitleja rakendamine vajalik hinnapakkumiste tugeva lahknevuse korral. Sünkroonimisloogikat saab konfigureerida ka muul viisil ühenduse katkestamise või suletud turu korral. Näiteks avage hilissignaale ainult parema hinnaga.

Samuti saate valida, kuidas köiteid kopeerida. Fikseeritud maht kopeeritakse üks ühele, sõltumata sissemakse suurusest. Dünaamiline köide kopeeritakse kliendi omakapitali suurusest mitu korda. See tähendab, et kui pakkujal on avatud positsioon 0,1 partiid, mille sissemakse on 100 USD, siis avaneb 200 USD sissemaksega kliendil tehing, mille maht on 0,2.

Kui partii on dünaamiline, arvutame arvelduskonto omakapitali suhte kapteni kontole ja korrutame selle väärtuse korralduse mahuga. Samuti ärge unustage helitugevuse väärtust normaliseerida.

topelt v = LotType == DÜNAAMILINE? normaliseeri palju (CharArrayToString (p.sümbol), ekv / p võrdsus * p.maht): p.maht; staatiline topelt normaliseeriLot (stringisümbol, topeltpartii) {double lotMin = SymbolInfoDouble (sümbol, SYMBOL_VOLUME_MIN); double lotMax = SymbolInfoDouble (sümbol, SYMBOL_VOLUME_MAX); double lotStep = SymbolInfoDouble (sümbol, SYMBOL_VOLUME_STEP); topelt c = 1,0 / lotStep; kahekordne l = põrand (partii * c) / c; if (l lotMax) l = lotMax; tagasi l; }

Kopeerimise alustamiseks viskame eksperdi graafikule ja valime koopiamasina tüübi - Master või Slave. Pakkujate ja klientide arv pole piiratud - saate kopeerida tehinguid mitmelt igat tüüpi kontolt reaalajastele / demokontodele.

Järeldus

Selles etapis rakendati:

  • Edastamise usaldusväärsus - faile ei kasutata samaaegselt erinevates protsessides, samas kui igal kliendil on hetkeseisust ülevaade;
  • Fikseeritud ja suhtelise positsioonide mahu kopeerimine, stopptasemete muutmise ja osalise sulgemise tugi;
  • Võimalus kasutada suvalisel arvul MT4 / MT5 terminalides piiramatu arvu pakkujate / klientidega.

Puuduste hulka kuuluvad:

  • Lugemiskiirus ei ole ideaalne peanaha puhastamiseks, puukide kopeerimiseks ja muudeks toiminguteks, mis nõuavad minimaalset viivitust;
  • Ketta laadimine - mida väiksem on viivitus, seda sagedamini kirjutatakse fail üle.

Vaata videot: Robot Building Tutorials #6 - Intro to MQL4 (Aprill 2020).

Jäta Oma Kommentaar