
#property copyright "Copyright © 2009, CoolMan"
#property link      ""

extern string Name = "++++++++++++ Calypso ++++++++++++";
extern string Cop = "+++ Copyright © 2009, CoolMan +++";
extern string no = "";
extern double target = 50.0;
extern double Lots = 0.01;
extern string st = "выбор стратегии";
extern int strateg = 1;
extern string sm = "включение стопа";
extern bool sm_mode = FALSE;
extern string sx = "хедж по всем парам";
extern bool sx_mode = FALSE;
extern string sg = "параметры для более точной настройки";
extern bool sg_mode = FALSE;
extern int targetGBPUSD = 90;
extern int targetEURUSD = 5;
extern int targetEURGBP = 30;
extern int targetUSDCHF = 20;
extern int targetGBPJPY = 20;
extern int targetUSDJPY = 20;
extern int targetGBPCHF = 20;
extern int targetEURCHF = 20;
extern int targetEURJPY = 20;
extern int targetUSDCAD = 20;
extern int targetEURCAD = 20;
extern int targetAUDUSD = 20;
extern int targetEURAUD = 20;
extern int targetNZDUSD = 20;
extern int targetEURNZD = 20;
bool gi_224 = TRUE;
int gi_228 = 0;
int g_magic_232 = 59999;
int gi_236 = 24;
int gi_240;
int g_price_244 = 25;
int gi_unused_248;
string g_symbol_252;
double g_ima_260;
double g_ima_268;
double g_ima_276;
double g_ima_284;
double gd_292;
double gd_300;
double g_isar_308;
double g_isar_316;

int init() {
   gi_unused_248 = target;
   return (0);
}

