środa, 16 marca 2011

Automatyczna strategia oparta o MACD

Pytano mnie o cały kod skryptu ze strategią MACD. Oto on:


//+------------------------------------------------------------------+
//|                                                  MACD system.mq4 |
//|                                          Copyright © 2010, Tomek |
//|                                 http://do-wolnosci.blogspot.com/ |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2010, Tomek"
#property link      "http://do-wolnosci.blogspot.com/"

extern int MACD_szybka = 12;
extern int MACD_wolna = 26;
extern int MACD_sygnal = 9;

extern int identyfikator = 12345;
extern double loty = 0.1;
extern int takeProfit = 500;
extern int stopLoss = 30;

int init() {
   return(0);
}

int deinit() {
   return(0);
}


int start() {
   double macd0=iMACD(NULL,0,MACD_szybka,MACD_wolna,MACD_sygnal,PRICE_OPEN,MODE_MAIN,0);
   double macd1=iMACD(NULL,0,MACD_szybka,MACD_wolna,MACD_sygnal,PRICE_OPEN,MODE_MAIN,1);

   bool kup = macd1 < 0 && macd0 > 0;
   bool sprzedaj = macd1 > 0 && macd0 < 0;

   int pozycja = znajdzPozycje(identyfikator);

   if(kup) {
      if(pozycja > 0)
         roluj(pozycja, OP_BUY);
      else
         kup();
   }
   if(sprzedaj) {
      if(pozycja > 0)
         roluj(pozycja, OP_SELL);
      else
         sprzedaj();
   }

   return(0);
}

int znajdzPozycje(int identyfikator) {
   int i = 0;
   for(i=0; i < OrdersTotal(); i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber() == identyfikator) {
         return (OrderTicket());
      }
   }
   return (0);
}

void kup() {
   int ticket = OrderSend(Symbol(),OP_BUY,loty,Ask,5,Bid-stopLoss*Point,Ask+takeProfit*Point,"MACD system",identyfikator,0,Blue);
   if(ticket>0) {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Zająłem długą pozycję: ",OrderOpenPrice());
   } else {
      Print("Błąd podczas otwierania długiej pozycji: ",GetLastError());
   }
}

void sprzedaj() {
   int ticket = OrderSend(Symbol(),OP_SELL,loty,Bid,5,Bid+stopLoss*Point,Bid-takeProfit*Point,"MACD system",identyfikator,0,Red);
   if(ticket>0) {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Zająłem krótką pozycję: ",OrderOpenPrice());
   } else {
      Print("Błąd podczas otwierania krótkiej pozycji: : ",GetLastError());
   }
}

void roluj(int identyfikator, int typ) {
   if(OrderType() != typ) {
      double price = Bid;
      if(OrderType() == OP_SELL)
         price = Ask;
      OrderClose(identyfikator, OrderLots(), price, 3, Yellow);
      if(typ == OP_BUY)
         kup();
      else
         sprzedaj();
   }
}

Można pobawić się zmiennymi zadeklarowanymi na początku skryptu, albo próbować je zoptymalizować. Wiem, wiem obiecałem, że pokaże krok po kroku jak to zrobić, ale mam lenia! :)

2 komentarze:

Related Posts with Thumbnails