bonus
media partner

Share
Go down
gandra
gandra
Global Moderator
Number of messages : 3606
Points : 8755
Date of Entry : 2013-01-13
Year : 49
Residence Country : Serbia
https://www.mql5.com/en/users/drgandrahttps://www.fxjunction.com/profile/gandra/account/I

ma1 Re: Portugalac EA a moglo bi i Rainbow 5.mq5

on Wed Jul 24, 2019 4:10 pm
Pozdrav svima,

ako ste vec koristili Portugalca videcete gde je greska. odnosno robot radi ok ali kad povuce TS zakuca ga iznad/ispod naloga na minimale. I dalje ga ne vuce za sobom. Elem problem je resen  i sada sve sljaka ok. Ispravku koda za ovog robota mozete preuzeti  ili klonirati sa mog GitHub profila koji se nalazi na sledecem linku:


Takodje zelim da naglasim da svi projekti za koje odlucim da budu javni, bice dostupni za preuzimanje sa  GitHub-a. Mislm da je to mnogo laksi nacin. Roboti koje budem objavljivao ce  biti komplet operativni, ali! Uvek postoji ono ali. Kod koji bude objavljen je kod iz pocetne faze razvoja. Ovde ce biti objavljivane informacije sta ima novo, i sta je dostupno za kloniranje. Takodje moguce je da cu neki delovi koda biti  i ovde dostupni. Ali kao sto rekoh ceo kod samo  na github-u. Takodje planiram da iskucam i jednog robota u  Python-u. jer za mene je ipak python number 1.

E sad, cek da napravim neku sliku sa testa da se vidi kako EA radi. Samo malo, please. Evo primera sa M1 grafikona i buy pozicije:
[You must be registered and logged in to see this link.]

Sell pozicije:
[You must be registered and logged in to see this link.]

Znaci sve sljaka ok. Sta se desilo juce? Naime kada sam pokrenu test sve se izvrsavalo kako sam i zadao. Brekeven je radio svoj posao i slao informaciju u izvestaj(JURNAL), da je sve ok. Takodje i trejling stop. Ali ts je ostajao zakucan malo iznad ili ispod otvorenog naloga a u zavisnosti od tipa pozicije. Znaci sve je radilo , zato su informacije  printane ok. Naime ako nesto nije ok onda dobijate izvestaj o gresci, a sto mi je se i desavalo u pocetku ,itd.. Sad je sve ok. Ostaje da se odradi dodatna matematika za indikatore , jer odlucio sam tu nesto da menjam, kao i nova buy/sell logika. U planu je da se doda MM opcija. Takodje mislim da cu sasvim da uklonim postojeci tp i sl i da cu mu zadati da nikad ne izgubi vise od dva dolara a da skine jedan dolar profita. Mozda ovo ukljucim kao dodatnu opciju tako da ce biti moguc izbor izmedju dve logike. Tako nesto planiram i za signal. Takodje bice dodati i nalozi na cekanju , kao opcija. I opcija Time , koja ce omogucavati  da mu zadam vreme aktivnog rada,itd...

Eto toliko,  odoh bad boys
gandra
gandra
Global Moderator
Number of messages : 3606
Points : 8755
Date of Entry : 2013-01-13
Year : 49
Residence Country : Serbia
https://www.mql5.com/en/users/drgandrahttps://www.fxjunction.com/profile/gandra/account/I

ma1 Portugalac EA a moglo bi i Rainbow 5.mq5

on Tue Jul 23, 2019 3:26 pm
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 link.]
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 link.]
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 link.]
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 link.]
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 link.]

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 bad boys


Last edited by gandra on Wed Jul 24, 2019 9:47 pm; edited 1 time in total
Back to top
Permissions in this forum:
You cannot reply to topics in this forum