Pozdrav svima,
Eto dosao je i taj dan , kada smo se okupili ovde da zajedno pozdravimo naseg novog/starog robota, koji se zove , "Portugalac". Mozda bi mu "Rainbow 5" ime bolje licilo , ali eto cudni su putevi kojim hodimo, na ovoj kugli zemaljskoj. I neke stvari nam nikada nece biti jasne, zasto i zbog cega nesto cinimo , tako kako cinimo. A jel vam se svidja ,hahaha. Dosta zajebancije idemo na ozbiljne teme.
Pa de ste "BRE", sta ima kod vas, jel sabirate gubitke? Obecanje ludom radovanje! Nije tako hahaha. Eto posle izvesnog vremena resih da ispunim ono sto sam i obecao. Portugalac je projekat u razvoju. Ali to ne znaci da robot nije vec operativan. Ima ugradjeno dosta stvarcica, od kojih se neke vec koriste, a neke za sada ne. Takodje bice tu jos dosta dodate logike, funkcija,varijabli,itd. Vi mozete iskoristiti potencijal ovog robota i na primer promeniti mu signal logiku. Oko koje se ja nesto nisam trudio za sada, jer mi to i nije bio cilj. Ima nesto uradjeno , ali cisto na operativnom nivou. Sve ono sto je potrebno da bi se uradio dobar buy ili sell signal je vec dodato. Ali kao sto rekoh, stim cu se pozabaviti kasnije. Cek da pustim neku sliku. Snimo sam nesto...
Prva stvar koja mi je bitna kada nesto testiram je Zurnal.Tu pise sve. Da li ima gresaka ili nema i da li ono sto sam se trudi da napravim radi kako treba, ili ne. Evo primera za TS:
- klik:
[You must be registered and logged in to see this image.]
Naravno u meta editoru je pozeljeno da se uradi debuging, itd. Hocu da kazem, da je veoma vazno da znate sta radite i da li ono sto ste napravili radi ok ili ne. Ako je sve ok, onda je sledeci vazan korak optimizacija robota. Evo jos jedne slicice:
- klik:
[You must be registered and logged in to see this image.]
Znaci i zatvori sa nulom takodje radi. Tu je snimak iz terminala ,takodje. Koji pokazuje sta ovaj EA moze da uradi.
- klikni da vidis sliku:
[You must be registered and logged in to see this image.]
Sledeca slika nam pokazuje sta sve ima ukljuceno u ovog robota a sto mozemo podesavati pre nego sto ga pustimo u rad.
- Spoiler:
[You must be registered and logged in to see this image.]
Sto se tice nekog profita njega za sada nema. Ova krivulja nenormalno brzo ide u pogresnu stranu ! Ali resicu i to,bar se nadam?
[You must be registered and logged in to see this image.]Sad oko dileme.Da li testiranje robota na osnovu istorijskih podata ima nekog uticaja na real time trgovanje.NPR. mozda vas robot pravi gubitak prilikom testiranja. Ali to ne znaci da ce praviti i gubitak u real time trgovanju. Zato je dobro da se testira na demo racunu, i tako vise i tako manje. Hocu da kazem da smo ja i i "Ike" ,upeglali jednog robota , u vremenskom opsegu Januar 2018 pa mislim negde sve do polovine 2018, sad ne mogu da se setim tacno meseca. Znaci pravio je plus nenormalno.Zatim smo ga testirali na podacima od Januara 2019 , pa sve do Marta , mislim? nisam sad siguran za krajni datum. I onda je pravio gubitke. Cista dubioza.
Sta zelim da kazem. Ako zelite da kupite robota na trzistu za par stotina dolara ili par hiljada dolara
(samo ako ste valili pamecu!!!). ZNAJTE da sve moze da se upegla do savrsenstva. I sad vi kad gledate robu, a ne mozete da je probate. Znajte da je u vecini slucajeva roba kvarljiva. Ima dosta dobrih besplatnih robota na
MQL5 veb sajtu , kao i robota koji mogu da se rentaju za par desetina dolara mesecno, kao i robota koji vec trguju i prave profit , real time. Ali znajte da ljudi vole da kopiraju signale samo ako ima u objasnjenju strategije da se robot nadgleda non stop, i podesava po potrebi. Samo takvi signali imaju dosta pratilaca. Znaci ljudi vole da znaju da se ipak nesto nadgleda i kontorlise.
I tako, prica je velika. Takodje obecavam i neke Auto Generisane robote , koje mozete napraviti / generisati automatski iz meta editora a zatim uz mala podesavanja napraviti dobar siste. Takodje u jednoj temi cu malo objasniti i nesto o
HAJMAN generatoru. Odlicna stvarcica. Koja vam generise modularnog robota ,po vasim zahtevima. A zatim ga mozete dograditi ili prepraviti kako vama odgovara, jer vec imate uvezan sistem. Kako pokrenuti ovaj generator to nije problem jer je exe fajl , samo se prevuce na chart. Ali posle ima caka kako pokrenuti robota da trguje. Tu sam se malo namucio. Al ko se ne namuci taj se ne nauci. I tako konacno u spojleru ispod mozete preuzeti kompletan kod od ovog robota. Iskoristite ga dobro. Ili ga iskorsitite kao osnovu za neku vasu ideju.
- Portugalac.mq5:
- Code:
//+------------------------------------------------------------------+
//| Portugalac.mq5 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
CSymbolInfo _symbol;
CTrade trade;
CPositionInfo _position;
//+------------------------------------------------------------------+
//| Input |
//+------------------------------------------------------------------+
input int ma_period= 5; // MA period
input int ma_shift = 6; // change shift, 0 is current point
input int ma_period2= 10; // MA period 2
input int ma_shift2 = 2; // change shift 2, 0 is current point
input int ma_period3= 15; // MA period 3
input int ma_shift3 = 3; // change shift 3, 0 is current point
input int ma_period4= 20; // MA period 4
input int ma_shift4 = 4; // change shift 4, 0 is current point
input int ma_period5= 25; // MA period 5
input int ma_shift5 = 5; // change shift 5, 0 is current point
input ulong magic_number=191817; // magic number
input ulong dev_point = 10; // deviations point
input ENUM_MA_METHOD ma_method = MODE_SMA; // MA method
input ENUM_APPLIED_PRICE ma_price=PRICE_CLOSE; // MA price type
input ENUM_MA_METHOD ma_method2 = MODE_SMA; // MA method
input ENUM_APPLIED_PRICE ma_price2=PRICE_CLOSE; // MA price type
input ENUM_MA_METHOD ma_method3 = MODE_SMA; // MA method
input ENUM_APPLIED_PRICE ma_price3=PRICE_CLOSE; // MA price type
input ENUM_MA_METHOD ma_method4 = MODE_SMA; // MA method
input ENUM_APPLIED_PRICE ma_price4=PRICE_CLOSE; // MA price type
input ENUM_MA_METHOD ma_method5 = MODE_SMA; // MA method
input ENUM_APPLIED_PRICE ma_price5=PRICE_CLOSE; // MA price type
input ENUM_ORDER_TYPE_FILLING order_type_filling=ORDER_FILLING_RETURN; // choose order filling type
input double lot=0.01; // volume
input ushort stop_loss=500; // stop loss in point
input ushort take_profit=500; // take profit in point
input ushort break_even=5; // break even in point
input ushort trailing_stop = 6; // trailing stop in point
input ushort trailing_step = 2; // trailing step in point
//---
double PRC;
double STL;
double TKP;
double adjusted_point;
double ask,bid,last;
double smaArray[];
int smaHandle;
double smaArray2[];
int smaHandle2;
double smaArray3[];
int smaHandle3;
double smaArray4[];
int smaHandle4;
double smaArray5[];
int smaHandle5;
//---
MqlTick last_tick;
MqlRates rates[];
MqlDateTime _time;
//+------------------------------------------------------------------+
//| Dupliranje lotaze. Trenutno NE koristim 0.01 /0.02 , itd... |
//+------------------------------------------------------------------+
double Balance= AccountInfoDouble(ACCOUNT_BALANCE);
double Equity = AccountInfoDouble(ACCOUNT_EQUITY);
//double DynamicPositionSize = NormalizeDouble((Equity/1000000),2);
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit(){
//---
smaHandle=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
if (smaHandle==INVALID_HANDLE){
Print(" Greska prilikom kreiranja indikatora Moving Averidz - greska ",GetLastError());
return(INIT_FAILED);
}
ArraySetAsSeries(smaArray,true);
//---
smaHandle2=iMA(_Symbol,_Period,ma_period2,ma_shift2,ma_method2,ma_price2);
if (smaHandle2==INVALID_HANDLE){
Print(" Greska prilikom kreiranja indikatora Moving Averidz - greska ",GetLastError());
return(INIT_FAILED);
}
ArraySetAsSeries(smaArray2,true);
//---
smaHandle3=iMA(_Symbol,_Period,ma_period3,ma_shift3,ma_method3,ma_price3);
if (smaHandle3==INVALID_HANDLE){
Print(" Greska prilikom kreiranja indikatora Moving Averidz - greska ",GetLastError());
return(INIT_FAILED);
}
ArraySetAsSeries(smaArray3,true);
//---
smaHandle4=iMA(_Symbol,_Period,ma_period4,ma_shift4,ma_method4,ma_price4);
if (smaHandle4==INVALID_HANDLE){
Print(" Greska prilikom kreiranja indikatora Moving Averidz - greska ",GetLastError());
return(INIT_FAILED);
}
ArraySetAsSeries(smaArray4,true);
//---
smaHandle5=iMA(_Symbol,_Period,ma_period5,ma_shift5,ma_method5,ma_price5);
if (smaHandle5==INVALID_HANDLE){
Print(" Greska prilikom kreiranja indikatora Moving Averidz - greska ",GetLastError());
return(INIT_FAILED);
}
ArraySetAsSeries(smaArray5,true);
//---
ArraySetAsSeries(rates,true);
//---
trade.SetTypeFilling(order_type_filling);
trade.SetDeviationInPoints(dev_point);
trade.SetExpertMagicNumber(magic_number);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(){
//---
ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
last= NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_LAST), _Digits);
//---
if (SymbolInfoTick(Symbol(),last_tick)){
Print(last_tick.time,": Bid = ",last_tick.bid," Ask = ",last_tick.ask," Volume = ",last_tick.volume);
}
else{
Print("Greska prilikom dobijanja informacija o ceni - greska: ",GetLastError());
}
//---
if (CopyRates(_Symbol,_Period,0,10,rates)<0){
Print(" Greska prilikom kopiranja podataka o ceni - greska: ",GetLastError());
}
else{
Print("Podaci uspesno kopirani za ",ArraySize(rates)," sveca");
}
//---
if (CopyBuffer(smaHandle,0,0,3,smaArray)<0){
Print(" Greska prilikom kopiranja podataka od Moving Averidz indikatora - greska: ",GetLastError());
}
else{
Print("smaArray od Moving Averidza uspesno kreiran");
}
if (CopyBuffer(smaHandle2,0,0,3,smaArray2)<0){
Print(" Greska prilikom kopiranja podataka od Moving Averidz indikatora - greska: ",GetLastError());
}
else{
Print("smaArray2 od Moving Averidza 2 uspesno kreiran");
}
if (CopyBuffer(smaHandle3,0,0,3,smaArray3)<0){
Print(" Greska prilikom kopiranja podataka od Moving Averidz indikatora - greska: ",GetLastError());
}
else{
Print("smaArray3 od Moving Averidza 3 uspesno kreiran");
}
if (CopyBuffer(smaHandle4,0,0,3,smaArray4)<0){
Print(" Greska prilikom kopiranja podataka od Moving Averidz indikatora - greska: ",GetLastError());
}
else{
Print("smaArray4 od Moving AveridzaM 4 uspesno kreiran");
}
if (CopyBuffer(smaHandle5,0,0,3,smaArray5)<0){
Print(" Greska prilikom kopiranja podataka od Moving Averidz indikatora - greska: ",GetLastError());
}
else{
Print("smaArray5 od Moving Averidza 5 uspesno kreiran");
}
//---
bool up_trend= last_tick.last > smaArray5[0] &&
smaArray[0] > smaArray5[0] &&
rates[0].close > rates[1].close;
bool dow_trend= last_tick.last < smaArray5[0] &&
smaArray[0] < smaArray5[0] &&
rates[0].close < rates[1].close;
//---
if (up_trend && PositionsTotal() < 1){
PRC = NormalizeDouble(last_tick.ask, _Digits);
STL = NormalizeDouble(PRC - stop_loss * _Point, _Digits);
TKP = NormalizeDouble(PRC + take_profit * _Point, _Digits);
if (trade.Buy(lot,_Symbol,PRC,STL,TKP,"")){
Print(" Uspesno otvaranje BUY pozicije. ResultRetcode: ",trade.ResultRetcode(),"RetcodeDescription: ",trade.ResultRetcodeDescription());
}
else{
Print("Neuspesno otvaranje buy pozicije. ResultRetcode: ",trade.ResultRetcode(),"\nRetcodeDescription: ",trade.ResultRetcodeDescription());
}
}
//---
if (dow_trend && PositionsTotal() < 1 ){
PRC = NormalizeDouble(last_tick.bid, _Digits);
STL = NormalizeDouble(PRC + stop_loss * _Point, _Digits);
TKP = NormalizeDouble(PRC - take_profit * _Point, _Digits);
if (trade.Sell(lot,_Symbol,PRC,STL,TKP,"")){
Print("Uspesno otvaranje SELL pozicije. ResultRetcode: ",trade.ResultRetcode(),"RetcodeDescription: ",trade.ResultRetcodeDescription());
}
else{
Print("neuspesno otvaranje SELL pozicije. ResultRetcode: ",trade.ResultRetcode(),"RetcodeDescription: ",trade.ResultRetcodeDescription());
}
}
BreakEven(last_tick.last);
TrailingStop(last_tick.last);
}
//+--------------------------------------------------------------------+
//TRAILING STOOP |
//+--------------------------------------------------------------------+
void TrailingStop(double price){
for (int i = PositionsTotal()-1; i>=0; i--){
string symbol = PositionGetSymbol(i);
ulong magic = PositionGetInteger(POSITION_MAGIC);
if (symbol==_Symbol && magic == magic_number){
ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
double StopLossCurr = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
double TakeProfitCurr = NormalizeDouble(PositionGetDouble(POSITION_TP),_Digits);
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){
price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
if (price > ( StopLossCurr + trailing_stop * _Point)){
double newSL = NormalizeDouble((StopLossCurr + trailing_step * _Point),_Digits);
if (trade.PositionModify(PositionTicket, newSL, TakeProfitCurr)){
Print("Trailing Stop je uspesno modifikovao Buy poziciju. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
}
else{
Print("Trailing Stop prijavljuje gresku prilikom pokusaja modifikacije Buy pozicije. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
}
}
}
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){
price =NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
if ( price < ( StopLossCurr - trailing_stop * _Point)){
double newSL = NormalizeDouble((StopLossCurr - trailing_step * _Point),_Digits);
if (trade.PositionModify(PositionTicket, newSL, TakeProfitCurr)){
Print("Trailing Stop je uspesno modifikovao Buy poziciju. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
}
else{
Print("Trailing Stop prijavljuje gresku prilikom pokusaja modifikacije Sell pozicije. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
}
}
}
}
}
}
//+--------------------------------------------------------------------+
//BREAK EVEN STOP |
//+--------------------------------------------------------------------+
void BreakEven(double price){
for (int i=PositionsTotal()-1; i>=0; i--){
string symbol=PositionGetSymbol(i);
ulong magic=PositionGetInteger(POSITION_MAGIC);
if (symbol==_Symbol && magic==magic_number){
ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
double PriceEntry=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
double CurrentTakeProfit=NormalizeDouble(PositionGetDouble(POSITION_TP),_Digits);
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){
price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
if (price > (PriceEntry + break_even * _Point)){
if (trade.PositionModify(PositionTicket,PriceEntry,CurrentTakeProfit)){
Print("BreakEven je uspesno modifikovao Buy poziciju. ResultRetcode: ",trade.ResultRetcode(),", RetcodeDescription: ",trade.ResultRetcodeDescription());
}
else{
Print("BreakEven prijavljuje gresku prilikom pokusaja modifikacije Buy pozicije. ResultRetcode: ",trade.ResultRetcode(),", RetcodeDescription: ",trade.ResultRetcodeDescription());
}
}
}
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL){
price =NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
if (price < (PriceEntry - break_even * _Point)){
if (trade.PositionModify(PositionTicket,PriceEntry,CurrentTakeProfit)){
Print("BreakEven je uspesno modifikovao Sell poziciju. ResultRetcode: ",trade.ResultRetcode(),", RetcodeDescription: ",trade.ResultRetcodeDescription());
}
else{
Print("BreakEven prijavljuje gresku prilikom pokusaja modifikacije Sell pozicije. ResultRetcode: ",trade.ResultRetcode(),", RetcodeDescription: ",trade.ResultRetcodeDescription());
}
}
}
}
}
}
//+------------the end---------------------------------------------+
Toliko , odoh