League of Trading Systems. Continuez à faire du bon travail. - page 39

 
Georgiy Merts:

La situation actuelle ...

Le nouveau venu de la cote - TS 543122 - renverse des ordres à cours limité sur les pics en zigzag de la livre sterling s'est déplacé à la première place. Le système a été lancé à la mi-novembre, mais il n'a pas pu atteindre la cote. Mais, au cours de la dernière semaine, il y a eu plusieurs transactions réussies, et le système a considérablement amélioré la qualité des transactions, dépassant le dernier gagnant.


Si vous n'avez pas saisi le classement, il serait très intéressant de l'examiner dans les échanges.

Je n'avais pas du tout de chaîne TS. Je n'ai pas gagné d'argent avec eux...

 
Roman Shiredchenko:

Je veux dire "intuitivement" gênant comme vous l'écrivez, mais non-intuitivement encore plus gênant...

e et pour être honnête, c'est aussi effrayant de parier de l'argent sérieux sur des choses aussi élémentaires... Aujourd'hui, il fonctionne après optimisation - demain il peut ne pas fonctionner, et il peut se déverser immédiatement sur le vrai...

En principe, j'ai aimé le numéro 1 - celui de la chaîne sur les limites, les graphiques - m'a rappelé quelque chose du championnat... :-)

Le volume est le volume TOTAL des transactions de l'ENSEMBLE du PULSE du TS sélectionné.

Eh bien, il est clair que "intuitivement" - vous le regardez et pensez qu'il devrait être placé. Je l'ai mis, et il a commencé à couler. Et mon "intuition" ne valait rien. L'intuition, c'est beaucoup d'expérience. Je ne l'ai pas. Ce qui signifie que la seule façon de sélectionner est d'établir des règles claires.

A propos de "mettre de l'argent sérieux sur des trucs élémentaires"... eh bien, comme je l'ai déjà dit plusieurs fois - il y a plusieurs années, j'ai écrit un Conseiller Expert très complexe et non élémentaire, sur le TS duquel l'auteur a passé plus d'un an, et ensuite - je l'ai codé pendant presque six mois supplémentaires. Et ?... Au début, le conseiller expert a commencé à gagner de l'argent, puis en quelques mois il a commencé à couler, et j'ai perdu tout ce que j'avais gagné.

Jugez-en par vous-même : n'importe quel "produit de base" peut fonctionner de la même manière - pendant un ou deux mois, il donne de bons résultats, puis il commence à échouer. Quelle est l'utilité des choses non élémentaires après cela ? Après cet épisode - et j'en suis arrivé à la conclusion que nous devons créer une "ligue de football", et sélectionner les "joueurs", et non pas "courir sur le terrain avec le ballon" tout seul. Maintenant - j'ai tout le temps de NOMBREUX systèmes qui fonctionnent bien. Et ma principale question maintenant n'est pas "que faire pour que les TS fonctionnent", mais "comment sélectionner parmi les TS qui fonctionnent, ceux qui fonctionneront encore pendant un certain temps".

Quant au volume - j'ai six TS qui travaillent actuellement sur un "contrôle" de 1 000 cents. Et certains ouvrent même avec un volume de 0,02. Je ne pense donc pas qu'il y ait de problèmes possibles ici.

 
Roman Shiredchenko:

Lancez un morceau de code ou un indicateur sur lequel ces pics sont visualisés avec le code de connexion de ses lectures, il serait très intéressant de l'examiner dans les transactions.

Je n'avais pas du tout de chaîne TS. Je n'ai pas gagné d'argent avec eux...

Je crains que mon code ne soit difficile à comprendre pour vous (soyons "vous"). Mon code est une bibliothèque entière de plusieurs milliers de fichiers.

Disons que voici la fonction OnRefresh() du modèle principal, dont les 672 CT sont hérités, elle est chargée de prendre une décision :

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

La fonction _GetSignal() dans les descendants est l'endroit où l'entrée est décidée.

Ici, disons que cette fonction est pour tous les canaux TS (selon le système, les fonctions sont appelées là pour la tendance ou le flat) :

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

Le pointeur vers l'interface Price-Chenel est utilisé pour travailler, il est reçu du fournisseur de données lors de l'initialisation :

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

C'est-à-dire que nous créons un objet de paramètres du canal des prix, et nous demandons au fournisseur de données un pointeur vers l'interface de cet indicateur.

Le fournisseur de données cherche, et si un tel indicateur n'a pas encore été créé, il le crée, et renvoie le pointeur. Voici ce code :

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

Ainsi - "tout pour tout" est accroché, et seule une section du code, comme ici, peut être montrée séparément. Cela ne fonctionnera pas, bien sûr.

 
Mais, pour ceux qui sont intéressés, je peux vous donner le mot de passe d'investissement pour le compte où travaille la Ligue TC (il y a trois comptes, selon le nombre de divisions - le plus haut, le moyen et le plus bas). Là, vous devez surveiller les transactions pour trouver le bon magicien (parce qu'il y a plus de cent magiciens sur un compte en même temps). Si vous pouvez le faire - pas de problème, j'écrirai en privé invest-password. En collectant des transactions sur le bon magicien - vous serez en mesure de construire les mêmes graphiques, comme je le présente ici.
 
