Код:
extern string _d0 = "Pipzu Extrapolated ver 1.1"; extern int MagicNumber = 8625; extern int Slippage = 3; extern bool EmailTrades = FALSE; int gi_96 = 85; int gi_100 = 30; int gi_104 = 15; extern double Lots = 0.1; extern string _d3 = "Money Managment Risk (0 = off... Raising it will multiply the lot size)"; extern double Risk = 0.1; string gs_unused_132 = "Starategy Parameters"; int g_period_140 = 4; int g_period_144 = 27; int g_period_148 = 55; int gi_152 = 4; bool gi_156 = TRUE; double gd_160 = 0.02; double gd_168 = 0.2; double gd_176; double gda_184[]; double gda_188[]; double gda_192[]; double g_isar_196; int gia_204[15]; int gia_208[15]; int gia_212[15]; int gia_216[15]; int gia_220[15]; int gia_224[15]; int gia_228[15]; int gia_232[15]; int gi_236 = -1; int g_time_240 = 0; int g_time_244 = 0; void InitParams() { gia_204[0] = D'01.01.2003 03:00'; gia_208[0] = 40; gia_212[0] = 25; gia_216[0] = 0; gia_220[0] = 15; gia_224[0] = 23; gia_228[0] = 78; gia_232[0] = 5; gia_204[1] = D'01.06.2003 04:00'; gia_208[1] = 75; gia_212[1] = 28; gia_216[1] = 0; gia_220[1] = 4; gia_224[1] = 17; gia_228[1] = 131; gia_232[1] = 2; gia_204[2] = D'01.01.2004 03:00'; gia_208[2] = 80; gia_212[2] = 22; gia_216[2] = 0; gia_220[2] = 5; gia_224[2] = 23; gia_228[2] = 99; gia_232[2] = 2; gia_204[3] = D'01.06.2004 04:00'; gia_208[3] = 55; gia_212[3] = 22; gia_216[0] = 25; gia_220[3] = 10; gia_224[3] = 19; gia_228[3] = 99; gia_232[3] = 2; gia_204[4] = D'01.01.2005 03:00'; gia_208[4] = 80; gia_212[4] = 16; gia_216[4] = 0; gia_220[4] = 8; gia_224[4] = 32; gia_228[4] = 75; gia_232[4] = 2; gia_204[5] = D'01.06.2005 04:00'; gia_208[5] = 80; gia_212[5] = 22; gia_216[5] = 10; gia_220[5] = 8; gia_224[5] = 30; gia_228[5] = 134; gia_232[5] = 5; gia_204[6] = D'01.01.2006 03:00'; gia_208[6] = 30; gia_212[6] = 25; gia_216[6] = 0; gia_220[6] = 4; gia_224[6] = 33; gia_228[6] = 135; gia_232[6] = 3; gia_204[7] = D'01.06.2006 04:00'; gia_208[7] = 20; gia_212[7] = 22; gia_216[7] = 15; gia_220[7] = 14; gia_224[7] = 28; gia_228[7] = 64; gia_232[7] = 2; gia_204[8] = D'01.01.2007 03:00'; gia_208[8] = 20; gia_212[8] = 19; gia_216[8] = 25; gia_220[8] = 15; gia_224[8] = 20; gia_228[8] = 72; gia_232[8] = 6; gia_204[9] = D'01.06.2007 04:00'; gia_208[9] = 80; gia_212[9] = 10; gia_216[9] = 0; gia_220[9] = 5; gia_224[9] = 33; gia_228[9] = 68; gia_232[9] = 2; gia_204[10] = D'01.01.2008 03:00'; gia_208[10] = 40; gia_212[10] = 28; gia_216[10] = 0; gia_220[10] = 2; gia_224[10] = 18; gia_228[10] = 130; gia_232[10] = 2; gia_204[11] = D'01.06.2008 04:00'; gia_208[11] = 65; gia_212[11] = 16; gia_216[11] = 15; gia_220[11] = 9; gia_224[11] = 22; gia_228[11] = 86; gia_232[11] = 5; gia_204[12] = D'01.08.2008 04:00'; gia_208[12] = 60; gia_212[12] = 15; gia_216[12] = 25; gia_220[12] = 3; gia_224[12] = 18; gia_228[12] = 115; gia_232[12] = 5; gia_204[13] = D'01.10.2008 04:00'; gia_208[13] = 60; gia_212[13] = 25; gia_216[13] = 15; gia_220[13] = 2; gia_224[13] = 18; gia_228[13] = 84; gia_232[13] = 4; gia_204[14] = D'01.11.2008 04:00'; gia_208[14] = 85; gia_212[14] = 30; gia_216[14] = 15; gia_220[14] = 4; gia_224[14] = 27; gia_228[14] = 55; gia_232[14] = 4; } void CheckParams() { int li_0 = ArrayBsearch(gia_204, Time[1]); if (gi_236 != li_0) { gi_96 = gia_208[li_0]; gi_100 = gia_212[li_0]; gi_104 = gia_216[li_0]; g_period_140 = gia_220[li_0]; g_period_144 = gia_224[li_0]; g_period_148 = gia_228[li_0]; if (gi_152 != gia_232[li_0]) { gi_152 = gia_232[li_0]; ArrayResize(gda_184, gi_152); ArrayResize(gda_188, gi_152); ArrayResize(gda_192, gi_152); } gi_236 = li_0; } } int init() { gd_176 = 0.0001 / Point; if (IsTesting()) InitParams(); ArrayResize(gda_184, gi_152); ArrayResize(gda_188, gi_152); ArrayResize(gda_192, gi_152); return (0); } void setRules() { if (IsTesting()) CheckParams(); for (int l_index_0 = 0; l_index_0 < gi_152; l_index_0++) { gda_184[l_index_0] = iMA(NULL, 0, g_period_140, 0, MODE_EMA, PRICE_CLOSE, l_index_0 + 1); gda_188[l_index_0] = iMA(NULL, 0, g_period_144, 0, MODE_EMA, PRICE_CLOSE, l_index_0 + 1); gda_192[l_index_0] = iMA(NULL, 0, g_period_148, 0, MODE_EMA, PRICE_CLOSE, l_index_0 + 1); } if (gi_156) g_isar_196 = iSAR(NULL, 0, gd_160, gd_168, 1); } int EmaCross(int ai_0) { if (gda_184[0] * ai_0 >= gda_188[0] * ai_0 && gda_184[1] * ai_0 <= gda_188[1] * ai_0) { for (int l_index_4 = 0; l_index_4 < gi_152 - 1; l_index_4++) if (gda_184[l_index_4] * ai_0 >= gda_192[l_index_4] * ai_0 && (gda_184[l_index_4 + 1]) * ai_0 <= (gda_192[l_index_4 + 1]) * ai_0) return (1); } else { if (gda_184[0] * ai_0 >= gda_192[0] * ai_0 && gda_184[1] * ai_0 <= gda_192[1] * ai_0) { for (l_index_4 = 0; l_index_4 < gi_152 - 1; l_index_4++) if (gda_184[l_index_4] * ai_0 >= gda_188[l_index_4] * ai_0 && (gda_184[l_index_4 + 1]) * ai_0 <= (gda_188[l_index_4 + 1]) * ai_0) return (1); } } return (0); } int openBuyRule() { return (!gi_156 || g_isar_196 < Close[1] && EmaCross(1)); } int openSellRule() { return (!gi_156 || g_isar_196 > Close[1] && EmaCross(-1)); } bool closeBuyRule() { return (Close[1] < gda_184[0] && Close[1] < gda_188[0] && Close[1] < gda_192[0]); } bool closeSellRule() { return (Close[1] > gda_184[0] && Close[1] > gda_188[0] && Close[1] > gda_192[0]); } int openBuy() { double l_price_0 = 0; double l_price_8 = 0; int l_stoplevel_16 = MarketInfo(Symbol(), MODE_STOPLEVEL); if (gi_100 > 0) { if (gi_100 * gd_176 > l_stoplevel_16) l_price_8 = NormalizeDouble(Bid - gi_100 * Point * gd_176, Digits); else l_price_8 = NormalizeDouble(Bid - l_stoplevel_16 * Point, Digits); } if (gi_96 > 0) { if (gi_96 * gd_176 > l_stoplevel_16) l_price_0 = NormalizeDouble(Ask + gi_96 * Point * gd_176, Digits); else l_price_0 = NormalizeDouble(Ask + l_stoplevel_16 * Point, Digits); } int l_ticket_20 = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, l_price_8, l_price_0, "Pipzu Extrapolated: Buy", MagicNumber, 0, Green); if (l_ticket_20 > 0) if (EmailTrades) SendMail("Pipzu Extrapolated", "Open Buy: [" + Symbol() + "] " + NormalizeDouble(Ask, Digits)); return (l_ticket_20); } int openSell() { double l_price_0 = 0; double l_price_8 = 0; int l_stoplevel_16 = MarketInfo(Symbol(), MODE_STOPLEVEL); if (gi_100 > 0) { if (gi_100 * gd_176 > l_stoplevel_16) l_price_8 = NormalizeDouble(Ask + gi_100 * Point * gd_176, Digits); else l_price_8 = NormalizeDouble(Ask + l_stoplevel_16 * Point, Digits); } if (gi_96 > 0) { if (gi_96 * gd_176 > l_stoplevel_16) l_price_0 = NormalizeDouble(Bid - gi_96 * Point * gd_176, Digits); else l_price_0 = NormalizeDouble(Bid - l_stoplevel_16 * Point, Digits); } int l_ticket_20 = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, l_price_8, l_price_0, "Pipzu Extrapolated: Sell", MagicNumber, 0, Red); if (l_ticket_20 > 0) if (EmailTrades) SendMail("Pipzu Extrapolated", "Open Sell: [" + Symbol() + "] " + NormalizeDouble(Bid, Digits)); return (l_ticket_20); } int buyControl() { if (closeBuyRule()) if (OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Violet)) return (-1); if (gi_104 > 0) { if (Bid - OrderOpenPrice() > Point * gd_176 * gi_104) if (OrderStopLoss() < Bid - Point * gd_176 * gi_104 || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - Point * gd_176 * gi_104, Digits), OrderTakeProfit(), 0, Green); } return (OrderTicket()); } int sellControl() { if (closeSellRule()) if (OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Violet)) return (-1); if (gi_104 > 0) { if (OrderOpenPrice() - Ask > Point * gd_176 * gi_104) if (OrderStopLoss() > Ask + Point * gd_176 * gi_104 || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + Point * gd_176 * gi_104, Digits), OrderTakeProfit(), 0, Red); } return (OrderTicket()); } double MMLots(double ad_0) { return (NormalizeLots(ad_0 * AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED) / (AccountLeverage() / 100.0))); } double NormalizeLots(double ad_0) { double l_lotstep_8 = MarketInfo(Symbol(), MODE_LOTSTEP); double l_minlot_16 = MarketInfo(Symbol(), MODE_MINLOT); double l_maxlot_24 = MarketInfo(Symbol(), MODE_MAXLOT); double ld_ret_32 = MathCeil(ad_0 / l_lotstep_8) * l_lotstep_8; if (ld_ret_32 < l_minlot_16) ld_ret_32 = l_minlot_16; if (ld_ret_32 > l_maxlot_24) ld_ret_32 = l_maxlot_24; return (ld_ret_32); } int start() { Comment("Copyright "); if (Bars < 100) { Print("bars less than 100"); return (0); } setRules(); int li_0 = -1; int li_4 = -1; for (int l_pos_8 = OrdersTotal() - 1; l_pos_8 >= 0; l_pos_8--) { if (OrderSelect(l_pos_8, SELECT_BY_POS)) { if (OrderMagicNumber() == MagicNumber) { if (OrderSymbol() == Symbol()) { switch (OrderType()) { case OP_BUY: li_0 = buyControl(); break; case OP_SELL: li_4 = sellControl(); } } } } } int li_16 = openBuyRule(); int li_20 = openSellRule(); if (Risk > 0.0) Lots = MMLots(Risk); if (AccountFreeMargin() < MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lots) { Print("We have no money. Free Margin = ", AccountFreeMargin(), " RequiredMargin = ", MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lots); return (0); } if (g_time_240 != Time[1] && li_16 && li_0 < 0) { if (openBuy() > 0) g_time_240 = Time[1]; } else { if (g_time_244 != Time[1] && li_20 && li_4 < 0) if (openSell() > 0) g_time_244 = Time[1]; } return (0); }
1. Код выкладываю как есть, без правки.
2. В коде могут быть ошибки (наверное).
3. Сообщите результаты (тесты или ...)
Отредактировано Andy_Kon (2008-12-30 17:24:13)