Метод мартингейла в торговле на Форекс в различных своих вариациях всегда привлекал, привлекает и будет привлекать в будущем своей внушающей ожидаемой доходностью. Метод первоначально предназначался для игры в казино. Мартингейл основан на принципе удвоения ставки в случае проигрыша. При выигрыше ставка возвращается к первоначальному значению. Теоретически мартингейл – это беспроигрышный метод. Действительно, при увеличении числа игр вероятность хотя бы одного выигрыша растет. Шансы выиграть или проиграть в одной игре равны и составляют по 50%.
В то же время, мартингейл подразумевает наличие у игрока определенной крупной суммы денег, поскольку каждый следующий проигрыш требует средства для удвоения ставки. Например, первая ставка 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 долларов. Как вы думаете, стоил ли этот результат такого риска?
Загрузка …
Казалось бы, мартингейл это беспроигрышный метод, при котором рискуя большой суммой, всегда можно “гарантированно” получить маленький выигрыш. Размер выигрыша независимо от порядкового номера игры в серии всегда определяется размером первоначальной ставки.
Ну, что-то мы все про казино… Применительно к торговле на рынке Форекс классический метод мартингейла подразумевает удвоение лота каждой последующей сделки в случае убыточной предыдущей сделки. В случае закрытия прибыльной сделки размер лота становиться равным исходному. Например, мы открыли позицию на покупку (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) |