3.2 Din første robot, del 2: signal og ordre
I del 1 laget vi innstillinger og indikatorer. Nå skal roboten tenke og handle.
Steg 5: Hjelpefunksjoner
// Leser én verdi fra en indikator
double Value(int handle, int shift)
{
double buf[1];
if(CopyBuffer(handle, 0, shift, 1, buf) != 1) return(EMPTY_VALUE);
return(buf[0]);
}
// Teller robotens egne åpne posisjoner i dette markedet
int CountPositions()
{
int count = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket == 0) continue;
if(PositionGetString(POSITION_SYMBOL) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == (long)InpMagic) count++;
}
return(count);
}for-løkken går gjennom alle åpne posisjoner på kontoen. Vi teller bare dem som har vårt marked og vårt magiske nummer.
Steg 6: OnTick – hjernen
void OnTick()
{
// 1. Bare én gang per nytt lys
datetime barTime = iTime(_Symbol, _Period, 0);
if(barTime == lastBarTime) return;
lastBarTime = barTime;
// 2. Les indikatorene på lys 1 og 2
double fast1 = Value(hFast, 1), fast2 = Value(hFast, 2);
double slow1 = Value(hSlow, 1), slow2 = Value(hSlow, 2);
if(fast1 == EMPTY_VALUE || slow1 == EMPTY_VALUE ||
fast2 == EMPTY_VALUE || slow2 == EMPTY_VALUE) return;
bool buySignal = (fast2 <= slow2 && fast1 > slow1);
bool sellSignal = (fast2 >= slow2 && fast1 < slow1);
// 3. Maks én posisjon
if(CountPositions() > 0) return;
// 4. Send ordre
if(buySignal)
{
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double sl = NormalizeDouble(ask - InpStopLossPips * pip, _Digits);
double tp = NormalizeDouble(ask + InpTakeProfitPips * pip, _Digits);
if(!trade.Buy(InpLots, _Symbol, ask, sl, tp, "MaKryss"))
Print("Kjøp feilet: ", trade.ResultRetcodeDescription());
}
else if(sellSignal)
{
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double sl = NormalizeDouble(bid + InpStopLossPips * pip, _Digits);
double tp = NormalizeDouble(bid - InpTakeProfitPips * pip, _Digits);
if(!trade.Sell(InpLots, _Symbol, bid, sl, tp, "MaKryss"))
Print("Salg feilet: ", trade.ResultRetcodeDescription());
}
}Hvorfor ask og bid?
Du kjøper til askprisen og selger til budprisen – det lærte du i grunnkurset. Stop loss for en kjøpsposisjon ligger under inngangen, for en salgsposisjon over. NormalizeDouble runder av til riktig antall desimaler, ellers kan megleren avvise ordren.
Kompiler og prøv
- Sett sammen del 1 og del 2 i én fil, og trykk Compile.
- I MetaTrader: åpne Navigator (Ctrl+N), høyreklikk Expert Advisors og velg Refresh.
- Dra MaKryss inn på et EUR/USD-diagram på en demokonto. Huk av for Allow Algo Trading i fanen Common.
- Slå på knappen Algo Trading i verktøylinjen.
Gratulerer – du har bygget en fungerende robot.
Hva mangler?
Roboten handler fast størrelse, har ingen filtre og lukker ikke ved motsatt signal. Det legger vi til i modul 4. Vil du se en komplett versjon med alt på plass, kan du lage en i algobyggeren og sammenligne.
Kort oppsummert
- Les signalet på lys 1 og 2, og sjekk at verdiene er gyldige.
- Tell bare posisjoner med ditt marked og ditt magiske nummer.
- Kjøp til ask og selg til bid, og normaliser prisene før du sender ordren.
65% av ikke-profesjonelle taper penger når de handler CFDer med denne leverandøren.