Лига Торговых Систем. Продолжаем работу. - страница 39

Roman Shiredchenko
2698
Roman Shiredchenko  
Georgiy Merts:

Ситуация на текущий момент ...

На первое место сходу вылетел новичок рейтинга - ТС 543122 - перевороты по лимитным отложкам на пиках зигзага фунтофранка. Система запущена еще со середины ноября, но в рейтинг войти никак не могла. Но, за последнюю неделю совершено несколько удачных сделок, и система резко улучшила качество торговли, обогнав прошлого победителя.


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

У меня канальных вообще мало было ТС. На них не зарабатывал...

Georgiy Merts
8914
Georgiy Merts  
Roman Shiredchenko:

в смысле - "интуитивно" хлопотно, как Вы пишете, а не интуитивно ещё хлопотнее...  

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

В принципе №1 понравился - канальная на лимитках, графики - чем-то чемпионат напомнили... :-)

Объем - это объем ИТОГОВЫЙ сделок ВСЕГО ПУЛА отобранных  ТС.  

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

Насчет "ставить серьезные деньги на элементарщину"... ну, как я уже не раз говорил - несколько лет назад я занимался написанием очень сложного и неэлементарного эксперта, на ТС которого автор затратил не один год, а потом - я ее еще почти полгода кодировал. Ну и ?... Сперва эксперт начал было зарабатывать, а буквально через пару месяцев - начал сливать, и слил все, что заработал.

Вот теперь и посуди сам - да любая "элементарщина" может работать точно так же - один-другой месяц давать неплохую прибыль, а потом - начать сливать. И какой смысл после этого в не-элементарщине ? После того эипзода - я и пришел к выводу, что надо создать "футбольную лигу", и отбирать "игроков", а не "бегать по полю с мячом" самостоятельно. Сейчас - у меня постоянно есть МНОГО систем, которые показывают неплохие результаты. И основной вопрос теперь у меня не "что делать, чтобы ТС работала", а "как выбрать из ТС, которые работают, таких, которые еще некоторое время будут работать".

Насчет объема - у меня сейчас на "контрольном" центовике 1000 центов работает шесть ТС. И некоторые даже открываются объемом 0,02. Так что я не думаю, что здесь возможны какие-то проблемы.

Georgiy Merts
8914
Georgiy Merts  
Roman Shiredchenko:

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

У меня канальных вообще мало было ТС. На них не зарабатывал...

Боюсь, в моем коде тебе (давай на "ты") будет непросто разобраться. Мой код - это целая библиотека из нескольки тысяч файлов.

Скажем, вот функция OnRefresh() главного шаблона, от которого пронаследованы все 672 ТС, именно она отвечает за принятие решения:

