Мартингейл в торговле на Форекс

Метод мартингейла в торговле на Форекс в различных своих вариациях всегда привлекал, привлекает и будет привлекать в будущем своей внушающей ожидаемой доходностью. Метод первоначально предназначался для игры в казино. Мартингейл основан на принципе удвоения ставки в случае проигрыша. При выигрыше ставка возвращается к первоначальному значению. Теоретически мартингейл – это беспроигрышный метод. Действительно, при увеличении числа игр вероятность хотя бы одного выигрыша растет. Шансы выиграть или проиграть в одной игре равны и составляют по 50%.

martingale-1108096

В то же время, мартингейл подразумевает наличие у игрока определенной крупной суммы денег, поскольку каждый следующий проигрыш требует средства для удвоения ставки. Например, первая ставка 1 доллар. В случае серии проигрышей размер последующих ставок составит: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, … долларов. Таким образом, серия из 10 подряд следующих проигрышей потребует наличия у игрока суммы в 1+2+4+8+16+32+64+128+256+512+1024 = 2047 долларов. В случае выигрыша на 11 ходу игрок в рулетку получит в качестве выигрыша удвоенную ставку, т.е. 2048 долларов, выиграв фактически всего 1 доллар рискуя при этом суммой в 2047 долларов. Как вы думаете, стоил ли этот результат такого риска?

loading-3871678 Загрузка …

Казалось бы, мартингейл это беспроигрышный метод, при котором рискуя большой суммой, всегда можно “гарантированно” получить маленький выигрыш. Размер выигрыша независимо от порядкового номера игры в серии всегда определяется размером первоначальной ставки.

Ну, что-то мы все про казино… Применительно к торговле на рынке Форекс классический метод мартингейла подразумевает удвоение лота каждой последующей сделки в случае убыточной предыдущей сделки. В случае закрытия прибыльной сделки размер лота становиться равным исходному. Например, мы открыли позицию на покупку (BUY) с объемом лота 0.01. В случае закрытия этой сделки с убытком мы увеличим лот следующей сделки в два раза, т.е. следующую позицию открываем уже лотом 0.02. Если опять убыток, то следующий ордер уже открываем с лотом 0.04, следующий – 0.08, затем – 0.16 и т.д. до закрытия профитного (прибыльного) ордера. После этого первая сделка следующей серии опять открывается с размером лота 0.01.

А вот о чем говорили по поводу метода мартингейла на телеканале РБК:

И еще доводы (весьма, кстати, неконкретные) против метода мартингейла. Правда, автор говорит, что комбинированные торговые системы показывают неплохие результаты:

Действительно, метод мартингейла может быть неплохим подспорьем, но только, как говорится, в умелых руках. Но, впрочем, об этом чуть позже, а сейчас давайте посмотрим на советник, который мы написали специально для этого поста:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//+------------------------------------------------------------------+
//| Martingale.mq4 |
//| Copyright © 2011, MoneyInNetwork.ru |
//| http://moneyinnetwork.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MoneyInNetwork.ru"
#property link "http://moneyinnetwork.ru"
extern string s1 = "Объем лота для первой сделки серии";
extern double Lot = 0.01;
extern string s2 = "Уровень стоп-лосса, в пунктах";
extern double stoploss = 21;
extern string s3 = "Уровень тейк-профита, в пунктах";
extern double takeprofit = 84;
extern string s4 = "Уникальная метка для ордеров, открываемых только этим советником";
extern double MagicNumber = 600;
extern string s5 = "Максимальное отклонение от запрошенной цены, в пунктах";
extern double slip = 3;
extern string s6 = "Период скользящей средней, в барах (количество свечей для расчета средней)";
extern int per = 55;
 
int init()
{ return(0);
}
 
int deinit()
{ return(0);
}
 