int start() {
   double l_bid_4;
   double l_ask_12;
   double ld_24;
   double ld_32;
   double ld_40;
   int l_ticket_48;
   int li_52;
   string l_symbol_60;
   string l_symbol_68;
   if (strateg == 0) gi_240 = 1;
   if (strateg == 1) gi_240 = 3;
   if (strateg == 2) gi_240 = 9;
   if (strateg == 3) gi_240 = 15;
   if (IsTradeAllowed()) {
      if (gi_228 != iBars(Symbol(), 0)) {
         for (int li_0 = 1; li_0 <= gi_240; li_0++) {
            if (strateg != 0) g_symbol_252 = Switch_mode(li_0, sg_mode);
            else g_symbol_252 = Symbol();
            HideTestIndicators(TRUE);
            g_ima_268 = iMA(g_symbol_252, 0, 3, 0, MODE_LWMA, PRICE_MEDIAN, 0);
            g_ima_260 = iMA(g_symbol_252, 0, 3, 0, MODE_LWMA, PRICE_MEDIAN, 1);
            g_isar_308 = iSAR(g_symbol_252, 0, 0.001, 0.2, 1);
            g_isar_316 = iSAR(g_symbol_252, 0, 0.01, 0.2, 1);
            HideTestIndicators(FALSE);
            l_bid_4 = MarketInfo(g_symbol_252, MODE_BID);
            l_ask_12 = MarketInfo(g_symbol_252, MODE_ASK);
            if ((g_isar_308 > l_bid_4 && g_isar_316 > l_bid_4) || (g_isar_308 < l_ask_12 && g_isar_316 < l_ask_12)) gi_224 = TRUE;
            if ((g_isar_308 > l_ask_12 && g_isar_316 < l_bid_4) || (g_isar_308 < l_bid_4 && g_isar_316 > l_ask_12)) gi_224 = FALSE;
            if (gi_224 == FALSE) {
               gd_300 = iLowest(g_symbol_252, 0, MODE_LOW, gi_236, 0);
               g_ima_276 = g_ima_268;
               g_ima_284 = g_ima_260;
            }
            if (gi_224 == TRUE) {
               gd_292 = iHighest(g_symbol_252, 0, MODE_HIGH, gi_236, 0);
               g_ima_276 = g_ima_268;
               g_ima_284 = g_ima_260;
            }
            if ((gd_292 == 1.0 && g_ima_276 > g_ima_284) || (gd_300 == 1.0 || gd_300 == 2.0 || gd_300 == 3.0 && g_ima_276 > g_ima_284)) {
               RefreshRates();
               OrderSend(g_symbol_252, OP_BUY, Lots, MarketInfo(g_symbol_252, MODE_ASK), 3, 0, 0, "Calypso", g_magic_232, 0, Blue);
            }
            if (gi_224 == FALSE) {
               gd_300 = iHighest(g_symbol_252, 0, MODE_HIGH, gi_236, 0);
               g_ima_276 = g_ima_268;
               g_ima_284 = g_ima_260;
            }
            if (gi_224 == TRUE) {
               gd_292 = iLowest(g_symbol_252, 0, MODE_LOW, gi_236, 0);
               g_ima_276 = g_ima_268;
               g_ima_284 = g_ima_260;
            }
            if ((gd_292 == 1.0 && g_ima_276 < g_ima_284) || (gd_300 == 1.0 || gd_300 == 2.0 || gd_300 == 3.0 && g_ima_276 < g_ima_284)) {
               RefreshRates();
               OrderSend(g_symbol_252, OP_SELL, Lots, MarketInfo(g_symbol_252, MODE_BID), 3, 0, 0, "Calypso", g_magic_232, 0, Fuchsia);
            }
         }
      }
   } else Comment("В режиме тестирования не работает. Советник уже готов к использованию");
   for (li_0 = 1; li_0 <= gi_240; li_0++) {
      if (strateg != 0) g_symbol_252 = Switch_mode(li_0, sg_mode);
      else g_symbol_252 = Symbol();
      if (sm_mode == TRUE) {
         if (g_price_244 < MarketInfo(g_symbol_252, MODE_STOPLEVEL)) g_price_244 = MarketInfo(g_symbol_252, MODE_STOPLEVEL);
         for (int l_pos_20 = 0; l_pos_20 <= OrdersTotal() - 1; l_pos_20++) {
            OrderSelect(l_pos_20, SELECT_BY_POS, MODE_TRADES);
            if (OrderMagicNumber() == g_magic_232 && OrderStopLoss() == 0.0) {
               if (OrderType() == OP_BUY)
                  if (MarketInfo(g_symbol_252, MODE_BID) - OrderOpenPrice() > g_price_244 * Point + 2.0 * Point) OrderModify(OrderTicket(), 0, MarketInfo(g_symbol_252, MODE_ASK) - g_price_244 * Point + 2.0 * Point, 0, 0, C'0x02,0x00,0x00');
               if (OrderType() == OP_SELL)
                  if (OrderOpenPrice() - MarketInfo(g_symbol_252, MODE_ASK) > g_price_244 * Point + 2.0 * Point) OrderModify(OrderTicket(), 0, MarketInfo(g_symbol_252, MODE_BID) + g_price_244 * Point + 2.0 * Point, 0, 0, C'0x04,0x00,0x00');
            }
         }
         g_price_244 = 25;
      }
      ld_24 = 0;
      ld_32 = 0;
      ld_40 = 0;
      l_ticket_48 = 0;
      if (sx_mode == FALSE) {
         li_52 = OrdersTotal() - 1;
         for (int l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
            OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_232 && OrderSymbol() == g_symbol_252) ld_24 = OrderProfit() + OrderSwap() + ld_24;
         }
         if (ld_24 >= target) {
            li_52 = OrdersTotal() - 1;
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_232 && OrderSymbol() == g_symbol_252)
                  if (OrderProfit() + OrderSwap() > -target) ld_32 = OrderProfit() + OrderSwap();
               if (ld_32 < ld_40) {
                  ld_40 = ld_32;
                  l_ticket_48 = OrderTicket();
               }
            }
            if (l_ticket_48 != 0) OrderClose(l_ticket_48, OrderLots(), MarketInfo(g_symbol_252, MODE_ASK), 3, Fuchsia);
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_232 && OrderSymbol() == g_symbol_252) OrderClose(OrderTicket(), OrderLots(), MarketInfo(g_symbol_252, MODE_BID), 3, Blue);
            }
         }
         ld_24 = 0;
         li_52 = OrdersTotal() - 1;
         for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
            OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_232 && OrderSymbol() == g_symbol_252) ld_24 = OrderProfit() + OrderSwap() + ld_24;
         }
         if (ld_24 >= target) {
            li_52 = OrdersTotal() - 1;
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_232 && OrderSymbol() == g_symbol_252)
                  if (OrderProfit() + OrderSwap() > -target) ld_32 = OrderProfit() + OrderSwap();
               if (ld_32 < ld_40) {
                  ld_40 = ld_32;
                  l_ticket_48 = OrderTicket();
               }
            }
            if (l_ticket_48 != 0) OrderClose(l_ticket_48, OrderLots(), MarketInfo(g_symbol_252, MODE_BID), 3, Blue);
            li_52 = OrdersTotal() - 1;
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_232 && OrderSymbol() == g_symbol_252) OrderClose(OrderTicket(), OrderLots(), MarketInfo(g_symbol_252, MODE_ASK), 3, Fuchsia);
            }
         }
      }
      if (sx_mode == TRUE) {
         li_52 = OrdersTotal() - 1;
         for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
            OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_232) ld_24 = OrderProfit() + OrderSwap() + ld_24;
         }
         if (ld_24 >= target) {
            li_52 = OrdersTotal() - 1;
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_232)
                  if (OrderProfit() + OrderSwap() > -target) ld_32 = OrderProfit() + OrderSwap();
               if (ld_32 < ld_40) {
                  ld_40 = ld_32;
                  l_ticket_48 = OrderTicket();
                  l_symbol_60 = OrderSymbol();
               }
            }
            if (l_ticket_48 != 0) OrderClose(l_ticket_48, OrderLots(), MarketInfo(l_symbol_60, MODE_ASK), 3, Fuchsia);
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               l_symbol_68 = OrderSymbol();
               if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_232) OrderClose(OrderTicket(), OrderLots(), MarketInfo(l_symbol_68, MODE_BID), 3, Blue);
            }
         }
         ld_24 = 0;
         li_52 = OrdersTotal() - 1;
         for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
            OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_232) ld_24 = OrderProfit() + OrderSwap() + ld_24;
         }
         if (ld_24 >= target) {
            li_52 = OrdersTotal() - 1;
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_232)
                  if (OrderProfit() + OrderSwap() > -target) ld_32 = OrderProfit() + OrderSwap();
               if (ld_32 < ld_40) {
                  ld_40 = ld_32;
                  l_ticket_48 = OrderTicket();
                  l_symbol_60 = OrderSymbol();
               }
            }
            if (l_ticket_48 != 0) OrderClose(l_ticket_48, OrderLots(), MarketInfo(l_symbol_60, MODE_BID), 3, Blue);
            li_52 = OrdersTotal() - 1;
            for (l_pos_56 = li_52; l_pos_56 >= 0; l_pos_56--) {
               OrderSelect(l_pos_56, SELECT_BY_POS, MODE_TRADES);
               RefreshRates();
               l_symbol_68 = OrderSymbol();
               if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_232) OrderClose(OrderTicket(), OrderLots(), MarketInfo(l_symbol_68, MODE_ASK), 3, Fuchsia);
            }
         }
      }
   }
   gi_228 = iBars(Symbol(), 0);
   return (0);
}

