04 January 2011

Forex - Casino - Gold - II

Kolejne rozwinięcie algorytmu oparłem na koncepcji otwierania dodatkowej pozycji, w sytuacji kiedy rynek gwałtownie zmienia swój bieg. Algorytm otwiera dodatkową pozycję SELL lub BUY z podwojoną stawką zakładu przynoszącego straty. Decyzja o otwarciu pozycji odwrotnej jest podejmowana na podstawie wartości stawki zakładu, który przynosi straty. Wynik działa algorytmu dla M1 i H1 przy zawarciu zakładów początkowych SELL & BUY 

zysk: 31113.43 euro (62,22 %)

zysk: 31145.04 euro (62,29 %)


Wykresy bardzo zmieniły swoją charakterystykę w stosunku do pierwotnej strategii kasyna. Wynika to z dużych zysków, które przyniosły dodatkowe zakłady. Oczywiście nic za darmo - do algorytmu wprowadziłem dodatkowe ryzyko w proporcji 1:3. Zyski są realizowane przy zmianach o 15 pips, a ewentualne straty, są zamykane po skoku 45 pips. W badanym okresie zawirowania na rynku nie były na tyle silne aby wygenerować straty. Należy pamiętać że każdy dodatkowy zakład zwiększa ryzyko komunikatu margin call. Obroną przez tragedią, która niewątpliwie nastąpi, jest zwiększenie depozytu - ale wtedy zyski liczone w procentach będą malały wraz ze wzrostem zdeponowanej na koncie gotówki.
Kod algorytmu, który wygenerował wykresy:


#property copyright "http://FiveWithFour.blogspot.com"
#property link "http://FiveWithFour.blogspot.com"
 
// parametry podstawowe sterujące algorytmem 

double dFirstLots = 0.1; // stawka początkowa
int iSlippage = 1;
double dTakeProfitBUY = 5; // skok po jakim zamknąć z zyskiem - BUY
double dLostProfitBUY = 5; // skok po jakim podwoić stawkę - BUY
double dTakeProfitSELL = 5; // skok po jakim zamknąć z zyskiem - SELL
double dLostProfitSELL = 5; // skok po jakim podwoić stawkę - SELL

string sSymbol = "GOLD";

// parametry sterujące zwiększonym ryzykiem 

bool bDoubleDanger = true; // ryzyko (true = włączone / false = wyłączone)
double dTakeProfitDOUBLEBUY = 15; // skok po jakim zamknąć z zyskiem - BUY
double dLostProfitDOUBLEBUY = 45; // skok po jakim zamknąć ze stratą - BUY 
double dTakeProfitDOUBLESELL = 15; // skok po jakim zamknąć z zyskiem - SELL
double dLostProfitDOUBLESELL = 45; // skok po jakim zamknąć ze stratą - SELL
int iDoubleLots = 8; // skok po jakim algorytm zaczyna kompensować straty podwajając zakład przeciwny

// funkcja uruchamiająca skrypt

int init()
  {
  OrderSend(sSymbol, OP_BUY, dFirstLots, Ask , iSlippage, 0, 0, "Casino", 11111, 0 , CLR_NONE);
  OrderSend(sSymbol, OP_SELL, dFirstLots, Bid , iSlippage, 0, 0, "Casino", 11111, 0 , CLR_NONE);
  return(0);
  }

int iDoubleTicket; 
bool bDouble = false; 
int n = 0;

// funkcje algorytmu - uruchamiane przy zmianie ceny waloru 

