交易系统联盟。继续保持良好的工作。 - 页 39

 
Georgiy Merts:

目前的情况是...

评级中的新人--TS 543122--在限价单上翻转的英镑-弗兰克人字形山峰移至首位。该系统于11月中旬启动,但未能达到评级。但是,在上个星期,有几笔成功的交易,该系统极大地提高了交易质量,超过了上一个冠军。


如果你没有进入评级,在交易中看一下会非常有趣。

我根本没有大量的TC与通道的。没有在他们身上赚到任何钱......。

 
Roman Shiredchenko:

我的意思是 "直觉上 "很麻烦,就像你写的那样,但非直觉上更麻烦......。

说实话,在这种初级的东西上赌大钱也是很可怕的......。今天它在优化后工作--明天它可能不工作,甚至可能倒在真正的......

原则上我喜欢1号--频道上的限制,图表--让我想起了冠军...。:-)

交易量是指所选TS的整个PULSE的总交易量。

嗯,很明显,"直觉"--你看着它,认为它应该被放置。我把它穿上,它开始下沉。而我的 "直觉 "却毫无价值。直觉是大量的经验。我没有。这意味着选择的唯一方法是有明确的规则。

关于 "把严重的钱放在初级的东西上"......嗯,我已经说过好几次了--几年前我写了一个非常复杂的非初级的专家顾问,作者在TS上花了一年多的时间,然后--我又编了差不多六个月的代码。还有......起初,专家顾问开始赚钱,就在几个月后,它开始沉沦,我失去了所有的收入。

现在自己判断一下--任何 "初级 "产品都可能以同样的方式工作--在一两个月内,它将提供良好的利润,然后它开始失败。此后,非基本的东西有什么用?在那段插曲之后--我得出的结论是,我们需要创建一个 "足球联盟",并选择 "球员",而不是自己 "带着球在球场上跑来跑去"。现在--我有很多系统一直表现良好。而我现在的主要问题不是 "如何做才能让TS发挥作用",而是 "如何从发挥作用的TS中选择还能工作一段时间的"。

至于数量--我现在有六个TS在 "控制 "1000美分的工作。而有些甚至以0.02的成交量开盘。所以我认为这里不可能有任何问题。

 
Roman Shiredchenko:

抛出一段代码或一个指标,在其上查看这些峰值与其读数的连接代码,在交易中查看它将是非常有趣的。

我根本就没有什么渠道TS。没有在他们身上赚到任何钱......。

我担心我的代码会让你(姑且称为 "你")难以理解。我的代码是一个由几千个文件组成的整体库。

说,这里是主模板的OnRefresh()函数,所有672个TC都继承自这个函数,它负责做出决定。

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()函数是决定输入的地方。

这里说的是,这个函数是针对所有通道TS的(根据系统的不同,那里的函数是 针对趋势或平坦而调用)。

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);
};

Price-Chenel接口的指针用于工作,它是在初始化期间从数据提供者那里收到的。

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);      
};

也就是说,我们创建一个价格通道的参数对象,并向数据提供者请求一个指向该指标接口的指针。

dataprovider寻找,如果这样的指标还没有被创建,就创建它,并返回指针。下面是这个代码。

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);
};

因此--"一切为了一切 "被钩住了,只有一段代码,像这里,可以单独显示。当然,这是不可能的。

 
但是,对于那些有兴趣的人,我可以给你TC联盟工作的账户的投资密码(有三个账户,根据划分的数量--最高、中间和最低)。 在那里你需要监控正确的魔术师的交易(因为一个账户上同时有一百多个魔术师)。如果你能做到这一点--没问题,我将在私人投资密码中写明。通过在正确的魔术师身上收集交易--你将能够建立相同的图表,就像我在这里介绍的那样。
 
Georgiy Merts:

现在,我有很多系统一直表现良好。而我现在的主要问题不是 "怎么做才能让TS发挥作用",而是 "如何从发挥作用的TS中选择还能工作一段时间的"。

而我,而不是许多人,只有两个TS,一个是长线,另一个是短线,选择哪一个会起作用,什么时候起作用,这个问题是一样的,不幸的是,没有人有也永远不会有准确的答案。

 
revers45:

而我,反而很多,只有两个TS,一个是长线,一个是短线,哪一个能用,什么时候用,这个问题是一样的,不幸的是,没有人有也永远不会有确切的答案。

根据TC联盟的经验--TC停止工作的概率等于每天1%。两个系统太少了,它们在几个月内都停止工作的概率在70%左右。

那你接下来要做什么呢?

刚才我清楚地记得我的情况,当时我的专家顾问,我已经在上面工作了6个多月(在此之前,我已经开发了几年的TS),开始失败。我完全灰心丧气,不知道该怎么做。

现在,当我有一堆工作的TS时,情况就完全不同了。TS已经停止工作--它令人不快。让它见鬼去吧,我将不得不安装另一个。我希望我当时就能做到。内部舒适度要高得多。

 

Gheorghe,监控去哪了?

有一个主题,但你无法跟踪结果。

这并不有趣。

 
Boris Gulikov:

Gheorghe,监控去哪了?

有一个主题,但没有对结果进行监测。

这并不有趣。

你说 "哪里 "是什么意思?

这是 什么?

18年12月10日的报告是前天的。还有前五名的图表,以及关于前二十名的表格,以及我的简要总结。

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

你说 "哪里 "是什么意思?

是什么?

18年12月10日的报告是前天的。还有前五名的图表,以及关于前二十名的表格,以及我的简要总结。

这当然很好。但我更习惯于把系统的结果看作是一种信号。

我进来了,看了看图,是的,有一个结果。Gueorgui先生在他的专栏中写了什么?他是如何评论的呢?

而没有现场信号,这一切都错了,这一切都错了。

如果你的策略还没有显示出任何可消化的结果,我可以理解没有信号。

但你的报告似乎做得相当好。

我不明白是什么原因阻碍了我把五个最好的策略放在真实的市场上,并在这里作为一个公共信号进行监测。

 
Boris Gulikov:

当然,这很酷。但总的来说,我更愿意看到系统以信号的形式出现的结果。

我看了看图表,看到了结果。Gueorgui先生在他的专栏中写了什么?他是如何评论的呢?

而没有现场信号,这一切都错了,这一切都错了。

我可以理解,如果你的战略还没有显示出任何可消化的结果,就没有信号。

但你的报告似乎做得相当好。

我不明白是什么原因阻碍了我把五个最好的策略放在真实的市场上,并在这里作为一个公共信号进行监测。

而且我更习惯于这种信号。谁说得准呢?但我不能打开672个终端,672个账户,672个信号......。

我已经说过很多次了--我不断面临着选择一个稳定的TS的问题。所以,我采取了一个系统,它似乎是有效的......但只要把它放在一个单独的账户上--然后就可以了。然后它停止工作,开始显示损失(到处都是,在独立账户和模拟账户上),掉出评级...

你建议如何选择系统?好吧,让我们说许多最好的TS是 "反向追踪 "系统,当SL没有设置,TP是追踪的。这些系统的行为与马丁的非常相似。我已经多次尝试把它们放在一个单独的账户上,结果总是一样。我有几笔好的交易,然后是一个没有猜测的趋势和巨大的损失。

选择的问题是我目前最困难和未解决的问题。

建议你认为应该如何选择信号的系统?并打开信号。