string Switch_mode(int ai_0, int ai_4) {
   if (ai_4 == 0) {
      switch (ai_0) {
      case 1:
         g_symbol_252 = "GBPUSD";
         break;
      case 2:
         g_symbol_252 = "EURUSD";
         break;
      case 3:
         g_symbol_252 = "EURGBP";
         break;
      case 4:
         g_symbol_252 = "USDCHF";
         break;
      case 5:
         g_symbol_252 = "GBPJPY";
         break;
      case 6:
         g_symbol_252 = "USDJPY";
         break;
      case 7:
         g_symbol_252 = "GBPCHF";
         break;
      case 8:
         g_symbol_252 = "EURCHF";
         break;
      case 9:
         g_symbol_252 = "EURJPY";
         break;
      case 10:
         g_symbol_252 = "USDCAD";
         break;
      case 11:
         g_symbol_252 = "EURCAD";
         break;
      case 12:
         g_symbol_252 = "AUDUSD";
         break;
      case 13:
         g_symbol_252 = "EURAUD";
         break;
      case 14:
         g_symbol_252 = "NZDUSD";
         break;
      case 15:
         g_symbol_252 = "EURNZD";
      }
   }
   if (ai_4 == 1) {
      switch (ai_0) {
      case 1:
         g_symbol_252 = "GBPUSD";
         target = targetGBPUSD;
         break;
      case 2:
         g_symbol_252 = "EURUSD";
         target = targetEURUSD;
         break;
      case 3:
         g_symbol_252 = "EURGBP";
         target = targetEURGBP;
         break;
      case 4:
         g_symbol_252 = "USDCHF";
         target = targetUSDCHF;
         break;
      case 5:
         g_symbol_252 = "GBPJPY";
         target = targetGBPJPY;
         break;
      case 6:
         g_symbol_252 = "USDJPY";
         target = targetUSDJPY;
         break;
      case 7:
         g_symbol_252 = "GBPCHF";
         target = targetGBPCHF;
         break;
      case 8:
         g_symbol_252 = "EURCHF";
         target = targetEURCHF;
         break;
      case 9:
         g_symbol_252 = "EURJPY";
         target = targetEURJPY;
         break;
      case 10:
         g_symbol_252 = "USDCAD";
         target = targetUSDCAD;
         break;
      case 11:
         g_symbol_252 = "EURCAD";
         target = targetEURCAD;
         break;
      case 12:
         g_symbol_252 = "AUDUSD";
         target = targetAUDUSD;
         break;
      case 13:
         g_symbol_252 = "EURAUD";
         target = targetEURAUD;
         break;
      case 14:
         g_symbol_252 = "NZDUSD";
         target = targetNZDUSD;
         break;
      case 15:
         g_symbol_252 = "EURNZD";
         target = targetEURNZD;
      }
   }
   return (g_symbol_252);
}