int start()
{ //инициализация параметров bool flag = false; int ticket = 0; double lots = Lot;
  //проверяем наличие торгового сигнала int signal1 = alert1(); //ищем среди всех открытых ордеров открытый советником ордер  for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- ) { //проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником. //ВНИМАНИЕ! MagicNumber - должен быть свой для каждого советника! if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { flag = true; //значение флага наличия ордера - ордер открыт break; //закончим поиск } } //ордер открыт и пришел новый торговый сигнал if ( flag && signal1!=-1 ) { //проверяем тип ордера (BUY или SELL) и закрываем его по соответствующей цене if ( OrderType() == OP_BUY && signal1==OP_SELL ) { //если ордер BUY, то закрываем его по цене Bid if (OrderClose(OrderTicket(), OrderLots(), Bid, slip, Green) ) //если сделка закрыта, то разрешаем советнику опять открывать сделки по торговому сигналу на следующем шаге flag = false; } if ( OrderType() == OP_SELL && signal1==OP_BUY ) { //если ордер SELL, то закрываем его по цене Ask if (OrderClose(OrderTicket(), OrderLots(), Ask, slip, Red) ) //если сделка закрыта, то разрешаем советнику опять открывать сделки по торговому сигналу на следующем шаге flag = false; } } //нет открытых ордеров if ( !flag ) { //ищем в истории закрытых ордеров последний закрытый советником ордер  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) { if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { if ( OrderProfit()>=0 ) lots = Lot; //последний закрытый советником ордер был прибыльным или безубыточным, значит, следующий ордер открывает с начальным лотом else lots = 2*OrderLots(); //последний закрытый советником ордер был убыточным, значит следующий ордер открываем удвоенным лотом break; //прекращаем поиск } } //сигнал на продажу - продаем if ( signal1 == OP_SELL ) { ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(lots,2), NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red); Sleep (1000); //задержка в одну секунду для обрабатки запроса торговым сервером брокера return (0); } //сигнал на покупку - покупаем if ( signal1 == OP_BUY ) { ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(lots,2), NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green); Sleep (1000); //задержка в одну секунду для обрабатки запроса торговым сервером брокера return (0); } } return (0); }
 
int alert1() { int signal=-1; //нет торгового сигнала //получение параметра от индикатора скользящей средней double ma1 = iMA(Symbol(),Period(), per, 0, 0, 0, 1); //скользящая средняя пробита ценой снизу вверх - покупаем if ( iOpen(Symbol(), Period(), 1)ma1 ) signal = OP_BUY; //скользящая средняя пробита ценой сверху вниз - продаем if ( iOpen(Symbol(), Period(), 1)>ma1 && iClose(Symbol(), Period(), 1)= 0; trade-- ) { if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { { if ( !flag ) { lasttype = OrderType(); //запоминаем тип последнего открытого ордера (направление торговли всей серии) lastlot = OrderLots(); //запоминаем объем лотов последнего открытого ордера lastprice = OrderOpenPrice();//запоминаем цену открытия последнего открытого ордера flag = true; //запомнили параметры последнего открытого ордера, дальше вычисляем только количество ордеров серии } numtrades++; //увеличиваем число открытых ордеров серии } } }
  //получаем торговый сигнал от индикатора int signal1 = alert1(); //не предпринимаем никаких действий, если превышен лимит числа открытых ордеров в одной серии if ( numtrades>=maxtrades ) return (0); //если нет открытых ордеров, то открываем первый ордер серии по торговому сигналу if ( numtrades==0 ) { //продаем if ( signal1==OP_SELL ) { ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(Lot,2), NormalizeDouble(Bid, Digits), slip, 0, NormalizeDouble(Bid-takeprofit*Point, Digits), "Sell", MagicNumber, 0, Red); Sleep(1000); //задержка в 1 секунду для отработки запроса торговым сервером брокера return (0); } //покупаем if ( signal1==OP_BUY ) { ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(Lot,2), NormalizeDouble(Ask, Digits), slip, 0, NormalizeDouble(Ask+takeprofit*Point, Digits), "Buy", MagicNumber, 0, Green); Sleep(1000); //задержка в 1 секунду для отработки запроса торговым сервером брокера return (0); } return (0); } //открыт один или серия ордеров одного типа (BUY или SELL) и цена прошла против направления серии steppips пунктов if ( (lasttype==OP_SELL && Bid-lastprice>=steppips*Point) || (lasttype==OP_BUY && lastprice-Ask>=steppips*Point) ) { //открываем еще ордер на продажу большим лотом if (lasttype==OP_SELL) { ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(Lot * MathPow(Klots, numtrades), 2), NormalizeDouble(Bid, Digits), slip, 0, 0, "Sell", MagicNumber, 0, Red); Sleep(1000); //задержка в 1 секунду для отработки запроса торговым сервером брокера } //открываем еще ордер на покупку большим лотом if (lasttype==OP_BUY) { ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(Lot * MathPow(Klots, numtrades), 2), NormalizeDouble(Ask, Digits), slip, 0, 0, "Buy", MagicNumber, 0, Green); Sleep(1000); //задержка в 1 секунду для отработки запроса торговым сервером брокера } //вычисляем среднюю цену открытия серии for ( trade = OrdersTotal() - 1; trade >= 0; trade-- ) { if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) ) { if ( (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { alllots+=OrderLots(); sum+=OrderLots()*OrderOpenPrice(); } } } //усредняемся, путем расчета средней цены double averageprice = NormalizeDouble(sum/alllots, Digits); //модифицируем все ордера серии путем перемещения одного и того же тейк-профита для каждого открытого ордера for ( trade = OrdersTotal() - 1; trade >= 0; trade-- ) { if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { //тейк-профит для ордера BUY if ( OrderType() == OP_BUY) tp = averageprice + takeprofit * Point; //тейк-профит для ордера SELL if ( OrderType() == OP_SELL) tp = averageprice - takeprofit * Point; //модифицируем ордер, принадлежащий серии OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), NormalizeDouble(tp, Digits), 0, Yellow); } } } return (0); }
 
int alert1() { int signal=-1; //нет торгового сигнала //получение параметра от индикатора скользящей средней double ma1 = iMA(Symbol(),Period(), per, 0, 0, 0, 1); //скользящая средняя пробита ценой снизу вверх - покупаем if ( iOpen(Symbol(), Period(), 1)ma1 ) signal = OP_BUY; //скользящая средняя пробита ценой сверху вниз - продаем if ( iOpen(Symbol(), Period(), 1)>ma1 && iClose(Symbol(), Period(), 1)