Modul 3 · Bygg din første robot

3.2 Din første robot, del 2: signal og ordre

Leksjon 8 av 19Lesetid: 2 min

I del 1 laget vi innstillinger og indikatorer. Nå skal roboten tenke og handle.

Steg 5: Hjelpefunksjoner

MQL5
// 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

MQL5
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

  1. Sett sammen del 1 og del 2 i én fil, og trykk Compile.
  2. I MetaTrader: åpne Navigator (Ctrl+N), høyreklikk Expert Advisors og velg Refresh.
  3. Dra MaKryss inn på et EUR/USD-diagram på en demokonto. Huk av for Allow Algo Trading i fanen Common.
  4. 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.
Øv på det du har lært – uten risikoPrøv det i praksis på en gratis demokonto hos Skilling, med ekte priser og fiktive penger.
Åpne gratis demokonto

65% av ikke-profesjonelle taper penger når de handler CFDer med denne leverandøren.