Советники: Martin - страница 6

 
Поставил на золото случайно и вот что получилось... как бы перевернуть зеркально, что поменять в коде...есть ли такая возможность...
 

Добрый день!! Пробую сову - обнаружил, что после открытия позиции в 10 лотов ТП выставляет очень далеко. Похоже, что прибавляет 100 пунктов.

 

Советник обновлен (новый советник прикреплен внизу комментария)

Исправлено:

1. Сделано два советника для торговли и для теста. Разница в входном параметре "Usd_per_Rub" (ранее Rub_per_Usd) - это стомиость доллара в рублях. Этот параметр нужен только для комментария на графике. В торговом советнике этот параметр не входной, а автоматический, берется и обновляется от пары USDRUB по цене Bid. На тестовом советнике при визуализации автоматом не работает, поэтому нужно вводить вручную.

Старый код:

...
extern int MaxTrades = 40;
extern double Rub_per_Usd = 40.0;
extern bool Comment_for_cent = true;
...
   ChartSetInteger(ChartID(), CHART_FOREGROUND, 0, false);
   if (Comment_for_cent == true) {
...

Торговый новый код:

...
extern int MaxTrades = 100;
extern bool Comment_for_cent = true;
...
   ChartSetInteger(ChartID(), CHART_FOREGROUND, 0, false);
   double Usd_per_Rub = MarketInfo("USDRUB",MODE_BID);
   if (Comment_for_cent == true) {
...

Тестовый новый код:

...
extern bool Comment_for_cent = true;
extern double Usd_per_Rub = 65;
int LimitOrders = 99999999;
...
   ChartSetInteger(ChartID(), CHART_FOREGROUND, 0, false);
   if (Comment_for_cent == true) {
...

2. Неправильно работала функция, которая включает своп и комиссию  в прибыль. Теперь советник отодвигает тейкпрофит чтоб покрыть своп и комиссию.

Старый код:

...
            if (SwapCom < 0 && MarketInfo(Symbol(), 16) != 0)
            PriceBuyTarget = AverageBuyPrice + Tp * Point - MathFloor(SwapCom / (MarketInfo(Symbol(), 16)))*Point;
            if (PriceBuyTarget <= Bid) {
...
            if (SwapCom < 0 && MarketInfo(Symbol(), 16) != 0)
            PriceSellTarget = AverageSellPrice - Tp * Point + MathFloor(SwapCom / (MarketInfo(Symbol(), 16)))*Point;
            if (PriceSellTarget >= Ask) {
...

Новый код:

...
            if (SwapCom < 0 && MarketInfo(Symbol(), 16) != 0) 
            PriceBuyTarget = AverageBuyPrice + Tp * Point - MathFloor(SwapCom / (MarketInfo(Symbol(), 16) * Count)) * Point;
            if (PriceBuyTarget <= Bid) {
...
            if (SwapCom < 0 && MarketInfo(Symbol(), 16) != 0) 
            PriceSellTarget = AverageSellPrice - Tp * Point + MathFloor(SwapCom / (MarketInfo(Symbol(), 16) * Count)) * Point;
            if (PriceSellTarget >= Ask) {
...

3. "Косметика" для комментария на графике.

Старый код:

...
   if (Balance != AccountBalance() || OrdTot != OrdersTotal()) {
      DateTime = TimeCurrent(); ordprof1 = 0;
      ordprof2 = 0; ordprof3 = 0; 
      Deposit = 0; Withdraw = 0;
      for (cnt = 0; cnt<OrdersHistoryTotal(); cnt++) {
         OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
         if (OrderCloseTime() < TimeCurrent() - 2629800) continue;
         if (StringFind(OrderComment(),"Deposit") >= 0) Deposit += OrderProfit() + OrderCommission();
         if (StringFind(OrderComment(),"Withdraw") >= 0) Withdraw += OrderProfit() + OrderCommission();
         ordprof3 += OrderProfit() + OrderCommission() + OrderSwap();
         if (OrderCloseTime() < TimeCurrent() - 604800) continue;
         ordprof2 += OrderProfit() + OrderCommission() + OrderSwap();
         if (OrderCloseTime() < TimeCurrent() - 86400) continue;
         ordprof1 += OrderProfit() + OrderCommission() + OrderSwap();
      }
      Balance = AccountBalance(); OrdTot = OrdersTotal();
   }
...
   if (Comment_for_cent == true) {
      Comment("                                  Баланс: ", NormalizeDouble(AccountBalance() * Rub_per_Usd / 100, 2),
      "р., Средства: ", NormalizeDouble(AccountEquity() * Rub_per_Usd / 100, 2), "р., Прибыль: ",
      NormalizeDouble(AccountProfit() * Rub_per_Usd / 100, 2), "р., Свободно: ",
      NormalizeDouble(AccountFreeMargin() * Rub_per_Usd / 100, 2), "р., Lot: ", l, ", ", bl, ", ", sl, ", Всего ордеров: ",
      OrdersTotal(), ", Ордеров по символу: ", CountTrades(), "\n                                  Дата обновления: ",
      TimeToStr(TimeCurrent()), "\n\n                                                                       История счета\n    ",
      "                              ------------------------------------------------------------------------------------------------",
      "\n                                    Сегодня: ", NormalizeDouble(ordprof1 * Rub_per_Usd / 100, 2),
      "р., Пополнение: ", NormalizeDouble(Deposit * Rub_per_Usd / 100, 2), "р.\n                                    Неделя: ",
      NormalizeDouble(ordprof2 * Rub_per_Usd / 100, 2), "р., Снятие: ", NormalizeDouble(Withdraw * Rub_per_Usd / 100, 2),
      "р.\n                                    Месяц: ", NormalizeDouble(ordprof3 * Rub_per_Usd / 100, 2), "р., Дата обновления: ",
      TimeToStr(DateTime));
   }
   if (Comment_for_cent == false) {
      Comment("                                  Баланс: ", NormalizeDouble(AccountBalance() * Rub_per_Usd, 2),
      "р., Средства: ", NormalizeDouble(AccountEquity() * Rub_per_Usd, 2), "р., Прибыль: ",
      NormalizeDouble(AccountProfit() * Rub_per_Usd, 2), "р., Свободно: ",
      NormalizeDouble(AccountFreeMargin() * Rub_per_Usd, 2), "р., Lot: ", l, ", ", bl, ", ", sl, ", Всего ордеров: ",
      OrdersTotal(), ", Ордеров по символу: ", CountTrades(), "\n                                  Дата обновления: ",
      TimeToStr(TimeCurrent()), "\n\n                                                    История счета",
      "\n                                  --------------------------------------------------------------------------------------",
      "\n                                    Сегодня: ", NormalizeDouble(ordprof1 * Rub_per_Usd, 2),
      "р., Пополнение: ", NormalizeDouble(Deposit * Rub_per_Usd, 2), "р.\n                                    Неделя: ",
      NormalizeDouble(ordprof2 * Rub_per_Usd, 2), "р., Снятие: ", NormalizeDouble(Withdraw * Rub_per_Usd, 2),
      "р.\n                                    Месяц: ", NormalizeDouble(ordprof3 * Rub_per_Usd, 2), "р., Дата обновления: ",
      TimeToStr(DateTime));
   }
...

Новый код:

...
   if (Balance != AccountBalance() || OrdTot != OrdersTotal()) {
      DateTime = TimeCurrent(); ordprof1 = 0;
      ordprof2 = 0; ordprof3 = 0; 
      Deposit1 = 0; Withdraw1 = 0;
      Deposit2 = 0; Withdraw2 = 0;
      Deposit3 = 0; Withdraw3 = 0;
      for (cnt = 0; cnt<OrdersHistoryTotal(); cnt++) {
         OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
         if (OrderCloseTime() < TimeCurrent() - 2629800) continue;
         if (StringFind(OrderComment(),"Deposit") >= 0) Deposit3 += OrderProfit() + OrderCommission();
         if (StringFind(OrderComment(),"Withdraw") >= 0) Withdraw3 += OrderProfit() + OrderCommission();
         ordprof3 += OrderProfit() + OrderCommission() + OrderSwap();
         if (OrderCloseTime() < TimeCurrent() - 604800) continue;
         if (StringFind(OrderComment(),"Deposit") >= 0) Deposit2 += OrderProfit() + OrderCommission();
         if (StringFind(OrderComment(),"Withdraw") >= 0) Withdraw2 += OrderProfit() + OrderCommission();
         ordprof2 += OrderProfit() + OrderCommission() + OrderSwap();
         if (OrderCloseTime() < TimeCurrent() - 86400) continue;
         if (StringFind(OrderComment(),"Deposit") >= 0) Deposit1 += OrderProfit() + OrderCommission();
         if (StringFind(OrderComment(),"Withdraw") >= 0) Withdraw1 += OrderProfit() + OrderCommission();
         ordprof1 += OrderProfit() + OrderCommission() + OrderSwap();
      }
      ordprof1 = ordprof1 - Deposit1 - Withdraw1;
      ordprof2 = ordprof2 - Deposit2 - Withdraw2;
      ordprof3 = ordprof3 - Deposit3 - Withdraw3;
      Balance = AccountBalance(); OrdTot = OrdersTotal();
   }
...
   if (Comment_for_cent == true) {
      Comment("                                  Баланс: ", DoubleToString(NormalizeDouble(AccountBalance() * Usd_per_Rub / 100, 2), 2), 
      "р., Средства: ", DoubleToString(NormalizeDouble(AccountEquity() * Usd_per_Rub / 100, 2), 2), "р., Прибыль: ", 
      DoubleToString(NormalizeDouble(AccountProfit() * Usd_per_Rub / 100, 2), 2), "р., Свободно: ", 
      DoubleToString(NormalizeDouble(AccountFreeMargin() * Usd_per_Rub / 100, 2), 2), "р., Lot: ", l, ", ", bl, ", ", sl, ", Всего ордеров: ", 
      OrdersTotal(), ", Ордеров по символу: ", CountTrades(), "\n                                  Дата обновления: ",
      TimeToStr(TimeCurrent()), "\n\n                                                                       История счета\n    ",
      "                              ------------------------------------------------------------------------------------------------",
      "\n                                    Сегодня: ", DoubleToString(NormalizeDouble(ordprof1 * Usd_per_Rub / 100, 2), 2),
      "р., Пополнение: ", DoubleToString(NormalizeDouble(Deposit3 * Usd_per_Rub / 100, 2), 2), "р. (за месяц)\n                                    Неделя: ", 
      DoubleToString(NormalizeDouble(ordprof2 * Usd_per_Rub / 100, 2), 2), "р., Снятие: ", DoubleToString(NormalizeDouble(Withdraw3 * Usd_per_Rub / 100, 2), 2), 
      "р. (за месяц)\n                                    Месяц: ", DoubleToString(NormalizeDouble(ordprof3 * Usd_per_Rub / 100, 2), 2), "р., Дата обновления: ", 
      TimeToStr(DateTime));
   }
   if (Comment_for_cent == false) {
      Comment("                                  Баланс: ", DoubleToString(NormalizeDouble(AccountBalance() * Usd_per_Rub, 2), 2), 
      "р., Средства: ", DoubleToString(NormalizeDouble(AccountEquity() * Usd_per_Rub, 2), 2), "р., Прибыль: ", 
      DoubleToString(NormalizeDouble(AccountProfit() * Usd_per_Rub, 2), 2), "р., Свободно: ", 
      DoubleToString(NormalizeDouble(AccountFreeMargin() * Usd_per_Rub, 2), 2), "р., Lot: ", l, ", ", bl, ", ", sl, ", Всего ордеров: ", 
      OrdersTotal(), ", Ордеров по символу: ", CountTrades(), "\n                                  Дата обновления: ",
      TimeToStr(TimeCurrent()), "\n\n                                                                       История счета\n    ",
      "                              ------------------------------------------------------------------------------------------------",
      "\n                                    Сегодня: ", DoubleToString(NormalizeDouble(ordprof1 * Usd_per_Rub, 2), 2),
      "р., Пополнение: ", DoubleToString(NormalizeDouble(Deposit3 * Usd_per_Rub, 2), 2), "р. (за месяц)\n                                    Неделя: ", 
      DoubleToString(NormalizeDouble(ordprof2 * Usd_per_Rub, 2), 2), "р., Снятие: ", DoubleToString(NormalizeDouble(Withdraw3 * Usd_per_Rub, 2), 2), 
      "р. (за месяц)\n                                    Месяц: ", DoubleToString(NormalizeDouble(ordprof3 * Usd_per_Rub, 2), 2), "р., Дата обновления: ", 
      TimeToStr(DateTime));
   }
...
Файлы:
martin.mq4  16 kb
martin_test.mq4  16 kb
 
убийца депозитов )
 
Strategy Tester Report
martin
EGlobal-Cent3 (Build 988)

СимволAUDUSD (Australian Dollar vs US Dollar)
Период5 Минут (M5) 2015.07.24 17:55 - 2016.07.11 23:59 (2015.07.12 - 2016.07.12)
МодельПо ценам открытия (только для советников с явным контролем открытия баров)
ПараметрыExp=1.92; Interval=31; TakeProfit=80; Equity_per_lot=95000; MaxTrades=100; Comment_for_cent=true;

Баров в истории70794Смоделировано тиков141059Качество моделированияn/a
Ошибки рассогласования графиков0




Начальный депозит10000.00

СпредТекущий (3)
Чистая прибыль525444.14Общая прибыль550308.79Общий убыток-24864.64
Прибыльность22.13Матожидание выигрыша1004.67

Абсолютная просадка603.66Максимальная просадка189250.36 (58.76%)Относительная просадка76.04% (63766.88)

Всего сделок523Короткие позиции (% выигравших)254 (72.05%)Длинные позиции (% выигравших)269 (76.58%)

Прибыльные сделки (% от всех)389 (74.38%)Убыточные сделки (% от всех)134 (25.62%)
Самая большаяприбыльная сделка124159.99убыточная сделка-2603.66
Средняяприбыльная сделка1414.68убыточная сделка-185.56
Максимальное количествонепрерывных выигрышей (прибыль)27 (35791.93)непрерывных проигрышей (убыток)11 (-10796.82)
Макс.непрерывная прибыль (число выигрышей)227651.85 (15)непрерывный убыток (число проигрышей)-10796.82 (11)
Среднийнепрерывный выигрыш12непрерывный проигрыш4
 
Maxim Dmitrievsky:
убийца депозитов )
Сам то чужие депозиты за деньги слил "Homunculus"(сова)
 
Aleksey Altukhov:
Сам то чужие депозиты за деньги слил "Homunculus"(сова)

так тоже на мартингале был, рано или поздно...

а бот на самом деле неплох, по крайней мере в тестере, удачная реализация, кол-во сделок доставляет )

 

 


В конце тренда после разворота происходят такие скачки этого советника. Там и рассчитывается максимальная просадка. Здесь она больше чем начальный депозит. Так что этот тест идеален только если торговать с того дня(даты начала теста) с данными вход. параметрами. С любой другой даты, особенно перед этим трендом с такими параметрами обязательно будет слив(депо просто не хватит на эту просадку).

Если посмотреть по тесту, то начало самого большого тренда будет по первой открытой сделки в той группе сделок, от которых произошел такой большой скачек - это 2016.05.03 06:30(заканчивается вместе с разворотом, где происходит закрытие этой группы сделок с прибылью - 2016.06.01 03:35). С этой даты(перед трендом!) можно проводить оптимизацию не обращая внимания на просадку, пока не появиться еще больше тренд. И то мало вероятно, т.к. в этом моменте советник уже увеличил начальный лот в 2 раза, а значит и лоты всех след. сделок этой группы.

 
Aleksey Altukhov:


В конце тренда после разворота происходят такие скачки этого советника. Там и рассчитывается максимальная просадка. Здесь она больше чем начальный депозит. Так что этот тест идеален только если торговать с того дня(даты начала теста) с данными вход. параметрами. С любой другой даты, особенно перед этим трендом с такими параметрами обязательно будет слив(депо просто не хватит на эту просадку).

Если посмотреть по тесту, то начало самого большого тренда будет по первой открытой сделки в той группе сделок, от которых произошел такой большой скачек - это 2016.05.03 06:30(заканчивается вместе с разворотом, где происходит закрытие этой группы сделок с прибылью - 2016.06.01 03:35). С этой даты(перед трендом!) можно проводить оптимизацию не обращая внимания на просадку, пока не появиться еще больше тренд. И то мало вероятно, т.к. в этом моменте советник уже увеличил начальный лот в 2 раза, а значит и лоты всех след. сделок этой группы.

Да, понял, хороший подход
 

Советник обновлен (новый советник прикреплен внизу комментария)

Исправлено:

1. Тепер советник не определяет минимальный тейкпрофит и интервал по стоп уровню, а прибавляет стоп уровень к назначенным тейкпрофиту и интервалу.

Старый код:

   timeprev = Time[0];
   In = Interval; Tp = TakeProfit;
   if (In < MarketInfo(Symbol(), 14)) In = MarketInfo(Symbol(), 14);
   if (Tp < MarketInfo(Symbol(), 14)) Tp = MarketInfo(Symbol(), 14);
   for (int cnt = 0; cnt<OrdersTotal(); cnt++) {

Новый код:

   timeprev = Time[0];
   In = Interval + MarketInfo(Symbol(), 14); Tp = TakeProfit + MarketInfo(Symbol(), 14);
   for (int cnt = 0; cnt<OrdersTotal(); cnt++) {

2. Чтоб не возникало ошибки типа 130, когда советник пытается выставить тейкпрофит сделок близкий к текущему курсу, что запрещает стоп уровень.

Старый код:

...
            }
            if (OrderTakeProfit() != PriceBuyTarget)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(PriceBuyTarget, Digits), 0, Yellow);
...
            }
            if (OrderTakeProfit() != PriceSellTarget)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(PriceSellTarget, Digits), 0, Yellow);
...

Новый код:

...
            }
            if (PriceBuyTarget - Bid < MarketInfo(Symbol(), 14) * Point) continue;
            if (OrderTakeProfit() != PriceBuyTarget)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(PriceBuyTarget, Digits), 0, Yellow);
...
            }
            if (Ask - PriceSellTarget < MarketInfo(Symbol(), 14) * Point) continue;
            if (OrderTakeProfit() != PriceSellTarget)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(PriceSellTarget, Digits), 0, Yellow);
...
P.S. этот советник может работать не правильно на счетах с плавающим спредом, где стоп уровень отсутствует.
Файлы:
martin_test.mq4  16 kb
martin.mq4  16 kb