[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 634

 
artmedia70:

И ещё один вдогонку...

Я при тестировании с окна чарта поснимал все индюки, автоматически подгружаемые из шаблона (шаблон назван именем советника и при тестировании авт. подгружается).

В журнале тестера постоянно пишется об успешной загрузке пользовательского индюка и следом сразу же идёт запись о его удалении. И так на протяжении всего тестирования...

Это нормально или ни есть гут?

И как это побороть?


Запоздал, ответ наверно, но вот сам столкнулся с подобным. Это ни есть гуд :)

У меня подобные записи в журнале были вызваны тем что при вызове пользовательского индикатора через iCustom(), я по ошибке забыл, передать один из параметров. Компилятор не отслеживает эти ошибки, даже во время теста так как имя индикатора задано верно, то МТ пишет что все загружено успешно, но кол-во параметров никто не проверяет, а так как параметры заданы не верно, то в индикаторе происходит ошибка, и он сразу же выгружается. Заметил что тест стал как то медленно проходить, и в журнале одни:

01:11:13 2000.01.03 02:00  EMMA_Update_2 EURUSD,M15: loaded successfully

01:11:13 2000.01.03 02:00  EMMA_Update_2 EURUSD,M15: removed

01:11:13 2000.01.03 02:01  EMMA_Update_2 EURUSD,M15: loaded successfully

01:11:13 2000.01.03 02:01  EMMA_Update_2 EURUSD,M15: removed

Стал разбираться и нашел такую вот проблему по невнимательности, по поводу шаблона попробовал ставить/удалять индикатор из него «на ходу», ни какого «оживления» в журнале по этому поводу не увидел, все проблема была с iCustom(), так что проверьте на всякий случай :)

 

ToLik_SRGV:

все проблема была с iCustom(), так что проверьте на всякий случай :)

все верно. это из за неправильного числа аргументов.
 

Дайте совет, как установить срок истечения отложенного ордера.

Как-то не хочет у меня работать, и в справочнике про него не густо описано.

Если можно пример.

Заранее спасибо.

 
ToLik_SRGV:

Запоздал, ответ наверно, но вот сам столкнулся с подобным. Это ни есть гуд :)

У меня подобные записи в журнале были вызваны тем что при вызове пользовательского индикатора через iCustom(), я по ошибке забыл, передать один из параметров. Компилятор не отслеживает эти ошибки, даже во время теста так как имя индикатора задано верно, то МТ пишет что все загружено успешно, но кол-во параметров никто не проверяет, а так как параметры заданы не верно, то в индикаторе происходит ошибка, и он сразу же выгружается. Заметил что тест стал как то медленно проходить, и в журнале одни:

01:11:13 2000.01.03 02:00 EMMA_Update_2 EURUSD,M15: loaded successfully

01:11:13 2000.01.03 02:00 EMMA_Update_2 EURUSD,M15: removed

01:11:13 2000.01.03 02:01 EMMA_Update_2 EURUSD,M15: loaded successfully

01:11:13 2000.01.03 02:01 EMMA_Update_2 EURUSD,M15: removed

Стал разбираться и нашел такую вот проблему по невнимательности, по поводу шаблона попробовал ставить/удалять индикатор из него «на ходу», ни какого «оживления» в журнале по этому поводу не увидел, все проблема была с iCustom(), так что проверьте на всякий случай :)

Нет, не запоздал... В самый раз, спасибо.
 
kwadrad:

Дайте совет, как установить срок истечения отложенного ордера.

Как-то не хочет у меня работать, и в справочнике про него не густо описано.

Если можно пример.

Заранее спасибо.

Вот. Я так делаю...

   double   tp,PriceOpn,PriceTake;
   string   sy=Symbol();
   double pa=MarketInfo(sy, MODE_ASK);
   double pb=MarketInfo(sy, MODE_BID);
   double po=MarketInfo(sy, MODE_POINT);

   Magic=511;
   Lots_New=NormalizeLot(Lots/2, False, NULL);
         
   PriceOpn  = NormalizePrice(pa+DistORD*po, NULL);
   PriceTake = NormalizePrice(pa+(DistORD+tp)*po, NULL);
 //------------------------------------------------------------------
   SetOrder(NULL, OP_BUYSTOP, Lots_New, PriceOpn, 0, PriceTake, Magic, TimeCurrent()+12*60); // 12 часов срок его жизни...
 //------------------------------------------------------------------
