Учимся писать советник. Мартингейл. Часть 5.

Ну вот и дошла очередь до самой интересной темы для новичков на форексе — «системы Мартингейл». Не буду углубляться в историю её появления, описания разновидностей и т.п. Достаточно знать, что в общем система мартингейла подразумевает увеличение ставок на какое-либо событие после предыдущей убыточной ставки. За подробностями обращайтесь к Мартину Гейлу 🙂 (шутка, я имел в виду Википедию).

Итак, в этот раз мы запрограммируем простой мартингейл, при котором после проигрышной сделки, лот следующей будет установлен в «KoeffMartingale» раз больше чем лот убыточной. Версия торговой системы теперь выросла до 1.4 (хотя я подумываю привести в соответствие версиё частям уроков, т.е. раз у нас урок ЧАСТЬ 5, то и версия робота должна быть 1.5, или даже 0.5, а версию 1 назначим первому прибыльному советнику, поставленному на демо счет для тестирования, что думаете? Пока не поздно, можно переименовать).

//|   Forex-Grail.1.4.mq4 |

В заглавной части вводим настроечные переменные включения мартингейла «EnableMartingale» и его коэффициент увеличения «KoeffMartingale».

//-- 1.4 --
extern string startMartingale = "--- начало Мартингейла  ----";
extern bool   EnableMartingale = false; //Использовать мартингейл
extern double KoeffMartingale  = 2.0; //Коэффициент мартингейла
extern string endMartingale = "--- конец Мартингейла  ----";
//-- 1.4 --

Все операции по вычислению лота у нас заключены в ранее введенной функции GetLot(). Придется её модифицировать, поэтому привожу полную текущую версию, как обычно с понятными комментариями, ну по-крайней мере мне.

double GetLot()                                    
{
RefreshRates();
double marginRequired=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double freeMargin=AccountFreeMargin();   
double resLot=StartLot; //инициализируем умолчанием 
double percent=Risk;

//--1.4
 if (EnableMartingale) //Если включен мартингейл, то нужно найти последнюю сделку, и если она убыточна, то увеличить лот. 
 {
   for (int i = 0; i < OrdersHistoryTotal(); i++) //Возвращает количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. 
  { 
  if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
   { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) //Наш ордер
     { if (OrderProfit() > 0) //ура, профитный попался!
                   resLot = StartLot; //вот тут может нужно не со стартового начинать лота, а если включен манименеджмент, то вначале вычислить его? ТОДО
               else
                   resLot *= KoeffMartingale;  //а вот тут облом, надо бы умножиться
               
         }
      }
   }
    
    resLot = MathFloor(resLot/LOTSTEP)*LOTSTEP; //нормализуем до разрешенной дробности
 }
//--1.4   
 else if (EnableMoneyManagement)               //включено управление деньгами но отключен марнингейл     
     {     
      if (percent > 100) percent=100;  //процентов не более 100, т.е. максимально допустимый лот
      
      if (percent==0)
         resLot=MINLOT;  // Если Риск= 0 то лот минимальный
      else                                   
         resLot=MathFloor(freeMargin* percent/100.0/marginRequired/LOTSTEP)*LOTSTEP; //Расчет лота в зависимости от риска                                   

     }
 else                             //лот фиксированный, проверим хватает ли на него денег
     {                                       
      double needMoney=StartLot*marginRequired;      
      if(needMoney<=AccountFreeMargin()) // денег достаточно на наш лот resLot=StartLot; 
      else // Если денег не хватает, расчитаем на что хватит 
      resLot=MathFloor(freeMargin/marginRequired/LOTSTEP)*LOTSTEP;
      } 
//окончательная проверка на допустимые пределы полученных выше размеров лота 
   if (resLot>MaxLot) resLot=MaxLot;  // Если больше максимального заданного нами, то скорректируем
   else if (resLot < MINLOT) resLot=MINLOT; // Если меньше минимально возможного в системе то скорректируем 
  if (resLot*marginRequired > AccountFreeMargin()) // После перерасчетов еще раз проверим на возможность купить
     {    
      Print("На лот размером ",resLot," не хватает денег!");                                    
      resLot=0;   //к сожалению, даже на минимальный лот нет денег , в MyOrderSend ругнемся на это и посылать OrderSend не будем                    
     }
     
   return(resLot);              
}

Ну вот и все, ничего сложного оказывается. И даже в 2016 году на пятиминутках по евро-доллару вышли бы в плюс, причем не превышая лота 0,75!

koeff-martingale

Сегодня я запустилмини конкурс по поиску ошибок в исходном коде эксперта «Forex Grail».

Предыдущая часть 4: Не забываем про спреды.
Следующая часть 6: Скользящие средние.

Комментирование и размещение ссылок запрещено.

1 комментарий к записи “Учимся писать советник. Мартингейл. Часть 5.”

  1. Блин, Вордпресс портит все форматирование исходного кода, сразу не проверишь, потом приходится повторно форматировать. Или он сбивает формат вообще после каждой модификации записи? Или это не сам wordpress виноват, а плагин, отвечающий за подсветку синтаксиса?