bleh
[mqlkit.git] / SpeedTrainNeu_beta1.mq4
blobdd6a16f78a1338b5dd92e81a98bb10d117aaf97b
1 #property copyright "Zarko Asenov"\r
2 #property link      "jaltoh.6x.to"\r
3 \r
4 /* General functionality settings */\r
5 extern int          Slippage = 2;\r
6 extern double       LotSize = 0.3;\r
7 extern double       PipStep = 16.0; // For variable spread brokers keep it at the average guaranteed spread\r
8 extern bool         InitialBuyOrder = true;\r
9 extern int          MagicNumber =  1771611;\r
10 extern double       Close_All_Profit = 150.0;\r
11 extern bool         Clear_Stops = true;\r
12 extern double       Order_Lifetime_Days = 0.2;\r
13 extern bool         Add_Spread_to_PipStep = false; // For fixed spread brokers - be sure about this!\r
14 extern bool         Add_MinStop_to_PipStep = true;\r
15 extern double       Max_spread = 22.0;\r
16 extern double       Hours_Bring_Even = 0.0;\r
17 extern double       Multi_Coef = 1.0; // multiplies LotSize PipStep Close_All_Profit Min_Bands\r
18 extern bool         Verbose_Mode = false;\r
19 extern double       LTS_LotSize = 0.0; /* Leave 0 for no Long Term Strategy trading */\r
20 extern double       LTS_Close_All_Profit = 10.0;\r
21 extern int          Max_LTS_Positions = 1;\r
22 extern int          Grid_Base_Period = PERIOD_M5;\r
24 /* Bollinger bands */\r
25 extern int          Bands_Days = 10;\r
26 extern int          Bands_Deviations = 4;\r
27 extern double       Min_Bands = 0.017;\r
28 extern int          Num_Bands = 2;\r
30 /* Stochastic oscillator */\r
31 extern bool         Check_Stoch = true;\r
32 extern int          Stoch_K = 6;\r
33 extern int          Stoch_D = 4;\r
34 extern int          Stoch_Slow = 3;\r
35 extern int          Stoch_num_pos = 2;\r
36 extern double       Stoch_border = 40.0;\r
37 extern int          Stochastic_Period = PERIOD_H4;\r
39 /* Average Directional Movement Index */\r
40 extern bool         Check_ADX = true;\r
41 extern int          ADX_positions_to_check = 2;\r
42 extern int          ADX_period_in_days = 4;\r
43 extern double       ADX_min = 37.0;\r
45 /* Average True Range */\r
46 extern double       ATR_Floor = 0.0055;\r
47 extern int          ATR_period_in_days = 35;\r
48 extern int          ATR_positions_to_check = 3;\r
49 extern int          ATR_Period = PERIOD_H4;\r
51 /* Globals variables */\r
52 int longOrderCount = 0;\r
53 int shortOrderCount = 0;\r
54 double startPrice = 0.0;\r
55 int digits = 5;\r
56 bool initOrdersDone = false;\r
57 double spread = 0.0;\r
58 double pipstep_adjusted = 0.0;\r
59 double current_adx = 0.0;\r
60 double neg_adx_min = 0.0;\r
61 double neg_stoch_border = 0.0;\r
62 double current_atr = 0.0;\r
63 int order_lifetime = 0;\r
64 double time_bring_even = 0.0;\r
65 double bandwidth = 0.0;\r
66 double adjustedLotSize = 0.0;\r
67 double adjustedPipStep = 0.0;\r
68 double adjustedClose_All_Profit = 0.0;\r
69 double adjustedMin_Bands = 0.0;\r
70 double tick_value = 0.0;\r
71 double total_spread_loss = 0.0;\r
72 int prev_signal = 0;\r
73 int lts_magic_number = -1;\r
74 int lts_long_positions = 0;\r
75 int lts_short_positions = 0;\r
76 double current_stoch_k = 0.0;\r
77 double current_stoch_d = 0.0;\r
79 double startPrice_ask = 0.0;\r
80 double startPrice_bid = 0.0;\r
81 double close_ask_diff = 0.0;\r
82 double close_bid_diff = 0.0;\r
85 #define SIG_NO_TREND 0\r
86 #define SIG_IN_TREND 1\r
87 #define SIG_GO_BUY 2\r
88 #define SIG_GO_SELL 3\r
91 int init()\r
92 {\r
93     if (Stoch_border > 100.0) Stoch_border = 100.0;\r
94     \r
95     neg_stoch_border = 100.0 - Stoch_border;\r
96     neg_adx_min = -1.0 * ADX_min;\r
97     \r
98     order_lifetime = MathRound(Order_Lifetime_Days * 86400);\r
99     time_bring_even = 3600 * Hours_Bring_Even;\r
100     lts_magic_number = MagicNumber + 1;\r
102     adjustedLotSize = LotSize * Multi_Coef;\r
103     adjustedPipStep = PipStep;\r
104     adjustedClose_All_Profit = Close_All_Profit * Multi_Coef;\r
105     adjustedMin_Bands = Min_Bands;\r
106     \r
107     tick_value = MarketInfo(Symbol(), MODE_TICKVALUE);\r
108     digits = MarketInfo(Symbol(), MODE_DIGITS);\r
109     \r
110     return(0);\r
113 double get_minstop()\r
115     return( MarketInfo(Symbol(), MODE_STOPLEVEL) );\r
119 double\r
120 get_adx(int index)\r
122     double ADX1, ADX2;\r
124     current_adx = iADX(NULL, PERIOD_D1, ADX_period_in_days, PRICE_CLOSE, MODE_MAIN, index);\r
125     ADX1 = iADX(NULL, PERIOD_D1, ADX_period_in_days, PRICE_CLOSE, MODE_PLUSDI, index);\r
126     ADX2 = iADX(NULL, PERIOD_D1, ADX_period_in_days, PRICE_CLOSE, MODE_MINUSDI, index);\r
128     if(ADX1 >= ADX2)\r
129         return(current_adx);\r
130     else\r
131         return(-1.0 * current_adx);\r
134 bool\r
135 adx_is_sell(int num_pos)\r
137     if (Check_ADX == false) return (true);\r
139     \r
140     for (int i = 0; i < num_pos; i++) {\r
141         if (get_adx(i) > neg_adx_min) return (false);\r
142     }\r
144     return (true);\r
147 bool\r
148 adx_is_buy(int num_pos)\r
150     if (Check_ADX == false) return (true);\r
152     for (int i = 0; i < num_pos; i++) {\r
153         current_adx = get_adx(i);\r
154         if (current_adx < ADX_min) return (false);\r
155     }\r
157     return (true);\r
160 bool\r
161 stoch_is_buy(int num_pos)\r
163     if (Check_Stoch == false) return (true);\r
164     \r
165     for (int i = 0; i < num_pos; i++) {\r
166           current_stoch_k = iStochastic(NULL, Stochastic_Period, Stoch_K, Stoch_D, Stoch_Slow, MODE_EMA, 0 /*LOWHIGH*/, MODE_MAIN, i);\r
167           current_stoch_d = iStochastic(NULL, Stochastic_Period, Stoch_K, Stoch_D, Stoch_Slow, MODE_EMA, 0 /*LOWHIGH*/, MODE_SIGNAL, i);\r
168           \r
169           if (current_stoch_k > Stoch_border) return(false);\r
170 //          if (current_stoch_k < current_stoch_d) return (false);\r
171     }\r
172     \r
173     return(true);\r
175      \r
176 bool\r
177 stoch_is_sell(int num_pos)\r
179     if (Check_Stoch == false) return (true);\r
180     \r
181     for (int i = 0; i < num_pos; i++) {\r
182           current_stoch_k = iStochastic(NULL, Stochastic_Period, Stoch_K, Stoch_D, Stoch_Slow, MODE_EMA, 0 /*LOWHIGH*/, MODE_MAIN, i);\r
183           current_stoch_d = iStochastic(NULL, Stochastic_Period, Stoch_K, Stoch_D, Stoch_Slow, MODE_EMA, 0 /*LOWHIGH*/, MODE_SIGNAL, i);\r
184           \r
185           if (current_stoch_k < neg_stoch_border) return(false);\r
186 //          if (current_stoch_k > current_stoch_d) return (false);\r
187     }\r
188     \r
189     return(true);\r
192 bool\r
193 atr_is_go(int num_pos)\r
195     for (int i = 0; i < num_pos; i++) {\r
196         current_atr = iATR(NULL, ATR_Period, ATR_period_in_days, i);\r
197         if (current_atr < ATR_Floor) return (false);\r
198     }\r
199         \r
200    return (true);\r
203 double\r
204 calc_profit()\r
206     double presult = 0.0;\r
207     total_spread_loss = 0.0;\r
208     tick_value = MarketInfo(Symbol(), MODE_TICKVALUE);\r
209     \r
210     for (int i = 0; i < OrdersTotal(); i++) {\r
211         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);\r
212         \r
213         if ((OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) && \r
214           OrderType() != OP_BUY && OrderType() != OP_SELL) continue;\r
216         double spread_loss = tick_value * OrderLots() * spread;\r
217         presult += (OrderProfit() - spread_loss);\r
218         total_spread_loss += spread_loss;\r
219     }\r
221     return (presult);   \r
224 double\r
225 calc_profit_lts()\r
227     if (LTS_LotSize == 0 || lts_magic_number == -1 || \r
228           lts_long_positions + lts_short_positions < 1) return;\r
229      \r
230     double presult = 0.0;\r
231     total_spread_loss = 0.0;\r
232     tick_value = MarketInfo(Symbol(), MODE_TICKVALUE);\r
233     \r
234     for (int i = 0; i < OrdersTotal(); i++) {\r
235         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);\r
236         \r
237         if ((OrderSymbol() != Symbol() || OrderMagicNumber() != lts_magic_number) && \r
238           OrderType() != OP_BUY && OrderType() != OP_SELL) continue;\r
240         double spread_loss = tick_value * OrderLots() * spread;\r
241         presult += (OrderProfit() - spread_loss);\r
242         total_spread_loss += spread_loss;\r
243     }\r
245     return (presult);   \r
248 double\r
249 getBandwidth(int pos)\r
251     bandwidth = iBands(NULL, Grid_Base_Period, Bands_Days, Bands_Deviations, 0, PRICE_CLOSE, MODE_UPPER, pos) - \r
252           iBands(NULL, Grid_Base_Period, Bands_Days, Bands_Deviations, 0, PRICE_CLOSE, MODE_LOWER, pos);\r
253    \r
254     return (bandwidth);\r
257 bool\r
258 inBands()\r
260     for (int i = 0; i < Num_Bands; i++)\r
261         if (getBandwidth(i) < adjustedMin_Bands) \r
262            return (false);\r
263   \r
264     return (true);\r
267 bool\r
268 in_trend()\r
270      return ( atr_is_go(ATR_positions_to_check) && inBands() );\r
273 bool\r
274 go_buy()\r
276      return ( adx_is_buy(ADX_positions_to_check) && stoch_is_buy(Stoch_num_pos) );\r
279 bool\r
280 go_sell()\r
282      return ( adx_is_sell(ADX_positions_to_check) && stoch_is_sell(Stoch_num_pos) );\r
285 string current_signal_str = "";\r
287 int \r
288 get_current_signal() {\r
290      bool in_trend = in_trend();\r
291           \r
292      if ( in_trend && go_buy() ) {\r
293           if (Verbose_Mode) Print("Current signal is buy!");\r
294           current_signal_str = "BUY";\r
295           return(SIG_GO_BUY);\r
296      } else if ( in_trend && go_sell() ) {\r
297           if (Verbose_Mode) Print("Current signal is sell!");\r
298           current_signal_str = "SELL";\r
299           return(SIG_GO_SELL);\r
300      } else if ( in_trend == true) {\r
301           if (Verbose_Mode) Print("Current signal is we are in a trend!");\r
302           current_signal_str = "TREND";\r
303           return(SIG_IN_TREND);\r
304      } else {\r
305          if (Verbose_Mode) Print("Current signal is range!");\r
306           current_signal_str = "RANGE";\r
307          return(SIG_NO_TREND);\r
308      }\r
311 void\r
312 updatePriceDiffs()\r
314    close_ask_diff = iClose(NULL, Grid_Base_Period, 0) - startPrice_ask;\r
315    close_bid_diff = iClose(NULL, Grid_Base_Period, 0) - startPrice_bid;\r
318 void\r
319 updateStartPrice_ask()\r
321    startPrice_ask = MarketInfo(Symbol(), MODE_ASK);\r
322    updatePriceDiffs();\r
323    if (true) Print("New startPrice ask: " + startPrice_ask + " close_ask_diff: " + close_ask_diff+ " " + current_signal_str);\r
326 void\r
327 updateStartPrice_bid()\r
329    startPrice_bid = MarketInfo(Symbol(), MODE_BID);\r
330    updatePriceDiffs();\r
331    if (true) Print("New startPrice bid: " + startPrice_bid + " close_bid_diff: " + close_bid_diff + " " + current_signal_str);\r
334 int \r
335 start()\r
337     if(startPrice_ask == 0.0) updateStartPrice_ask();\r
338     if(startPrice_bid == 0.0) updateStartPrice_bid();\r
340     pipstep_adjusted = adjustedPipStep;\r
341       \r
342     if (Add_Spread_to_PipStep)\r
343         pipstep_adjusted += spread / MarketInfo(Symbol(), MODE_POINT);\r
345     if (Add_MinStop_to_PipStep)\r
346         pipstep_adjusted += get_minstop();\r
348     \r
349     if ( !initOrdersDone && in_trend() ) {\r
350            \r
351         if (go_buy()) {\r
352         \r
353             placeBuyOrder();\r
354             placeInitBuyOrder();\r
355             \r
356         } else if (go_sell()) {\r
357         \r
358             placeSellOrder();\r
359             placeInitSellOrder();\r
360             \r
361         }\r
362         \r
363         initOrdersDone = true;\r
364     }\r
365     \r
366     RefreshRates();\r
367     \r
368     int current_signal = get_current_signal();\r
369     \r
370     // Do buys\r
371     if(MarketInfo(Symbol(), MODE_ASK) > startPrice_ask + pipstep_adjusted * Point) {\r
372     \r
373         updateStartPrice_ask();\r
374           \r
375         // need to set the sl to BE of last order\r
376         moveSellOrderToBE();\r
377         \r
378         moveHitBuyOrdersToBE();\r
379         \r
380         // place buy stops\r
381         if ( current_signal == SIG_GO_BUY ) {\r
382           if (true) \r
383                Print("Go buy, placing sell order.");\r
384           placeBuyOrder();\r
385         }          \r
386     \r
387     // Do sells    \r
388     } else if (MarketInfo(Symbol(), MODE_BID) < startPrice_bid - pipstep_adjusted * Point) {\r
389     \r
390         updateStartPrice_bid();\r
391         \r
392         // need to set the sl to BE of last order\r
393         moveBuyOrderToBE();  \r
395         moveHitSellOrdersToBE();\r
396         \r
397         // place sell stops\r
398         if ( current_signal == SIG_GO_SELL ) {\r
399           if (true) \r
400                Print("Go sell, placing sell order.");\r
401           placeSellOrder();\r
402         }          \r
403           \r
404     }\r
406     /* Long Term Strategy */\r
407     if (LTS_LotSize != 0.0) {\r
408         if (calc_profit_lts() > LTS_Close_All_Profit) close_all_lts();\r
409         else if (current_signal == SIG_GO_SELL && prev_signal != SIG_GO_SELL) place_lts_sell();\r
410         else if (current_signal == SIG_GO_BUY && prev_signal != SIG_GO_BUY) place_lts_buy();\r
411         else if (current_signal == SIG_GO_BUY && lts_short_positions > 0) close_all_lts();\r
412         else if (current_signal == SIG_GO_SELL && lts_long_positions > 0) close_all_lts();\r
413         prev_signal = current_signal;\r
414     }\r
416     spread = Point * MathAbs(MarketInfo(Symbol(), MODE_SPREAD));\r
417     double current_profit = calc_profit();\r
419     if (Verbose_Mode) {\r
420         Comment(\r
421             "SpeedTrain Forte\nby DrZed 2011\n" +\r
422             "Symbol: " + Symbol() + "\n" +\r
423             "Spread: " + spread + "\n" +\r
424             "Bandwidth: " + bandwidth + "\n" +\r
425             "ADX difference: " + current_adx + "\n" +\r
426             "Stoch base: " + current_stoch_k + "\n" +\r
427             "Stoch signal: " + current_stoch_d + "\n" +\r
428             "ATR value: " + current_atr + "\n" +\r
429             "Pipstep adjusted: " + pipstep_adjusted + "\n" +\r
430             "Last orders price: ask: " + startPrice_ask + ", bid: " + startPrice_bid + "\n" +\r
431             "Current close M15 price: ask: " + MarketInfo(Symbol(), MODE_ASK) + ", bid: " + MarketInfo(Symbol(), MODE_BID) + "\n" +\r
432             "Current signal " + current_signal_str + "\n" +\r
433             "Profit: " + current_profit + " USD\n" +\r
434             "Total spread loss: " + total_spread_loss + " USD\n"\r
435             );      \r
436     }\r
437    \r
438     if (current_profit > adjustedClose_All_Profit && spread < Max_spread) {\r
439     \r
440         if (Verbose_Mode) \r
441             Print("Closing orders on profit " + current_profit + \r
442                 " total spread loss: " + total_spread_loss + \r
443                 " spread: " + spread + " pips.");\r
444             \r
445         for (int i = 0; i < OrdersTotal(); i++) {\r
446         \r
447             OrderSelect(i, SELECT_BY_POS, MODE_TRADES);\r
448             \r
449             if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;\r
450          \r
451             switch ( OrderType() ) {\r
452             \r
453                case OP_BUY:\r
454                     OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Blue);\r
455                     break;\r
456                     \r
457                case OP_SELL:\r
458                     OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Red);\r
459                     break;\r
460                     \r
461                case OP_SELLSTOP: \r
462                case OP_BUYSTOP:\r
463                     OrderDelete( OrderTicket() );\r
464                     break;\r
465                     \r
466                default:\r
467                     if (Verbose_Mode) \r
468                          Print("Uknown order type " + OrderType() + " of order #" + OrderTicket() );\r
469             }\r
470         }\r
471         \r
472         shortOrderCount = 0;\r
473         longOrderCount = 0;\r
474     }\r
475       \r
478 void\r
479 place_lts_buy()\r
481     if (LTS_LotSize == 0.0 || lts_magic_number == -1 || \r
482           lts_long_positions + lts_short_positions > Max_LTS_Positions) {\r
483         if (Verbose_Mode) Print("Long Term trading Stradegy disabled!");\r
484         return;\r
485     }\r
486     \r
487     double ask = MarketInfo(Symbol(), MODE_ASK) ; \r
488           \r
489     if (Verbose_Mode) Print("LTS Placing buy order at " + ask);\r
490          \r
491     int  ticketlong = OrderSend(\r
492                                 Symbol(),\r
493                                 OP_BUY, \r
494                                 LTS_LotSize,\r
495                                 NormalizeDouble(ask, digits),\r
496                                 Slippage, \r
497                                 0,\r
498                                 0, \r
499                                 "Long Speed Train LTS", \r
500                                 lts_magic_number,\r
501                                 0, \r
502                                 Yellow);\r
504     if (ticketlong < 0) {\r
505         if (Verbose_Mode) \r
506            Print("LTS Long OrderSend failed with error #", GetLastError()); \r
507         return;\r
508     }\r
509           \r
510     if (Verbose_Mode) Print("LTS Buy order placed with ticket " + ticketlong + "  at " + ask);\r
511           \r
512     lts_long_positions++;\r
515 void\r
516 place_lts_sell()\r
518     if (LTS_LotSize == 0.0 || lts_magic_number == -1 || \r
519           lts_long_positions + lts_short_positions > Max_LTS_Positions) {\r
520         if (Verbose_Mode) Print("Long Term trading Stradegy disabled!");\r
521         return;\r
522     }\r
524     double bid = MarketInfo(Symbol(), MODE_BID); \r
525     double sellSL = bid + pipstep_adjusted * Point;\r
526           \r
527     if (Verbose_Mode) Print("Placing LTS sell order at " + bid);\r
528          \r
529     int  ticketshort = OrderSend(\r
530                                  Symbol(), \r
531                                  OP_SELL, \r
532                                  LTS_LotSize,\r
533                                  NormalizeDouble(bid, digits), \r
534                                  Slippage, \r
535                                  0, \r
536                                  0, \r
537                                  "Short Speed Train LTS", \r
538                                  lts_magic_number, \r
539                                  0, \r
540                                  Red);\r
541                                       \r
542     if (ticketshort < 0) {\r
543         if (Verbose_Mode) Print("Short OrderSend failed with error #", GetLastError());\r
544           \r
545         return;\r
546     }\r
547           \r
548     if (Verbose_Mode) Print("Sell order placed with ticket " + ticketshort + "  at " + bid);\r
549           \r
550     lts_short_positions++;\r
553 void\r
554 close_all_lts()\r
556         for (int i = 0; i < OrdersTotal(); i++) {\r
557         \r
558             OrderSelect(i, SELECT_BY_POS, MODE_TRADES);\r
559             \r
560             if (OrderSymbol() != Symbol() || OrderMagicNumber() != lts_magic_number) continue;\r
561          \r
562             switch ( OrderType() ) {\r
563             \r
564                case OP_BUY:\r
565                     OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Blue);\r
566                     break;\r
567                     \r
568                case OP_SELL:\r
569                     OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Red);\r
570                     break;\r
571                     \r
572                case OP_SELLSTOP: \r
573                case OP_BUYSTOP:\r
574                     OrderDelete( OrderTicket() );\r
575                     break;\r
576                     \r
577                default:\r
578                     if (Verbose_Mode) Print("Uknown LTS order type " + OrderType() + " of order #" + OrderTicket() );\r
579             }\r
580         }\r
581     \r
582     lts_short_positions = 0;\r
583     lts_long_positions = 0;\r
586 void \r
587 placeBuyOrder()\r
589     double ask = MarketInfo(Symbol(), MODE_ASK) ; \r
590           \r
591     double buyPrice = ask + pipstep_adjusted * Point;\r
592     double buySL = ask;\r
593           \r
594     if (Verbose_Mode) \r
595         Print("Placing buy stop order at " + buyPrice+" with SL at " + buySL);\r
596          \r
597     int ticketlong = OrderSend(\r
598                                Symbol(), \r
599                                OP_BUYSTOP, \r
600                                adjustedLotSize, \r
601                                NormalizeDouble(buyPrice, digits),\r
602                                Slippage, \r
603                                NormalizeDouble(buySL, digits), \r
604                                0.0, \r
605                                "Long Speed Train",\r
606                                MagicNumber, \r
607                                order_lifetime + TimeCurrent(), \r
608                                Blue);\r
609                                       \r
610     if (ticketlong < 0) {\r
611         Print("Long OrderSend failed with error #", GetLastError()); \r
612         return;\r
613     }\r
614           \r
615     if (Verbose_Mode) \r
616        Print("Buy stop order placed with ticket " + ticketlong + " at " + buyPrice);\r
617           \r
618     longOrderCount++;\r
620     \r
621 void \r
622 placeSellOrder()\r
624     double bid = MarketInfo(Symbol(), MODE_BID) ; \r
625           \r
626     double sellPrice = bid - pipstep_adjusted * Point;\r
627     double sellSL = bid;\r
628           \r
629           \r
630     if (Verbose_Mode) \r
631          Print("Placing sell stop order at " + sellPrice + " with SL at " + sellSL);\r
632          \r
633     int  ticketshort = OrderSend(\r
634                                  Symbol(), \r
635                                  OP_SELLSTOP, \r
636                                  adjustedLotSize, \r
637                                  NormalizeDouble(sellPrice, digits),\r
638                                  Slippage, \r
639                                  NormalizeDouble(sellSL, digits), \r
640                                  0.0, \r
641                                  "Short Speed Train", \r
642                                  MagicNumber, \r
643                                  order_lifetime + TimeCurrent(), \r
644                                  Red);\r
645                                       \r
646     if (ticketshort < 0) {\r
647         Print("Short OrderSend failed with error #", GetLastError()); \r
648         return;\r
649     }\r
650           \r
651     if (Verbose_Mode) \r
652          Print("Sell stop order placed with ticket " + ticketshort + " at " + sellPrice);\r
653           \r
654     shortOrderCount++;\r
656       \r
657 void \r
658 placeInitBuyOrder()\r
660     double ask = MarketInfo(Symbol(), MODE_ASK) ; \r
661           \r
662     double buySL = ask - pipstep_adjusted * Point;\r
664     if (Verbose_Mode) \r
665          Print("Placing buy order at " + ask + " with SL at " + buySL);\r
666          \r
667     int  ticketlong = OrderSend(\r
668                                 Symbol(),\r
669                                 OP_BUY, \r
670                                 adjustedLotSize, \r
671                                 NormalizeDouble(ask, digits),\r
672                                 Slippage, \r
673                                 NormalizeDouble(buySL, digits), \r
674                                 0, \r
675                                 "Long Speed Train", \r
676                                 MagicNumber, \r
677                                 0, \r
678                                 Blue);\r
679                                       \r
680     if (ticketlong < 0) {\r
681         if (Verbose_Mode) \r
682            Print("Long OrderSend failed with error #", GetLastError()); \r
683         return;\r
684     }\r
685           \r
686     if (Verbose_Mode) \r
687           Print("Buy order placed with ticket " + ticketlong + "  at " + ask);\r
688           \r
689     longOrderCount++;        \r
691       \r
692       \r
693 void \r
694 placeInitSellOrder()\r
696      \r
697     double bid = MarketInfo(Symbol(), MODE_BID); \r
698     double sellSL = bid + pipstep_adjusted * Point;\r
699           \r
700     if (Verbose_Mode) \r
701         Print("Placing sell order at "+bid+" with SL at "+sellSL);\r
702          \r
703     int  ticketshort = OrderSend(\r
704                                  Symbol(), \r
705                                  OP_SELL, \r
706                                  adjustedLotSize, \r
707                                  NormalizeDouble(bid, digits), \r
708                                  Slippage, \r
709                                  NormalizeDouble(sellSL, digits), \r
710                                  0, \r
711                                  "Short Speed Train", \r
712                                  MagicNumber, \r
713                                  0, \r
714                                  Red);\r
715                                       \r
716     if (ticketshort < 0) {\r
717         if (Verbose_Mode) \r
718           Print("Short OrderSend failed with error #", GetLastError());\r
719           \r
720         return;\r
721     }\r
722           \r
723     if (Verbose_Mode) \r
724        Print("Sell order placed with ticket " + ticketshort + "  at " + bid);\r
725           \r
726     shortOrderCount++;        \r
729 void \r
730 moveHitBuyOrdersToBE()\r
732     for(int j = 0; j < OrdersTotal(); j++)\r
733     {\r
734         OrderSelect(j, SELECT_BY_POS, MODE_TRADES);\r
735             \r
736         if (OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY &&\r
737             TimeCurrent() - OrderOpenTime() > time_bring_even)\r
738             \r
739                 OrderModify(\r
740                          OrderTicket(),                                \r
741                          OrderOpenPrice(), \r
742                          OrderOpenPrice(), \r
743                          OrderTakeProfit(), \r
744                          OrderExpiration(), \r
745                          Blue);\r
747     }\r
749       \r
750 void \r
751 moveHitSellOrdersToBE()\r
753     for(int j = 0; j < OrdersTotal(); j++)\r
754     {\r
755         OrderSelect(j, SELECT_BY_POS, MODE_TRADES);\r
756             \r
757         if (OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL &&\r
758             TimeCurrent() - OrderOpenTime() > time_bring_even)\r
760                 OrderModify(\r
761                          OrderTicket(),                                \r
762                          OrderOpenPrice(), \r
763                          OrderOpenPrice(), \r
764                          OrderTakeProfit(), \r
765                          OrderExpiration(), \r
766                          Red);   \r
768     }\r
771 void \r
772 moveBuyOrderToBE()\r
774         int lastTicket = 0;\r
775           \r
776         for(int j = 0; j < OrdersTotal(); j++)\r
777         {\r
778             OrderSelect(j, SELECT_BY_POS, MODE_TRADES);\r
779             \r
780             if (OrderMagicNumber() == MagicNumber && OrderType() == OP_BUYSTOP)\r
781             {\r
782                int ticketId = OrderTicket() ;\r
783                if (ticketId > lastTicket) lastTicket = ticketId;\r
784            }\r
785        }\r
786        \r
787        if(lastTicket > 0) {\r
788        \r
789             OrderSelect(lastTicket, SELECT_BY_TICKET, MODE_TRADES);\r
790             \r
791             if (Verbose_Mode) \r
792                Print("Moving long order number " + lastTicket + " to BE at " + OrderOpenPrice() );\r
793        \r
794             int ticketlong = OrderModify(\r
795                                         lastTicket, \r
796                                         OrderOpenPrice(), \r
797                                         OrderOpenPrice(), \r
798                                         OrderTakeProfit(), \r
799                                         OrderExpiration(), \r
800                                         Blue);\r
801           \r
802                                       \r
803             if (ticketlong < 0 && Verbose_Mode) \r
804                 Print("Long SL2BE order failed with error #", GetLastError());\r
805                  \r
806        }           \r
808       \r
809 void moveSellOrderToBE()\r
811      int lastTicket=0;\r
812       \r
813      for(int j = 0; j < OrdersTotal(); j++) {\r
814           OrderSelect(j, SELECT_BY_POS, MODE_TRADES);\r
816           if (OrderMagicNumber() == MagicNumber && OrderType() == OP_SELLSTOP)\r
817           {\r
818                int ticketId = OrderTicket();\r
819                if(ticketId > lastTicket) lastTicket = ticketId;\r
820           }\r
822      }\r
823        \r
824      if(lastTicket > 0) {\r
825           OrderSelect(lastTicket, SELECT_BY_TICKET, MODE_TRADES);\r
826        \r
827           if (Verbose_Mode) \r
828               Print("Moving short order number " + lastTicket+ " to BE at " + OrderOpenPrice());\r
829                \r
830           int ticketshort = OrderModify(\r
831                                         lastTicket, \r
832                                         OrderOpenPrice(), \r
833                                         OrderOpenPrice(), \r
834                                         OrderTakeProfit(), \r
835                                         OrderExpiration(), \r
836                                         Red);\r
837                                       \r
838           if (ticketshort < 0)\r
839                  if (Verbose_Mode) Print("Short SL2BE order failed with error #",GetLastError()); \r
840              \r
841      }\r
842      \r