EEAWorkRetcode CBinder_EPFT::OnRefresh(datetime dtCurMoment)
{
   m_asTradeOperationInfo.Clear();

   EEAWorkRetcode wrRes =  CEAPartsFactoryT::OnRefresh(dtCurMoment);
   
   if(wrRes != WR_SUCCEEDED)
      {
      _AddTOInfo("Ошибка CEAPartsFactoryT::OnRefresh() ! Код: ",(int)wrRes);
      
      return(wrRes);
      };

   // Проверим, возможно, надо срочно выходить из позиции ? 
   if(m_bNeedExit)
      {
      _SetExit();
      _TellTradeOperationInfo();
      return(WR_SUCCEEDED);
      };

   // Установим флаги рабочего времени.
   bool bWorkTime = _IsWorkTime(dtCurMoment);
   bool bNearWeekEnd = _IsNearWeekEnd(dtCurMoment,HOURS_TO_WEEKEND_EXIT);

   // Разрешим трейлинг в рабочее время   
   _SetTrailingPermition(bWorkTime);
   
   // Проведем входы, если сейчас рабочее время и не конец недели.
   if((bWorkTime == true) && (bNearWeekEnd == false))
      {
      // Проверим возможность входа, и войдем, если надо.
      
      m_dCurTruePrice = _GetTruePrice();
      m_tdSignal = TD_FLAT;
      datetime dtCurBarTime = CTimeSeriesT::GetStartMomentOfBar(dtCurMoment,m_didData.m_etWorkTimeFrame);
      
      if(m_dtGetSignalMoment < dtCurBarTime)
         {
         m_tdSignal = _GetSignal();
         m_dtGetSignalMoment = dtCurBarTime;
         };
      
      _SetEnter(_IsTrendSystem(),dtCurMoment);

      _TellTradeOperationInfo();
      return(WR_SUCCEEDED);
      }; // if(bWorkTime == true && bNearWeekEnd == false)

   // В этой точке - либо рабочее время закончено, либо уже конец недели
   
   // Получим число компонент позиции
   uint uiNumOfTPC = GetCurrentPosition().GetTotalComponents();
   
   // Закончим обработку, если компонент нет
   if(uiNumOfTPC == NULL)
      {
      _TellTradeOperationInfo();
      return(WR_SUCCEEDED);
      };
   
   // В этой точке - либо рабочее время закончено, либо конец недели, и есть компоненты позиции      
   
   // Проверим, может конец недели и надо выходить ? 
   if((bNearWeekEnd == true) && (m_bMustExitOnWeekEnd == true))
      {
      TRACE("Есть компоненты позиции, сейчас конец недели, и требуется выходить");
      _SetExit();
      _TellTradeOperationInfo();
      return(WR_SUCCEEDED);
      };
       
   // Проверим, может быть конец рабочего времени, и надо выходить ? 
   if((bWorkTime == false) && (m_bMustExitOnWorkEnd == true))
      {
      TRACE("Есть компоненты позиции, сейчас конец рабочего времени, и требуется выходить");
      _SetExit();
      _TellTradeOperationInfo();
      return(WR_SUCCEEDED);
      };

   _TellTradeOperationInfo();
   return(WR_SUCCEEDED);
};

В функции _GetSignal() в наследниках и решается возможность входа.

Вот, скажем, эта функция для всех канальных ТС (там, в зависимости от системы вызваются функции для тренда или флета):

ETrendDirection CPriceChannel_Binder_EPFT::_GetSignal()
{
   ETrendDirection tdSignal = TD_FLAT;

   if(_IsTrendSystem())
      tdSignal = _GetTrendSignal();
   else      
      tdSignal = _GetFlatSignal();      
   
   _AddTOInfo("Сигнал: ",(int)tdSignal);
   
   return(tdSignal);
};

ETrendDirection CPriceChannel_Binder_EPFT::_GetTrendSignal()
{
   #ifdef ASSERTION_CODE_ON
      
      datetime dtCurTime = m_tcContainer.Time(1);

   #endif //  ASSERTION_CODE_ON
   
   // Получим границы канала
   double dCurHi = m_tcContainer.High(1);
   double dPrevHiBound = m_ppcPriceChannel.GetValue(2,CPriceChannel::HI_BOUND_BUFF);
   double dCurLo = m_tcContainer.Low(1);
   double dPrevLoBound = m_ppcPriceChannel.GetValue(2,CPriceChannel::LO_BOUND_BUFF);

   _AddTOInfo("Time(1): ",m_tcContainer.Time(1));
   _AddTOInfo("High(1): ",dCurHi);
   _AddTOInfo("Lo(1): ",dCurLo);
   _AddTOInfo("HiBound(2): ",dPrevHiBound);
   _AddTOInfo("LoBound(2): ",dPrevLoBound);
   
   // Проверим, возможно, пробоя канала нет ? 
   if(dCurHi <= dPrevHiBound  &&  dCurLo >= dPrevLoBound)
      {
      _AddTOInfo("Сигнала нет.");
      return(TD_FLAT);
      };

      
   // Проверим, возможно, пробой с обоих сторон ? 
   if(dCurHi > dPrevHiBound  &&  dCurLo < dPrevLoBound)
      {
      TRACE_INTEGER("Пробой канала с обоих сторон ! Сигнала нет. Магик: ",GetMagic());
      return(TD_FLAT);
      };
   
   // Пробой в одну сторону. 
   if(dCurHi > dPrevHiBound)
      {
      // Пробой вверх.
      _AddTOInfo("Пробой вверх. Сигнал в лонг !");
      return(TD_UP);
      };
   
   // Пробой вниз.   
   _AddTOInfo("Пробой вниз. Сигнал в шорт !");
   return(TD_DOWN);
};

ETrendDirection CPriceChannel_Binder_EPFT::_GetFlatSignal()
{
   datetime dtCurTime = m_tcContainer.Time(1);
   
   // Отбой вниз - это момент, когда High(1) < High(2) && High(2) + PricePoint >= HiBound
   // Отбой вверх - это момент, когда Low(1) > Low(2) && Low(2) - PricePoint <= LoBound
    
   // Получим границы канала на втором баре (у нас должен произойти отбой
   double dCurHi = m_tcContainer.High(1);
   double dPrevHi = m_tcContainer.High(2);
   double dPrevHiBound = m_ppcPriceChannel.GetValue(2,CPriceChannel::HI_BOUND_BUFF);
   double dCurLo = m_tcContainer.Low(1);
   double dPrevLo = m_tcContainer.Low(2);
   double dPrevLoBound = m_ppcPriceChannel.GetValue(2,CPriceChannel::LO_BOUND_BUFF);

   _AddTOInfo("Time(1): ",m_tcContainer.Time(1));
   _AddTOInfo("High(1): ",dCurHi);
   _AddTOInfo("High(2): ",dPrevHi);
   _AddTOInfo("Lo(1): ",dCurLo);
   _AddTOInfo("Lo(2): ",dPrevLo);
   _AddTOInfo("HiBound(2): ",dPrevHiBound);
   _AddTOInfo("LoBound(2): ",dPrevLoBound);
   
   bool bHiBreakback = false;   
   bool bLoBreakback = false;   
   
   if(dCurHi < dPrevHi && dPrevHi + m_psiWorkSymbol.GetPointPrice() >= dPrevHiBound)
      bHiBreakback = true;
     
   if(dCurLo > dPrevLo && dPrevLo - m_psiWorkSymbol.GetPointPrice() <= dPrevLoBound)
      bLoBreakback = true;

   // Проверим, возможно, отбоя не было, или были сразу два отбоя ? 
   if(bHiBreakback ==  bLoBreakback)
      {
      _AddTOInfo("Сигнала нет.");
      return(TD_FLAT);
      };

   TRACE_DATETIME("Time(1): ",m_tcContainer.Time(1));
      
   // Проверим, возможно, пробой с обоих сторон ? 
   
   // Пробой в одну сторону. 
   if(bHiBreakback)
      {
      // Был отбой вниз
      _AddTOInfo("Отбой вниз. Сигнал в шорт !");
      return(TD_DOWN);
      };
   
   // Был отбой вверх.   
   _AddTOInfo("Отбой вверх. Сигнал в лонг !");
   return(TD_UP);
};

Для работы используется указатель на интерфейс Прайс-Ченела, он при инициализации получается от Дата-провайдера:

EEAWorkRetcode CPriceChannel_Binder_EPFT::Init(CDataProviderI* pdpDataProvider,CCPRList* pcrlEATradeRequestsQueue)
{
   EEAWorkRetcode wrRes = CDATR_Binder_EPFT::Init(pdpDataProvider,pcrlEATradeRequestsQueue);
   
   if(wrRes != WR_SUCCEEDED)
      return(wrRes);

   RETURN_IF_FALSE(m_tcContainer.Init(pdpDataProvider,m_didData.m_csWorkSymbol,ALL_SERIES_EXCEPT_REALVOLUME,m_didData.m_etWorkTimeFrame,_GetCannelPeriod()));
   
   CPriceChannel_IParams pcpParams;

   pcpParams.SetCommonParameters(m_didData.m_csWorkSymbol,m_didData.m_etWorkTimeFrame,_GetCannelPeriod(),true);
   
   TRACE_INTEGER("Устанавливаем Price Cannel, с периодом: ",pcpParams.GetIndicatorPeriod());
   
   m_ppcPriceChannel = pdpDataProvider.GetIndicator(GetPointer(pcpParams));
   
   if(m_ppcPriceChannel == NULL)
      return(WR_CANT_CREATE_INDICATOR);

   
   return(WR_SUCCEEDED);      
};

