#property copyright "Copyright © 2008, fx-auto-trader@mail.ru" #property link "http://www.metaquotes.net" extern double Lots = 0.1; extern double Shift = 3.0; extern double TradeStartHour = 21.0; extern double TradeFinishHour = 7.0; extern int TP = 2; extern int SL = 10; extern double MM = 30.0; extern bool UseMM = FALSE; extern bool Multitrade = TRUE; extern int Magic = 7777777; int g_bars_136; void init() { if (IsTradeAllowed() == FALSE) { Comment(" ... Для нормальной работы советника необходимо разрешить советнику торговать."); return; } if (IsExpertEnabled() == FALSE) { Comment(" ... Отжата кнопка \"Разрешить запуск советников\"\n" + " ... Советник ОСТАНОВЛЕН"); return; } Comment("\n", "... Советник будет запущен со следующим тиком."); } void deinit() { Comment(" "); } void start() { if (IsConnected() == FALSE) { Comment(" ... ОТСУТСТВУЕТ связь с торговым сервером\n" + " ... Приём торговых команд ОСТАНОВЛЕН"); return; } if (IsTradeContextBusy() == TRUE) { Comment(" ... Торговый поток ЗАНЯТ\n" + " ... Торговая команда на сервер не отослана"); return; } if (NumberOfOpenedPositions() > 0 && Multitrade == FALSE) { Comment(" ... Ждём закрытия позиции - мультиторговля запрещена... "); return; } if (NumberOfOpenedPositions() > 0 && Bars == g_bars_136) { Comment(" ... Ждём закрытия позиции или следующего бара... "); return; } if (Hour() <= TradeStartHour && Hour() >= TradeFinishHour) { Comment(" ... Сейчас неторговое время ... ", "\n", "Работаем с ", TradeStartHour + 1.0, " до ", TradeFinishHour, " часов"); return; } Comment(" "); ContrMoveTrade(); } double GetLots() { if (UseMM) return (NormalizeDouble(MM * AccountFreeMargin() / 100000.0, 1)); return (Lots); } int NumberOfOpenedPositions() { int l_ord_total_0 = OrdersTotal(); int l_count_4 = 0; for (int l_pos_8 = 0; l_pos_8 < l_ord_total_0; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY) { l_count_4++; if (Bid >= OrderOpenPrice() + TP * Point - Point / 2.0) { Print("....... Пытаемся закрыть лонг с рынка, Bid=", Bid); if (!OrderClose(OrderTicket(), OrderLots(), Bid, 1, Red)) Print(".... Ошибка закрытия buy позиции ", GetLastError()); } else { if (OrderTakeProfit() == 0.0 && Bid <= OrderOpenPrice() + MarketInfo(Symbol(), MODE_STOPLEVEL) * Point) if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), OrderOpenPrice() + TP * Point, 0, CLR_NONE)) Print(".... Ошибка модификации buy ордера ", GetLastError()); } } if (OrderType() == OP_SELL) { l_count_4++; if (Ask <= OrderOpenPrice() - TP * Point + Point / 2.0) { Print("....... Пытаемся закрыть шорт с рынка, Ask=", Ask); if (!OrderClose(OrderTicket(), OrderLots(), Ask, 1, Green)) Print(".... Ошибка закрытия sell позиции ", GetLastError()); } else { if (OrderTakeProfit() == 0.0 && Ask >= OrderOpenPrice() - MarketInfo(Symbol(), MODE_STOPLEVEL) * Point) if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), OrderOpenPrice() - TP * Point, 0, CLR_NONE)) Print(".... Ошибка модификации sell ордера ", GetLastError()); } } } } return (l_count_4); } int GetSignal() { int li_ret_0 = 0; if ((Bid - Close[1]) / Point - Shift > 0.0) li_ret_0 = 1; if ((Close[1] - Bid) / Point - Shift > 0.0) li_ret_0 = -1; return (li_ret_0); } void ContrMoveTrade() { double l_stoplevel_0; double l_price_8; int l_ticket_16; if (GetSignal() != 0) { if (AccountBalance() < 200.0) Comment("... На счёте мало денег ..."); else { l_stoplevel_0 = MarketInfo(Symbol(), MODE_STOPLEVEL); if (GetSignal() == -1) { RefreshRates(); if (TP > 0 && TP <= l_stoplevel_0 || TP == 0) l_price_8 = 0; else l_price_8 = Ask + TP * Point; Print("....... Пытаемся открыть лонг с рынка, Ask=", Ask); l_ticket_16 = OrderSend(Symbol(), OP_BUY, GetLots(), Ask, 1, Ask - SL * Point, l_price_8, "MegaPipser", Magic, 0, Green); if (l_ticket_16 < 0) Print("... Ошибка открытия лонга...", GetLastError()); if (l_ticket_16 >= 0) g_bars_136 = Bars; } else { if (GetSignal() == 1) { RefreshRates(); if (TP > 0 && TP <= l_stoplevel_0 || TP == 0) l_price_8 = 0; else l_price_8 = Bid - TP * Point; Print("....... Пытаемся открыть шорт с рынка, Bid=", Bid); l_ticket_16 = OrderSend(Symbol(), OP_SELL, GetLots(), Bid, 1, Bid + SL * Point, l_price_8, "MegaPipser", Magic, 0, Red); if (l_ticket_16 < 0) Print("... Ошибка открытия шорта...", GetLastError()); if (l_ticket_16 >= 0) g_bars_136 = Bars; } } } } }