Код:
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 int Magic = 7777777; int g_bars_132; //--------------------------------------------------------------------------- int start() { if (NumberOfOpenedPositions() > 0 && Bars == g_bars_132) { Comment(" ... Ждём закрытия позиции или следующего бара... "); return (0); } if (Hour() <= TradeStartHour && Hour() >= TradeFinishHour) { Comment(" ... Сейчас неторговое время ... ", "\n", "Работаем с ", TradeStartHour + 1.0, " до ", TradeFinishHour, " часов"); return (0); } Comment(" "); ContrMoveTrade(); return (0); } //--------------------------------------------------------------------------- double GetLots() { if (UseMM) return (NormalizeDouble(MM * AccountFreeMargin() / 100000.0, 1)); else 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); OrderClose(OrderTicket(), OrderLots(), Bid, 1, Red); } 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); OrderClose(OrderTicket(), OrderLots(), Ask, 1, Green); } 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) { 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) g_bars_132 = Bars; } 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) g_bars_132 = Bars; } } } }
1. Код выкладываю как есть, без правки.
2. В коде могут быть ошибки (наверное).
3. Сообщите результаты (тесты или ...)
Отредактировано Andy_Kon (2008-12-30 17:24:41)