То есть, мы создаем объект параметров прайс-ченнела, и запрашиваем у дата-провайдера указатель на интерфейс этого индикатора.

Дата-провайдер смотрит, и если такой индикатор еще не создан создает его, и возвращает указатель. Вот этот код:

CIndicatorI* CDataProviderT::GetIndicator(CIndicatorParametersI* pipIndicatorParameters,uint uiMinBufferSize,bool bLoadData)
{
   ASSERT_MYPOINTER(pipIndicatorParameters);
   ASSERT(uiMinBufferSize > 0);

   CIndicatorI* piResult = NULL;
   int iIndIdx = WRONG_VALUE;

   // Поищем нужный индикатор
   if(_FindWithResizeIndicator(pipIndicatorParameters,uiMinBufferSize,iIndIdx) == true)
      {
      // Индикатор найден, и его размер подходит.
      ASSERT(iIndIdx < m_aoIndicators.Total());
      piResult = m_aoIndicators.At(iIndIdx);
      ASSERT_MYPOINTER(piResult);
      }
   else
      {
      // Индикатор не найден. 
      
      // Проверим, возможно произошла ошибка инициализации ? 
      if(iIndIdx != WRONG_VALUE)
         {
         ASSERT_DSC(false,"Внимание ! Индикатор существует, однако, не удалось изменить размер его буффера !");
         TRACE_INTEGER("Тип индикатора: ",pipIndicatorParameters.GetIndicatorType());
         TRACE_INTEGER("Желаемый размер буффера: ",uiMinBufferSize);
         return(NULL);
         };
   
      // Индикатора действительно нет. 
      // Попытаемся его создать.   
      piResult =  _CreateIndicator(pipIndicatorParameters,uiMinBufferSize);
      ASSERT_MYPOINTER_OR_NULL(piResult);
      
      if(piResult == NULL)
         {
         ASSERT_DSC(false,"Внимание ! Не удалось создать индикатор !");
         TRACE_INTEGER("Тип индикатора: ",pipIndicatorParameters.GetIndicatorType());
         TRACE_INTEGER("Желаемый размер буффера: ",uiMinBufferSize);
         return(NULL);
         };

      // Индикатор успешно создан. 
      // Отобразим его на чарте, если это необходимо.      
      
      if(piResult.NeedLaunchOnMT5VisualTester()==true && _IsWorkInVisualTester() && _GetMainTimeframe() == piResult.GetIndicatorTimeframe())
         {
         if(_AddIndicatorToChart(piResult,true) != true) 
            {
            ASSERT_DSC(false,"Внимание ! Не удалось отобразить вновь созданный индикатор на чарте !");
            TRACE_INTEGER("Тип индикатора: ",piResult.GetIndicatorType());
            }; 
         };    
      };
   
   // В этой точке индикатор либо найден, либо успешно создан.
   // Возможно, надо загрузить в него данные ? 
   if(bLoadData)
      if(piResult.Refresh()!=true)
         {
         ASSERT_DSC(false,"Внимание ! Не удалось обновить данные индикатора !");
         TRACE_INTEGER("Тип индикатора: ",pipIndicatorParameters.GetIndicatorType());
         TRACE_INTEGER("Желаемый размер буффера: ",uiMinBufferSize);
         };

   return(piResult);
};

 

Таким образом - "все за все" цепляется, и отдельно показать можно лишь участок кода, как здесь. Работать он, понятное дело, не будет.

Georgiy Merts
8914
Georgiy Merts  
Но, для интересующихся я могу дать инвест-пароль счета, на котором работает Лига ТС (там три счета, по числу дивизионов - высший, средний и низший). Там надо мониторить сделки по нужному магику (поскольку на одном счете сразу более сотни магиков). Если это по силам - никаких проблем, напишу в приват инвест-пароль. Собирая сделки по нужному магику - ты сможешь построить такие же графики, как я тут представляю.
revers45
265
revers45  
Georgiy Merts:

