bleh
[mqlkit.git] / hedger.mq4
blob680f1f09e7fcd9dac2461a960af509370cbae5df
1 //+------------------------------------------------------------------+\r
2 //|                                                       hedger.mq4 |\r
3 //|                                   Copyright © 2011, Zarko Asenov |\r
4 //|                                              http://jaltoh.6x.to |\r
5 //+------------------------------------------------------------------+\r
6 #property copyright "Copyright © 2011, Zarko Asenov"\r
7 #property link      "http://jaltoh.6x.to"\r
8 \r
9 //--- input parameters\r
10 extern string    Pair1="EURUSD";\r
11 extern string    Pair2="USDCHF";\r
12 extern int       MA_Period=32;\r
13 extern double    MA_Threshold=0.0001;\r
14 extern double    Lot_Size = 0.1;\r
15 extern int       Magic_Number = 43434343;\r
16 extern double    Profit_Threshold = 5.0;\r
17 extern int       Max_Order_Pairs = 1;\r
19 double neg_threshold;\r
20 int order_pairs = 0;\r
22 bool\r
23 close_all(int magic_number)\r
24 {\r
25     bool rc = true;\r
26     \r
27     if (order_pairs < 1) return (true);\r
28            \r
29     for (int i = 0; i < OrdersTotal(); i++) {\r
30         \r
31         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);\r
32             \r
33         if (OrderSymbol() != Pair1 && OrderSymbol() != Pair2) continue;\r
34         else if (OrderMagicNumber() != magic_number) continue;\r
36         int ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, Gray);\r
37             \r
38         if (ret < 0) {\r
39            Print("Close order failed with error #", GetLastError() );\r
40            rc = false;\r
41         }\r
42         \r
43     }\r
44     \r
45     if (rc == true) order_pairs = 0;\r
46     \r
47     return (rc);\r
48 }\r
50 double\r
51 calc_profit(int magic_number)\r
52 {\r
53     double presult = 0.0;\r
54      \r
55     for (int i = 0; i < OrdersTotal(); i++) {\r
56         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);\r
57         \r
58         if (OrderSymbol() != Pair1 && OrderSymbol() != Pair2) continue;\r
59         else if (OrderMagicNumber() != magic_number) continue;\r
61         presult += OrderProfit();\r
62         \r
63     }\r
65     return (presult);   \r
66 }\r
68 bool \r
69 end_is_neigh()\r
70 {\r
71   if (TimeCurrent() - Time[0] < Period() * 60.0 * 0.75) return (false);\r
72   else return (true);\r
73 }  \r
75 //+------------------------------------------------------------------+\r
76 //| expert initialization function                                   |\r
77 //+------------------------------------------------------------------+\r
78 int init()\r
79   {\r
80 //----\r
81    neg_threshold = -1.0 * MA_Threshold;\r
82 //----\r
83    return(0);\r
84   }\r
85 //+------------------------------------------------------------------+\r
86 //| expert deinitialization function                                 |\r
87 //+------------------------------------------------------------------+\r
88 int deinit()\r
89   {\r
90 //----\r
91    \r
92 //----\r
93    return(0);\r
94   }\r
95 //+------------------------------------------------------------------+\r
96 //| expert start function                                            |\r
97 //+------------------------------------------------------------------+\r
98 int start()\r
99   {\r
100   \r
101   if ( calc_profit(Magic_Number) > Profit_Threshold) close_all(Magic_Number);\r
102   \r
103 //----\r
104    double ehl1 = iCustom(Pair1, Period(), "Ehlers ZeroLag MA Osc", MA_Period, 50, 2.0, 0, 0, Pair1, 2, 0);\r
105    double ehl1_diff = iCustom(Pair1, Period(), "Ehlers ZeroLag MA Osc", MA_Period, 50, 2.0, 0, 0, Pair1, 0, 0);\r
106    if (ehl1_diff < 0.0 && ehl1 > neg_threshold) return (0);\r
107    if (ehl1_diff > 0.0 && ehl1 < MA_Threshold) return (0);\r
108    \r
109    double ehl2 = iCustom(Pair1, Period(), "Ehlers ZeroLag MA Osc", MA_Period, 50, 2.0, 0, 0, Pair2, 2, 0);\r
110    double ehl2_diff = iCustom(Pair1, Period(), "Ehlers ZeroLag MA Osc", MA_Period, 50, 2.0, 0, 0, Pair2, 0, 0);\r
111    if (ehl2_diff < 0.0 && ehl2 > neg_threshold) return (0);\r
112    if (ehl2_diff > 0.0 && ehl2 < MA_Threshold) return (0);\r
113    \r
114    if (order_pairs() > Max_Order_Pairs) return(0);\r
116    if (end_is_neigh() == false) return(0);\r
117    \r
118    if (ehl1 < neg_threshold && ehl2 > MA_Threshold) {\r
119       OrderSend(Pair1, OP_SELL, Lot_Size, MarketInfo(Pair1, MODE_BID), 3, 0.0, 0.0, "Hedger", Magic_Number);\r
120       OrderSend(Pair2, OP_BUY, Lot_Size, MarketInfo(Pair2, MODE_ASK), 3, 0.0, 0.0, "Hedger", Magic_Number);\r
121       order_pairs++;\r
122    } else if (ehl1 > MA_Threshold && ehl2 < neg_threshold) {\r
123       OrderSend(Pair1, OP_BUY, Lot_Size, MarketInfo(Pair1, MODE_ASK), 3, 0.0, 0.0, "Hedger", Magic_Number);\r
124       OrderSend(Pair2, OP_SELL, Lot_Size, MarketInfo(Pair2, MODE_BID), 3, 0.0, 0.0, "Hedger", Magic_Number);\r
125       order_pairs++;\r
126    }\r
127    \r
128    \r
129 //----\r
130    return(0);\r
131   }\r
132 //+------------------------------------------------------------------+