Georgiy Merts:

Maintenant, j'ai BEAUCOUP de systèmes qui fonctionnent bien tout le temps. Et ma principale question maintenant n'est pas "que faire pour que le TS fonctionne", mais "comment choisir parmi les TS qui fonctionnent, ceux qui fonctionneront encore pendant un certain temps".

Et moi, au lieu de plusieurs, je n'ai que deux TS, l'un pour les longs, l'autre pour les courts, et la question de choisir lequel des deux fonctionnera et quand, est la même, malheureusement, personne n'a et n'aura jamais de réponse exacte à cette question.

 
revers45:

Et moi, au lieu de plusieurs, je n'ai que deux TS, un pour les longs et un pour les courts, et la question de savoir lequel fonctionnera et quand est la même, malheureusement, personne n'a et n'aura jamais la réponse exacte.

D'après l'expérience de la Ligue des CT, la probabilité que le CT s'arrête de fonctionner est égale à 1 % par jour. Deux systèmes, c'est trop peu, la probabilité qu'ils cessent tous deux de fonctionner dans les deux mois est de l'ordre de 70 %.

Et qu'allez-vous faire ensuite ?

Je me souviens très bien de mon état, lorsque mon conseiller expert, sur lequel je travaille depuis plus de six mois (et avant cela, j'ai développé mon TS pendant plusieurs années), a commencé à tomber en panne. J'étais complètement découragé et je ne savais pas quoi faire.

Maintenant, quand j'ai un groupe de TS qui travaillent, la situation est complètement différente. Le TS a cessé de fonctionner - c'est désagréable. Au diable tout ça, je vais devoir en installer un autre. Je regrette de ne pas l'avoir fait tout de suite. Le confort interne est bien plus.

 

Gheorghe, où est passé le contrôle ?

Il y a un sujet, mais vous ne pouvez pas suivre les résultats.

Ce n'est pas intéressant.

 
Boris Gulikov:

Gheorghe, où est passé le contrôle ?

Il y a un sujet, mais il n'y a pas de suivi des résultats.

Ce n'est pas intéressant.

Que voulez-vous dire par "où" ?

Qu'est-ce que c' est ?

Le rapport du 10.12.18 est celui d'avant-hier. Et des graphiques des cinq premiers, et un tableau sur les vingt premiers, et mon bref résumé.

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

Que voulez-vous dire par "où" ?

Qu'est-ce que c' est ?

Le rapport du 10.12.18 est celui d'avant-hier. Et des graphiques des cinq premiers, et un tableau sur les vingt premiers, et mon bref résumé.

C'est cool, bien sûr. Mais je suis plus habitué à voir les résultats du ou des systèmes comme un signal.

Je suis venu, j'ai regardé le graphique, et oui, il y a un résultat. Qu'écrit Gueorgui dans sa chronique ? Comment le commente-t-il ?

Et sans un signal en direct, c'est tout faux, c'est tout faux.

Je peux comprendre l'absence de signal si vos stratégies ne montrent pas encore de résultats digestibles.

Mais votre rapport semble se porter plutôt bien.

Je ne comprends pas ce qui m'empêche de mettre cinq des meilleures stratégies sur le marché réel et de les suivre ici comme un signal public.

 
Boris Gulikov:

C'est cool, bien sûr. Mais en général, je préfère voir les résultats du ou des systèmes sous forme de signal.

Je regarde le tableau et je vois les résultats. Qu'écrit M. Gueorgui dans sa chronique ? Comment le commente-t-il ?

Et sans un signal en direct, c'est tout faux, c'est tout faux.

Je peux comprendre qu'il n'y ait pas de signal si vos stratégies ne donnent pas encore de résultats digestibles.

Mais votre rapport semble se porter plutôt bien.

Je ne comprends pas ce qui m'empêche de mettre cinq des meilleures stratégies sur le marché réel et de les suivre ici comme un signal public.

Et je suis plus habitué au signal. Qui peut le dire ? Mais je ne peux pas ouvrir 672 terminaux, 672 comptes, 672 signaux...

Je l'ai déjà dit à plusieurs reprises - je suis constamment confronté à la question du choix d'un TS stable. Donc, je prends un système, ça semble fonctionner... Mais il suffit de le mettre sur un compte séparé - et bam... Et il cesse de fonctionner, commence à afficher des pertes (sur un compte séparé et sur un compte de démonstration), et sort du classement...

Comment suggérez-vous de sélectionner les systèmes ? Eh bien, disons que beaucoup des meilleurs TS sont des systèmes de "reverse trailing", lorsque le SL n'est pas fixé, et que le TP est trailing. Le comportement de ces systèmes est très similaire à celui de Martin. J'ai déjà essayé plusieurs fois de les mettre sur un compte séparé, le résultat est toujours le même. J'ai eu quelques bonnes transactions, puis une tendance imprévue et une énorme perte.

La question de la sélection est la plus difficile et la plus difficile à résoudre pour le moment.

Suggérer comment vous pensez que vous devriez sélectionner les systèmes pour le signal ? Et ouvrez le signal.

Raison: