péntek, május 20, 2011

A robotunk egyben, az utolsó csavarig

Ismét jó sok idő telt el, volt, aki kommentben sürgetett meg.
Nos, tehát a teljes kódot közzé teszem, hiszen ez az értelme a blognak.

Azonban szeretnék leszögezni ismételten valamit, méghozzá nyomatékosan!
Ez az Expert Advisor nem alkalmas éles kereskedésre, kizárólag oktatási céllal készült. Aki éles számlán üzemelteti, a veszteségeiért eme blog írója semmilyen felelőséget sem válallal! A kód egésze, illetve egyes elemei szabadon felhasználhatóak, kivéve a kereskedelmi célú felhasználást! Kereskedelmi célra felhasználni a szerző beleegyezése nélkül tilos!

Remélem mindenki számára érthető, ugyanis nem szeretnék senkivel sem vitatkozni, különösen nem jogi kereteken belül! Tehát ez itt egy oktató program! Semmi más! A célja az egyes programozási fogások, ötletek bemutatása.

A FOREX robotunk megírása koránt sem fejeződött be, most jön ugyanis a tesztelése, egész konkrétan a backtest, ami egy jó támpont arra, hogy mennyire jó az ötlet maga. Illetve fogjuk látni a hibákat is, no meg azt is, hogy mikor köt rosszul. Sokat számít, hogy jól ki tudjuk értékelni a backtest-et.

Ha megtörtént a backtest, akkor jöhet egy tisztességes Money Management is hozzá, végül pedig egy demo számlán fogjuk tesztelni, és a teszt eredményét fogjuk kiértékelni. Hozzátenném, hogy egy egyébként elvben jól működő, de mégis veszteséget termelő programből nyereségeset lehet varázsolni egy kitűnő Money Management-tel...Ehhez persze az kell, hogy az elv működjön, vagyis lehetőleg több nyerő kötése legyen, mint vesztő és lehetőleg ez ne a véletlenen múljon, vagyis jókor kell pozíciót nyitnia. A jó pozíció nyitás azt jelenti, hogy a várható nyereség nagyobb, mint a veszteség (haladóknak : RR nagyobb, mint 1!).

Tehát minden egyéb magyarázat nélkül, következzék a robot kódja. Annyit tennék még hozzá, hogy aki esetleg nem érti minden egyes részét, bátran olvasson vissza a korábbi bejegyzéskbe, ugyanis az utolsó sorig megmagyaráztam a robot kódját.
A kód tehát :

//+------------------------------------------------------------------+
//| TrendMagic-TVI.mq4 |
//| Copyright © 2011, János Antal |
//| http://tozsdecapak.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, János Antal"
#property link "http://tozsdecapak.blogspot.com"
#property show_inputs
#include <stderror.mqh>
#include <stdlib.mqh>

extern double maxlots=0.01;
extern int slippage=5;
extern int TrendMagicCCI=50;
extern int TrendMagicATR=5;
extern int TVI_rs=50;
extern int TVI_TF=0;


int currentbar;
string TMTrend, TVITrend;
int orders;
bool nyitott;

int init()
{
}
int deinit()
{
}
int start()
{
int err, ticket;
double stoploss, ParUp, ParDn;


// Csak akkor fusson le, ha a gyertya már befejeződött

if (currentbar < Bars)
currentbar = Bars;
else
return;

nyitott = false;
orders = OrdersTotal();

for(int pos=0;pos<orders;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS)==false)
continue;
else
if (OrderSymbol() == Symbol())
nyitott=true;
}


// TrendMagic alapján nyitunk pozíciót

if (iCustom(NULL,0,"TrendMagic",TrendMagicCCI,TrendMagicATR,0,1) != EMPTY_VALUE && iCustom(NULL,0,"TrendMagic",TrendMagicCCI,TrendMagicATR,1,1) == EMPTY_VALUE) // Long
{
TMTrend="Long";
}

if (iCustom(NULL,0,"TrendMagic",TrendMagicCCI,TrendMagicATR,0,1) == EMPTY_VALUE && iCustom(NULL,0,"TrendMagic",TrendMagicCCI,TrendMagicATR,1,1) != EMPTY_VALUE) // Short
{
TMTrend="Short";
}

if (iCustom(NULL,0,"TVI_2color",TVI_rs,TVI_rs,5,TVI_TF,0,1) != EMPTY_VALUE && iCustom(NULL,0,"TVI_2color",TVI_rs,TVI_rs,5,TVI_TF,1,1) == EMPTY_VALUE)
{
TVITrend="Long";
}

if (iCustom(NULL,0,"TVI_2color",TVI_rs,TVI_rs,5,TVI_TF,0,1) == EMPTY_VALUE && iCustom(NULL,0,"TVI_2color",TVI_rs,TVI_rs,5,TVI_TF,1,1) != EMPTY_VALUE)
{
TVITrend="Short";
}

//Pozíció nyitások

if (TMTrend == "Long" && TVITrend == "Long" && !nyitott)
{
ticket=OrderSend(Symbol(),OP_BUY,maxlots,Ask,slippage,0,0,"TrendMagic-TVI - Long",MathRand(),0,Green);
err = GetLastError();
if (err != 0 && ticket < 0)
{
Print("Error # ", err, " ", ErrorDescription(err));
}
}

if (TMTrend == "Short" && TVITrend == "Short" && !nyitott)
{
ticket=OrderSend(Symbol(),OP_SELL,maxlots,Bid,slippage,0,0,"TrendMagic-TVI - Short",MathRand(),0,Green);
err = GetLastError();
if (err != 0 && ticket < 0)
{
Print("Error # ", err, " ", ErrorDescription(err));
}
}

//Stop-loss húzás
orders=OrdersTotal();

if (orders != 0)
{
for(pos=0;pos<orders;pos++)
{
if(OrderSelect(pos, SELECT_BY_POS,MODE_TRADES))
{
ParUp=iCustom(NULL,0,"Parabolic trendchaser", false, 0.06,0.1,7,0,0,1);
ParDn=iCustom(NULL,0,"Parabolic trendchaser", false, 0.06,0.1,7,0,1,1);

if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && ParDn != 0)
{
stoploss = ParDn;

if (OrderModify(OrderTicket(),OrderOpenPrice(), stoploss, OrderTakeProfit(),0,Blue))
Print("Stop-loss módosítva!");
else
{
Print("Stop-loss nem módosult! ", DoubleToStr(stoploss,5));
Print("Hibaüzenet : ",ErrorDescription(GetLastError()));
}
}else if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && ParUp != 0)
{
stoploss = ParUp;

if (OrderModify(OrderTicket(),OrderOpenPrice(), stoploss, OrderTakeProfit(),0,Blue))
Print("Stop-loss módosítva!");
else
{
Print("Stop-loss nem módosult! ", DoubleToStr(stoploss,5));
Print("Hibaüzenet : ",ErrorDescription(GetLastError()));
}
}
}else
Print("Nem sikerült húzni a Stop-Loss-t, nem találom a pozíciót!");
}
}
}


A kódot a MetaEditor szerkesztő mezőjébe kell bemásolni, de előtte egy "üres" Expert Advisor-t kell készíteni. Ez a következőképpen megy, ha már a MetaEditor-ban vagyunk :
  • File menü
  • New menüpont
  • A megjelenő ablakban az Expert Advisor-t kell bejelölni
  • A tovább gomb után pedig olyan nevet adunk neki, amilyet akarunk, de célszerű a forráskód fejlécében lévő nevet adni neki (TrendMagic-TVI).
  • Célszerű az ablak tartalmátteljesen kitörölni és bemásolni a fenti kódot.
Ha ezzel meg vagyunk,akkor már csak annyi a dolgunk, hogy lefordítjuk a kódot, amit vagy az F5 billentyűvel tehetünk meg, vagy pedig a menü alatti ikon sorban található Compile gombbal.
A fordítás után a chart-ra visszatérve a navigátor ablakban az Expert Advisor mappában találjuk azon a néven, amilyen nevet adtunk neki létrehozáskor.

Aki kedvet érez hozzá, nyugodtan kísérletezzen vele, de szigorúan csak demo számlán!!!
Ez a program még nem elég érett az éles számlán történő használatra, de folyamatosan érlelni fogjuk. Most még elég nyers ez a kód.

Aki esetleg fordítási hibával találkozik (előfordulhat, hogy a HTML-be illesztés során homokszem kerül a gépezetbe), nyugodtan írja meg nekem, bár leteszteltem, és le kellene fordulnia simán.
Egyébként elég beszéldessek a hibaüzenetek.

Kellemes babrálást!