Сейчас - у меня постоянно есть МНОГО систем, которые показывают неплохие результаты. И основной вопрос теперь у меня не "что делать, чтобы ТС работала", а "как выбрать из ТС, которые работают, таких, которые еще некоторое время будут работать".

А у меня, вместо МНОГИХ, только ДВЕ ТС, одна для лонгов, другая для шортов, а вопрос выбора, которая из них и когда будет работать, тот же, к сожалению, точного ответа на него ни у кого нет и никогда не будет.

Georgiy Merts
8914
Georgiy Merts  
revers45:

А у меня, вместо МНОГИХ, только ДВЕ ТС, одна для лонгов, другая для шортов, а вопрос выбора, которая из них и когда будет работать, тот же, к сожалению, точного ответа на него ни у кого нет и никогда не будет.

По опыту Лиги ТС - вероятность, что ТС перестанет работать равна 1% в день. Две системы - слишком мало, вероятность, что они перестанут работать обе в течении пары месяцев - в районе 70%.

И что ты будешь делать дальше ?

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

Сейчас, когда есть куча работающих ТС - ситуация совсем другая. Перестала ТС работать - неприятно. Ну и хрен с ней, придется поставить другую. Жаль, я ее сразу не поставил. Внутренний комфорт куда больше.

Boris Gulikov
8115
Boris Gulikov  

Георгий, куда мониторинг делся?

Тема есть, а за результатами не понаблюдаешь.

Не интересно.

Georgiy Merts
8914
Georgiy Merts  
Boris Gulikov:

Георгий, куда мониторинг делся?

Тема есть, а за результатами не понаблюдаешь.

Не интересно.

То есть как "куда" ???

А ЭТО что ?

Отчет за 10.12.18 - позавчерашний. И графики пяти лучших, и таблица по двадцатке лучших, и мое краткое резюме.

Лига Торговых Систем. Продолжаем работу.
Лига Торговых Систем. Продолжаем работу.
  • 2018.11.27
  • www.mql5.com
Всех приветствую. Если кто забыл - Лига Торговых Систем - это набор простых советников, которые постоянно торгуют на демо-счете...
Boris Gulikov
8115
Boris Gulikov  
Georgiy Merts:

То есть как "куда" ???

А ЭТО что ?

Отчет за 10.12.18 - позавчерашний. И графики пяти лучших, и таблица по двадцатке лучших, и мое краткое резюме.

Это конечно круто. Но мне как-то в целом привычней видеть в виде сигнала результаты работы систем(ы).

Зашёл, глянул на график, - ага, есть результат. А что там Георгий пишет в теме? Как комментирует.

А без живого сигнала всё не так, всё не то.

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

Но вроде как в вашем отчёте показатели неплохие.

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

Georgiy Merts
8914
Georgiy Merts  
Boris Gulikov:

Это конечно круто. Но мне как-то в целом привычней видеть в виде сигнала результаты работы систем(ы).

Зашёл, глянул на график, - ага, есть результат. А что там Георгий пишет в теме? Как комментирует.

А без живого сигнала всё не так, всё не то.

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

Но вроде как в вашем отчёте показатели неплохие.

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

И мне привычнее сигнал. Кто ж спорит ? Но не могу ж я у себя открыть 672 терминала, 672 счета, 672 сигнала...

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

Как предложишь отбирать системы-то ? Вот, скажем, многие среди лучших ТС - это системы "обратного трейлинга", когда СЛ не выставляется, а трейлится ТП. Поведение этих систем очень напоминает мартиновское. Я уже несколько раз пытался ставить их на отдельный счет - результат постоянно один и тот же. Несколько сделок хороших, потом неугаданный тренд, и огромный убыток.

Вопрос отбора сейчас - у меня самый трудный и нерешенный.

Предложи, как по-твоему надо отбирать системы для сигнала ?  И открою сигнал.