int start()
  {
  int i=0;
  int iTicket;
  double dLots, dOpnPrice;
  while(OrderSelect(i,SELECT_BY_POS))
    {
    iTicket = OrderTicket();
    dLots = OrderLots();
    dOpnPrice = OrderOpenPrice();
    switch (OrderType())
      {
      case OP_SELL:
        {
        if (dOpnPrice <= (Ask - dLostProfitSELL) && (iTicket != iDoubleTicket) && (OrderMagicNumber() != 33333))
          {
          if (dLots >= (dFirstLots*iDoubleLots) && ((bDouble == false) && (bDoubleDanger == true)))
            {
            iDoubleTicket = OrderSend(sSymbol, OP_BUY, dLots*2, Ask, iSlippage, NULL, NULL, "Casino_double", 22222, 0 , CLR_NONE);
            bDouble = true;
            }
          while ((OrderSend(sSymbol, OP_SELL, dLots*2, Bid , iSlippage, NULL, NULL, "Casino", 11111, 0 , CLR_NONE) < 0))
            {
            if (GetLastError() == 134)
              {
              Print("G A M E O V E R - L O O S E R ! ! ! ");// brak funduszy na dalsze zakłady
              break;
              }
            RefreshRates();
            }
          while (!(OrderClose(iTicket, dLots, Ask, 1, CLR_NONE)))
            {
            RefreshRates();
            }
          }
        if (dOpnPrice >= (Ask + dTakeProfitSELL) && (iTicket != iDoubleTicket))
          {
          while (!(OrderClose(iTicket, dLots, Ask, 1, CLR_NONE)))
            {
            RefreshRates();
            }
          while ((OrderSend(sSymbol, OP_SELL, dFirstLots, Bid , iSlippage, NULL, NULL, "Casino", 11111,0 , CLR_NONE) < 0))
           {
            if (GetLastError() == 134)
             {
              Print("G A M E O V E R - L O O S E R ! ! ! ");// brak funduszy na dalsze zakłady
              break;
              }
            RefreshRates();
            }
          }
        break;
        }
      case OP_BUY:
        {
        if (dOpnPrice >= (Bid + dLostProfitBUY) && (iTicket != iDoubleTicket) && (OrderMagicNumber() != 33333))
          {
          if (dLots >= (dFirstLots*iDoubleLots) && ((bDouble == false) && (bDoubleDanger == true)))
            {
            iDoubleTicket = OrderSend(sSymbol, OP_SELL, dLots*2, Bid, iSlippage, NULL, NULL, "Casino_double", 22222,0 , CLR_NONE);
            bDouble = true;
           }
          while ((OrderSend(sSymbol, OP_BUY, dLots*2, Ask, iSlippage, NULL, NULL, "Casino",11111, 0, CLR_NONE) < 0))
            {
            if (GetLastError() == 134)
              {
              Print("G A M E O V E R - L O O S E R ! ! ! ");// brak funduszy na dalsze zakłady
              break;
              }
            RefreshRates();
            }
          while (!(OrderClose(iTicket, dLots, Bid, 1, CLR_NONE)))
            {
            RefreshRates();
            }
          }
        if (dOpnPrice <= (Bid - dTakeProfitBUY) && (iTicket != iDoubleTicket))
          {
          while (!(OrderClose(iTicket, dLots, Bid, 1, CLR_NONE)))
            {
            RefreshRates();
            }
          while ((OrderSend(sSymbol, OP_BUY, dFirstLots, Ask ,iSlippage, NULL, NULL, "Casino", 11111, 0, CLR_NONE) < 0))
            {
            if (GetLastError() == 134)
              {
              Print("G A M E O V E R - L O O S E R ! ! ! ");// brak funduszy na dalsze zakłady
              break;
              }
            }
          }
        break;
        }
      }
    i++;
    if (bDoubleDanger)
      fnCloseDouble();
    }
  return(0);
  }

int fnCloseDouble()
  {
  while(OrderSelect(n,SELECT_BY_POS))
    {
    if (OrderMagicNumber() == 22222)
      {
      switch (OrderType())
        {
        case OP_BUY:
          {
          if (OrderOpenPrice() <= Bid - dTakeProfitDOUBLEBUY)
            {
            RefreshRates();
            OrderClose(OrderTicket(), OrderLots(), Bid, 1, CLR_NONE);
            Print("DOUBLE profit: " + OrderProfit());
            bDouble = false;
            break;
            }
          if (OrderOpenPrice() >= Bid + dLostProfitDOUBLEBUY)
            {
            RefreshRates();
            OrderClose(OrderTicket(), OrderLots(), Bid, 1, CLR_NONE);
            Print("DOUBLE profit: " + OrderProfit());
            bDouble = false;
            break;
            }
          break;
          }
        case OP_SELL:
          {
          if (OrderOpenPrice() >= Ask + dTakeProfitDOUBLESELL)
            {
            RefreshRates();
            OrderClose(OrderTicket(), OrderLots(), Ask, 1, CLR_NONE);
            Print("DOUBLE profit: " + OrderTicket());
            bDouble = false;
            break;
            }
          if (OrderOpenPrice() <= Ask - dLostProfitDOUBLESELL)
            {
            RefreshRates();
            OrderClose(OrderTicket(), OrderLots(), Ask, 1, CLR_NONE);
            Print("DOUBLE profit: " + OrderTicket());
            bDouble = false;
            break;
            }
          }
          break;
        }
      }
    n++;
    }
  n=0;
  return(0);
  }