Код:
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)