//==============================================================================================

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.08.2008                                                     |
//|  Описание : Установка ордера.                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    co - комментарий                                                        |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, string co="", datetime ex=0) {
  color    cl=IIFc(op==OP_BUYLIMIT || op==OP_BUYSTOP, clOpenBuy, clOpenSell);
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl;

  if (sy=="" || sy=="0") sy=Symbol();
  msl=MarketInfo(sy, MODE_STOPLEVEL);
  if (co=="") co=WindowExpertName()+" "+GetNameTF(Period());
  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("SetOrder(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, ex, cl);
    if (ticket>0) {
      if (UseSound) PlaySound(SoundSuccess); break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) {
          if (UseSound) PlaySound(SoundSuccess); break;
        }
        Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
        continue;
      }
      if (UseSound) PlaySound(SoundError);
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      if (pa==0 && pb==0) Message("SetOrder(): Проверьте в обзоре рынка наличие символа "+sy);
      Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",GetNameOP(op),
            "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
      // Неправильные стопы
      if (err==130) {
        // Корректировка ценовых уровней
        if (modeSetOrders==1) {
          Sleep(1000*5.3);
          switch (op) {
            case OP_BUYLIMIT:
              if (pp>pa-msl*mp) pp=pa-msl*mp;
              if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
              if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
              break;
            case OP_BUYSTOP:
              if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
              if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
              if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
              break;
            case OP_SELLLIMIT:
              if (pp<pb+msl*mp) pp=pb+msl*mp;
              if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
              if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
              break;
            case OP_SELLSTOP:
              if (pp>pb-msl*mp) pp=pb-msl*mp;
              if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
              if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
              break;
          }
          Print("SetOrder(): Скорректированы ценовые уровни");
          continue;
        }
        // Вход по текущим ценам
        if (modeSetOrders==2) {
          Print("SetOrder(): Вход по текущим ценам");
          if (op==OP_BUYLIMIT || op==OP_BUYSTOP) OpenPosition(sy, OP_BUY, ll, sl, tp, mn, co);
          if (op==OP_SELLLIMIT || op==OP_SELLSTOP) OpenPosition(sy, OP_SELL, ll, sl, tp, mn, co);
          break;
        }
      }
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      // Слишком частые запросы (8) или слишком много запросов (141)
      if (err==8 || err==141) Sleep(1000*100);
      if (err==139 || err==140 || err==148) break;
      // Ожидание освобождения подсистемы торговли
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      // Обнуление даты истечения
      if (err==147) {
        ex=0; continue;
      }
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
}
 
artmedia70:

Вот. Я так делаю...




О. Спасибо.

Надо понимать, это срок в минутах от открытия?

 
kwadrad:


О. Спасибо.

Надо понимать, это срок в минутах от открытия?

Да, в примере 12 часов срок жизни... 12*60 минут
 

Понимаю, что может показаться ОффТоп`ом, но для меня, как для новичка в написании экспертов (да и вообще в программировании, не учитывая опыт программинга на ассемблере для Spectrum двадцатилетней давности), мой вопрос, а скорее.... да ладно, просто вопрос, будет как раз в тему:

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

Я со своей колокольни вижу пока два метода:

1. Заморозить всю торговлю при привышении просадки эквити на определённое кол-во процентов и
1.1 для каждой позиции, после выхода её в безубыток подключить трейлинг-стоп и зафиксировать стоп на небольшом расстоянии от Ask/Bid, тем самым застолбив небольшую прибыль и далее уже тянуть стопы за ценой, попутно частично закрывая позиции (для высвобождения средств) при достижении определённого кол-ва пунктов прибыли.
1.2 после поднятия эквити на определённый процент, потихоньку включать торговлю...

2. Наоборот, отключив основную торговлю, во всю врубить доливку половинным лотом, но большим кол-вом ордеров, строго по тренду с малым трейлинг-стопом после выхода в безубыток.

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

Вот, пока я вижу только два таких противонаправленных способа.

Что присоветуете, товарищи мои??? Приветствуются любые, даже самые, на первый взгляд "сумасбродно-нелепые" мысли и предложения...

Пасиб заранее :)

 
А что, тестер не позволяет тестировать более чем на дневках?
 
artmedia70:
А что, тестер не позволяет тестировать более чем на дневках?


Ы

а ты для межбанка советника готовишь?

Причина обращения: