//+------------------------------------------------------------------+ //| SufoCandleTrader_v03.mq4 | //| http://www.nonstop.sk/trading/SufoCandleTrader_v03.mq4 | //| | //+------------------------------------------------------------------+ #property copyright "" #property link "" //konstanty (magicke cisla) pomahajuce rozlisit od seba otvorene pozicie (otvaram tri rozne typy pozicii) #define MAGIC1 3661 #define MAGIC2 3662 #define MAGIC3 3663 //---- vstupne parametre (extern znamena, ze budu zobrazene v parametroch experta v obchodnej platforme a teda ich bude mozne menit) extern double Ratio=0.77; extern double SL=12; extern double TSL=12; extern double TPtoSL=3; extern double LotSize=0.05; extern double LotMultiplier=2; //pole kde sa ukladaju cisla otvorenych pozicii (maximalne su tri, z kazdeho typu pozicie jedna) int ticket[3]; //+------------------------------------------------------------------+ //| funkcia spustana pri inicializacii experta | //+------------------------------------------------------------------+ int init() { ArrayInitialize(ticket, -1); //nastavim pole otvorenych pozicii na -1, co znamena, ze nie je otvorena ziadna pozicia return(0); } //+------------------------------------------------------------------+ //| funkcia spustana pri deinicializacii klienta | //+------------------------------------------------------------------+ int deinit() { return(0); } // funkcia vracajuca otvorenu poziciu pre specifikovany symbol a magicke cislo int GetOpenPosition(string symbol, int magic) { //prejde v cykle vsetky pozicie (otvorene aj historicke) for(int i=0;iTSL/D && OrderStopLoss()TSL/D && OrderStopLoss()>Ask+TSL/D) { //ak sa cena zmenila tak, ze je mozne posunut SL tak nastavi novy SL OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TSL/D,OrderTakeProfit(),0,Blue); } } } return; } if(Period()!=PERIOD_H1) { //kontrola ci sa obchoduje na hodinovej periode, ak je graf prepnuty do inej periody, tak neotvara nove pozicie Alert("Bad time period, change it to H1!"); //vypise alert aby upozornilo uzivatela, ze je prepnuty do zlej casovej periody return; } if(Volume[0]>5 && Close[1]!=0) return; //ak je volume vacsi ako 5 (nestihol sa zaciatok novej sviecky) alebo ak nie je este uzavevreta predchadzajuca sviecka tak neotvara poziciu double volume=PM*LotSize; //velkost pozicie aka sa ma otvorit int t=-1; //cislo pozicie (zatial nie je otvorena takze -1) if(index==-1) { //ak uz nie je otvorena pozicia, ide sa otvarat nova double oc=(Open[1]-Close[1]); //rozdiel open a close hodnot predchadazjucej sviecky (pouzite pre indikaciu nastupu do trhu) double hl=(High[1]-Low[1]); //rozdiel high a low hodnot predchadzajucej sviecky (pouzite pre indikaciu nastupu do trhu) //indikator nastupu do trhu je zalozeny na velkosti pomeru rozdielov open,close a high,low if (oc<0 && -oc/hl>Ratio) { //ak je splnena podmienka vstupu do dlhej pozicie if(ticket[tindex]!=-1) { //ak bola predtym otvorena pozicia pre dany typ, treba zistit ci bola uzatvorena so ziskom if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)==true) { if(OrderProfit()>0) volume*=LotMultiplier; //ak bola predchadzajuca pozicia ziskova, nastavi velkost pozicie podla nasobitela } } t=OrderSend(Symbol(),OP_BUY,volume,Ask,SL/D,Ask-SL/D,Ask+TPtoSL*SL/D,"SufoCandleTrader_v03",magic,0,Yellow); //otvori dlhu poziciu s nastavenymi parametrami if(t!=-1) { //ak sa podarilo otvorit poziciu ticket[tindex]=t; //ulozi cislo pozicie do pola pozicii } else { //ak sa nepodarilo otvorit poziciu Sleep(5000); //pocka 5 sekund RefreshRates(); //zisti aktualne hodnoty Bid a Ask t=OrderSend(Symbol(),OP_BUY,volume,Ask,SL/D,Ask-SL/D,Ask+TPtoSL*SL/D,"SufoCandleTrader_v03",magic,0,Yellow); //otvori dlhu poziciu s nastavenymi parametrami if(t!=-1) { //ak sa podarilo otvorit poziciu ticket[tindex]=t; //ulozi cislo pozicie do pola pozicii } else { //ak sa nepodarilo otvorit poziciu Sleep(5000); //pocka 5 sekund RefreshRates();//zisti aktualne hodnoty Bid a Ask t=OrderSend(Symbol(),OP_BUY,volume,Ask,SL/D,Ask-SL/D,Ask+TPtoSL*SL/D,"SufoCandleTrader_v03",magic,0,Yellow); //otvori dlhu poziciu s nastavenymi parametrami if(t!=-1) ticket[tindex]=t; //ulozi cislo pozicie do pola pozicii ak sa ju podarilo otvorit } } } else if (oc>0 && oc/hl>Ratio) { //ak je splnena podmienka vstupu do kratkej pozicie (ostatne je vsetko podobne ako pre dlhu poziciu) if(ticket[tindex]!=-1) { if(OrderSelect(ticket[tindex], SELECT_BY_TICKET, MODE_HISTORY)==true) { if(OrderProfit()>0) volume*=LotMultiplier; } } t=OrderSend(Symbol(),OP_SELL,volume,Bid,SL/D,Bid+SL/D,Bid-TPtoSL*SL/D,"SufoCandleTrader_v03",magic,0,Blue); if(t!=-1) { ticket[tindex]=t; } else { Sleep(5000); RefreshRates(); t=OrderSend(Symbol(),OP_SELL,volume,Bid,SL/D,Bid+SL/D,Bid-TPtoSL*SL/D,"SufoCandleTrader_v03",magic,0,Blue); if(t!=-1) { ticket[tindex]=t; } else { Sleep(5000); RefreshRates(); t=OrderSend(Symbol(),OP_SELL,volume,Bid,SL/D,Bid+SL/D,Bid-TPtoSL*SL/D,"SufoCandleTrader_v03",magic,0,Blue); } } } } return(0); }