bleh
[mqlkit.git] / SpeedTrain.mq4
blobd84e6b8e462908817b74d1e46e739766dda16ab7
1 #property copyright "Zarko Asenov"\r
2 #property link      "jaltoh.6x.to"\r
3 \r
4 \r
5 extern int    Slippage         =       3;\r
6 extern double     LotSize= 0.1;\r
7 extern double     PipStep= 20.0;\r
8 extern bool  InitialBuyOrder = true;\r
9 extern int    MagicNumber         =  1771611;\r
10 extern double Close_All_Profit = 10.0;\r
11 extern bool Debug_Print = false;\r
12 extern int Bands_Days = 20;\r
13 extern int Bands_Deviations = 3;\r
14 extern double Min_Bands = 0.01;\r
15 extern int Num_Bands = 2;\r
16 extern double Order_Lifetime_Days = 0.2;\r
17 extern bool Add_Spread_to_Profit = false;\r
18 extern bool Add_Spread_to_PipStep = true;\r
19 extern bool Add_MinStop_to_PipStep = true;\r
20 extern bool Check_ADX = false;\r
21 extern int ADX_positions_to_check = 2;\r
22 extern int ADX_period_in_days = 4;\r
23 extern double ADX_min = 37.0;\r
24 extern double Hours_Bring_Even = 0;\r
27 int longOrderCount = 0;\r
28 int shortOrderCount = 0;\r
29 double startPrice = 0;\r
30 int    digits = 4;\r
31 bool initOrdersDone = false;\r
32 double spread = 0.0;\r
33 double pipstep_adjusted = 0.0;\r
34 double adx_diff = 0.0;\r
36 double get_minstop()\r
37 {\r
38    return( MarketInfo(Symbol(), MODE_STOPLEVEL) + 1.0 );\r
39 }\r
41 double\r
42 get_adx(int index)\r
43 {\r
44    double ADX1,ADX2;\r
46    adx_diff = iADX(NULL, PERIOD_D1, ADX_period_in_days, PRICE_CLOSE, MODE_MAIN, index);\r
47    \r
48    ADX1 = iADX(NULL, PERIOD_D1, ADX_period_in_days, PRICE_CLOSE, MODE_PLUSDI, index);\r
49    ADX2 = iADX(NULL, PERIOD_D1, ADX_period_in_days, PRICE_CLOSE, MODE_MINUSDI, index);\r
51    if(ADX1 < ADX2) adx_diff *= -1.0;\r
52       \r
53    return (adx_diff);\r
54 }\r
56 bool\r
57 adx_is_sell(int num_pos)\r
58 {\r
59    if (Check_ADX == false) return (true);\r
61    double neg_adx_min = -1.0 * ADX_min;\r
62    for (int i=0; i<num_pos; i++)\r
63       if (get_adx(i) > neg_adx_min) return (false);\r
65    return (true);\r
66 }\r
68 bool\r
69 adx_is_buy(int num_pos)\r
70 {\r
71    if (Check_ADX == false) return (true);\r
73    for (int i=0; i<num_pos; i++)\r
74       if (get_adx(i) < ADX_min) return (false);\r
76    return (true);\r
77 }\r
79 //+------------------------------------------------------------------+}\r
81 int init()\r
82 {\r
83    digits=MarketInfo(Symbol(),MODE_DIGITS);  \r
84    Print("digits ...... "+digits);\r
85    \r
86    return(0);\r
87 }\r
90 double\r
91 Calc_Profit()\r
92 {\r
93    double result = 0.0;\r
94    \r
95    for (int i = 0;i < OrdersTotal(); i++) {\r
96          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);\r
97          if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;\r
98          \r
99          if (OrderType() == OP_BUY || OP_SELL)\r
100             result += OrderProfit();\r
101   }\r
103    return (result);   \r
106 double bandwidth = 0.0;\r
108 double\r
109 getBandwidth(int pos)\r
111     double upper_band = iBands(NULL, PERIOD_M15, Bands_Days, Bands_Deviations, 0, PRICE_CLOSE, MODE_UPPER, pos);\r
112     double lower_band = iBands(NULL, PERIOD_M15, Bands_Days, Bands_Deviations, 0, PRICE_CLOSE, MODE_LOWER, pos);\r
113    \r
114     return (upper_band - lower_band);\r
117 bool\r
118 inBands()\r
120     for (int i = 0; i < Num_Bands; i++) {\r
121         bandwidth = getBandwidth(i);\r
122         if (bandwidth < Min_Bands) return (false);\r
123     }\r
124   \r
125     return (true);\r
128 void \r
129 moveHitBuyOrdersToBE()\r
131     for(int j = 0; j < OrdersTotal(); j++)\r
132     {\r
133         OrderSelect(j, SELECT_BY_POS, MODE_TRADES);\r
134             \r
135         if ((OrderMagicNumber() == MagicNumber) && (OrderType() == OP_BUY) &&\r
136             ((TimeCurrent() - OrderOpenTime()) > (3600 * Hours_Bring_Even)) )\r
137             \r
138                 OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), 0, 0, Blue);\r
140     }\r
142       \r
143 void \r
144 moveHitSellOrdersToBE()\r
146     for(int j = 0; j < OrdersTotal(); j++)\r
147     {\r
148         OrderSelect(j, SELECT_BY_POS, MODE_TRADES);\r
149             \r
150         if ((OrderMagicNumber() == MagicNumber) && (OrderType() == OP_SELL) &&\r
151             ((TimeCurrent() - OrderOpenTime()) > (3600 * Hours_Bring_Even)) )\r
153                 OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), 0, 0, Red);\r
155     }\r
158 int start()\r
159   {\r
160         if(startPrice ==0) {\r
161             startPrice=iOpen( NULL, PERIOD_M15, 0); //PERIOD_M15\r
162             if (Debug_Print) Print("startPrice ...... "+startPrice);\r
163         }\r
165       pipstep_adjusted = PipStep;\r
166       \r
167       if (Add_Spread_to_PipStep)\r
168          pipstep_adjusted += spread / MarketInfo(Symbol(), MODE_POINT);\r
170       if (Add_MinStop_to_PipStep)\r
171          pipstep_adjusted += get_minstop();\r
173     \r
174         if(!initOrdersDone){\r
175           \r
176           placeBuyOrder();\r
177           placeSellOrder();\r
178           if(InitialBuyOrder) {\r
179             placeInitBuyOrder();\r
180           }else{\r
181             placeInitSellOrder();\r
182           }\r
183             \r
184           initOrdersDone=true;\r
185         }\r
186         \r
187         if(iClose( NULL, PERIOD_M15, 0) > (startPrice + pipstep_adjusted*Point)){\r
188           startPrice=iClose( NULL, PERIOD_M15, 0);\r
189            if (Debug_Print) Print("new startPrice ...... "+startPrice);\r
190           // need to set the sl to BE of last order\r
191            moveSellOrderToBE();\r
192            moveHitBuyOrdersToBE();\r
193           // place buy limit order\r
194           if (inBands() && adx_is_buy(ADX_positions_to_check)) placeBuyOrder();        \r
195         } else if (iClose( NULL, PERIOD_M15, 0) < (startPrice - pipstep_adjusted*Point)) {\r
196           startPrice=iClose( NULL, PERIOD_M15, 0);\r
197           if (Debug_Print) Print("new startPrice ...... "+startPrice);\r
198           // need to set the sl to BE of last order\r
199           moveBuyOrderToBE();  \r
200           moveHitSellOrdersToBE();\r
201           // place buy limit order\r
202           if (inBands() && adx_is_sell(ADX_positions_to_check)) placeSellOrder();\r
203         }\r
205      double current_profit = Calc_Profit();\r
206      double bid = MarketInfo(Symbol(), MODE_BID);\r
207      double ask = MarketInfo(Symbol(), MODE_ASK);\r
208       spread = ask - bid;\r
210    if (Debug_Print) {\r
211      Comment(\r
212       "SpeedTrain Forte\nDrZ 2011\n"+\r
213       "Symbol: "+Symbol()+"\n"+\r
214       "Spread: "+spread+"\n"+\r
215       "Bandwidth: "+bandwidth+"\n"+\r
216       "Pipstep: "+pipstep_adjusted+"\n"+\r
217       "Current Price: "+startPrice+"\n"+\r
218       "Close Price: "+iClose( NULL, PERIOD_M15, 0)+"\n"+\r
219       "ADX diff: "+adx_diff+"\n"+\r
220       "Profit: "+current_profit+"\n"\r
221      );      \r
222    }\r
223    \r
224      if (current_profit > Close_All_Profit) {\r
225      \r
226       if (Debug_Print) \r
227          Print("Closing orders on profit " + AccountProfit() + " Spread: " + (ask - bid) + " pips.");\r
229       int buy_ids[128];\r
230       int sell_ids[128];\r
231       int buys_count = 0;\r
232       int sells_count = 0;\r
233          \r
234       for (int i = 0;i < OrdersTotal(); i++) {\r
235       \r
236          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);\r
237          \r
238          if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;\r
239            \r
240          if (OrderType() == OP_BUY) {\r
241             buy_ids[buys_count] = OrderTicket();\r
242             buys_count++;\r
243             OrderClose( OrderTicket(), LotSize, OrderClosePrice(), Red); //bid\r
244          } else if (OrderType() == OP_SELL) {\r
245             sell_ids[sells_count] = OrderTicket();\r
246             sells_count++;\r
247             OrderClose( OrderTicket(), LotSize, OrderClosePrice(), Red); //ask\r
248          } else if (OrderType() == OP_SELLSTOP || OP_BUYSTOP) {\r
249             OrderDelete( OrderTicket() );\r
250          }\r
251       }\r
252       \r
253       if (buys_count != 0 && sells_count != 0) {\r
254          Print("Lets try save.");\r
255          \r
256          int buyix = 0;\r
257          int sellix = 0;\r
258          \r
259          while (buyix < buys_count && sellix < sells_count) {\r
260            bool res = OrderCloseBy(buy_ids[buyix], sell_ids[sellix], Red);\r
261            if (!res) Print("Closing of orders "+buy_ids[buyix]+" and "+sell_ids[sellix]+" failed.");\r
262            buyix++;\r
263            sellix++;\r
264          }\r
266       }\r
267       \r
268       bid = MarketInfo(Symbol(), MODE_BID);\r
269       ask = MarketInfo(Symbol(), MODE_ASK);\r
271       Print("Closing orders the plain ole way.");\r
272       for (i = 0;i < buys_count; i++)\r
273          OrderClose(buy_ids[i], LotSize, bid, Red);\r
274       for (i = 0;i < sells_count; i++)\r
275          OrderClose(sell_ids[i], LotSize, ask, Red);\r
276       \r
277      }\r
279     \r
280     \r
281     \r
282     \r
283     \r
284     \r
285     \r
286     \r
287     \r
288     \r
289     \r
290     \r
291     \r
292     \r
293     \r
294      void placeSellOrder(){\r
295      \r
296           double bid = MarketInfo(Symbol(), MODE_BID) ; \r
297           \r
298           double sellPrice = bid - (pipstep_adjusted*Point);          \r
299           double sellSL = bid;\r
300           \r
301           \r
302           Print("Placing sell stop order at " + sellPrice + " with SL at " + sellSL);\r
303          \r
304          int  ticketshort = OrderSend(Symbol(), OP_SELLSTOP, LotSize, NormalizeDouble(sellPrice, digits),\r
305                                       Slippage, NormalizeDouble(sellSL, digits), 0, "Short Speed Train", \r
306                                       MagicNumber, MathRound(Order_Lifetime_Days * 86400) + TimeCurrent(), Red);\r
307                                       \r
308           if (ticketshort < 0) {\r
309               Print("Short OrderSend failed with error #",GetLastError()); \r
310               return;\r
311           }\r
312           \r
313           Print("Sell stop order placed with ticket " + ticketshort + " at " + sellPrice);\r
314           \r
315           shortOrderCount++;\r
316             //Sleep(1000);          \r
317             \r
318          \r
319      \r
320      }\r
321        \r
322      void placeBuyOrder(){\r
323      \r
324           double ask = MarketInfo(Symbol(), MODE_ASK) ; \r
325           \r
326           double buyPrice = ask + (pipstep_adjusted*Point);          \r
327           double buySL = ask;\r
328           \r
329           \r
330           if (Debug_Print) Print("Placing buy stop order at "+buyPrice+" with SL at "+buySL);\r
331          \r
332          int  ticketlong = OrderSend(Symbol(), OP_BUYSTOP, LotSize, NormalizeDouble(buyPrice, digits),\r
333                                       Slippage, NormalizeDouble(buySL, digits), 0, "Long Speed Train",\r
334                                       MagicNumber, MathRound(Order_Lifetime_Days * 86400) + TimeCurrent(),Blue);\r
335                                       \r
336           if (ticketlong < 0) {\r
337               Print("Long OrderSend failed with error #",GetLastError()); \r
338               return;\r
339           }\r
340           \r
341           if (Debug_Print) Print("Buy stop order placed with ticket " + ticketlong + " at " + buyPrice);\r
342           \r
343           longOrderCount++;\r
344      }\r
345       \r
346       \r
347       void placeInitBuyOrder(){\r
348      \r
349           double ask = MarketInfo(Symbol(), MODE_ASK) ; \r
350           \r
351           double buySL = ask - (pipstep_adjusted*Point);          \r
352          \r
353           \r
354           \r
355           if (Debug_Print) Print("Placing buy stop order at "+ask+" with SL at "+buySL);\r
356          \r
357          int  ticketlong = OrderSend(Symbol(), OP_BUY, LotSize, NormalizeDouble(ask, digits),\r
358                                       Slippage, NormalizeDouble(buySL, digits), 0, "Long Speed Train", \r
359                                       MagicNumber, 0, Blue);\r
360                                       \r
361           if (ticketlong < 0) {\r
362               if (Debug_Print) Print("Long OrderSend failed with error #",GetLastError()); \r
363               return;\r
364           }\r
365           \r
366           if (Debug_Print) Print("Buy stop order placed with ticket "+ticketlong+"  at "+ask);\r
367           \r
368           longOrderCount++;        \r
369      \r
370      }\r
371       \r
372       \r
373       void placeInitSellOrder(){\r
374      \r
375           double bid = MarketInfo(Symbol(), MODE_BID) ; \r
376           \r
377           double sellSL = bid + (pipstep_adjusted*Point);            \r
378           \r
379           if (Debug_Print) Print("Placing sell stop order at "+bid+" with SL at "+sellSL);\r
380          \r
381          int  ticketshort = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(bid, digits),\r
382                                       Slippage,NormalizeDouble(sellSL, digits),0,"Short Speed Train",MagicNumber,0,Red);\r
383                                       \r
384           if (ticketshort < 0) {\r
385               if (Debug_Print) Print("Short OrderSend failed with error #",GetLastError()); \r
386               return;\r
387           }\r
388           \r
389           if (Debug_Print) Print("Sell stop order placed with ticket "+ticketshort+"  at "+bid);\r
390           \r
391           shortOrderCount++;        \r
392      \r
393      }\r
394       \r
395       \r
396       void moveBuyOrderToBE(){\r
397          int lastTicket=0;\r
398           \r
399          for(int j = 0; j < OrdersTotal(); j++)\r
400         {\r
401             OrderSelect(j,SELECT_BY_POS,MODE_TRADES);\r
402            // Print("order type "+OrderType());\r
403             \r
404             if (OrderMagicNumber() == MagicNumber && OrderType() == OP_BUYSTOP || OP_BUY)\r
405                {\r
406                   int ticketId = OrderTicket() ;\r
407                   //Print("ticketId "+ticketId);\r
408                  if(OrderType() == OP_BUYSTOP && ticketId>   lastTicket) lastTicket=ticketId;  \r
409                   \r
410                  //Print("lastTicket "+lastTicket); \r
411                  if (TimeCurrent() - OrderOpenTime() > 3600 * Hours_Bring_Even)\r
412                      OrderModify(ticketId,OrderOpenPrice(),OrderOpenPrice(),0,0,Blue);\r
413                      \r
414                      }\r
415        }\r
416        \r
417        if(lastTicket >0) {             \r
418             if (Debug_Print) Print(" ----------------------- Moving long order number "+lastTicket+ " to BE at  "+OrderOpenPrice());    \r
419        \r
420             int ticketlong = OrderModify(lastTicket,OrderOpenPrice(),OrderOpenPrice(),0,0,Blue);\r
421           \r
422                                       \r
423             if (ticketlong < 0) {\r
424                    if (Debug_Print) Print("Long SL2BE order failed with error #",GetLastError()); \r
425                    return;\r
426             }\r
427               \r
428            \r
429         }           \r
430          \r
431      \r
432      }\r
433      \r
434      \r
435      \r
436          \r
437       \r
438       \r
439       \r
440       void moveSellOrderToBE(){\r
441          int lastTicket=0;\r
442       \r
443          for(int j = 0; j < OrdersTotal(); j++)\r
444         {\r
445             OrderSelect(j,SELECT_BY_POS,MODE_TRADES);\r
447            // Print("order type "+OrderType());\r
448             if (OrderMagicNumber() == MagicNumber && OrderType() == OP_SELLSTOP || OP_SELL)\r
449                {\r
450                   int ticketId = OrderTicket() ;\r
451                  // Print(" ticketId "+ticketId);    \r
452                   if( ticketId>   lastTicket && OrderType() == OP_SELLSTOP) lastTicket=ticketId; \r
453                  // Print(" lastTicket "+lastTicket);             \r
454                  if (TimeCurrent() - OrderOpenTime() > 3600 * Hours_Bring_Even)\r
455                   OrderModify(ticketId,OrderOpenPrice(),OrderOpenPrice(),0,0,Red);\r
456                   }\r
458        }\r
459        \r
460           \r
461        \r
462        \r
463        \r
464        if(lastTicket>0) {\r
465        \r
466             if (Debug_Print) Print("------------ Moving short order number "+lastTicket+ " to BE at  "+OrderOpenPrice());\r
467             int ticketshort = OrderModify(lastTicket,OrderOpenPrice(),OrderOpenPrice(),0,0,Red);          \r
468                                       \r
469             if (ticketshort < 0) {\r
470                    if (Debug_Print) Print("Short SL2BE order failed with error #",GetLastError()); \r
471                    return;\r
472             }\r
473              \r
474         }\r
475           \r
476                         \r
477          \r
478      \r
479      }\r
480       \r
481      \r
482   \r
483    \r