Lega dei sistemi di trading. Continuate a fare un buon lavoro. - pagina 39

 
Georgiy Merts:

La situazione al momento ...

Il nuovo arrivato del rating - TS 543122 - si lancia su ordini limite sui picchi di zigzag della sterlina-franco spostati al primo posto. Il sistema è stato lanciato a metà novembre, ma non ha potuto raggiungere il rating. Ma, durante l'ultima settimana ci sono stati diversi trade di successo, e il sistema ha migliorato notevolmente la qualità del trading, superando l'ultimo vincitore.


Se non avete inserito il rating, sarebbe molto interessante guardarlo nei mestieri.

Non ho avuto affatto molti canali TS. Non ci ha guadagnato niente...

 
Roman Shiredchenko:

Intendo "intuitivamente" fastidioso come scrivi, ma non-intuitivamente ancora più fastidioso...

e ad essere onesti, fa anche paura scommettere soldi seri su cose così elementari... Oggi funziona dopo l'ottimizzazione - domani potrebbe non farlo, e può riversarsi immediatamente su quello vero...

In linea di principio mi è piaciuto il numero 1 - quello del canale sui limiti, i grafici - mi ha ricordato qualcosa del campionato... :-)

Il volume è il volume TOTALE degli scambi dell'INTERO PULSO del TS selezionato.

Beh, è chiaro che "intuitivamente" - lo si guarda e si pensa che dovrebbe essere collocato. L'ho indossato e ha cominciato ad affondare. E la mia "intuizione" era inutile. L'intuizione è un sacco di esperienza. Non ce l'ho. Il che significa che l'unico modo per selezionare è con regole chiare.

A proposito di "mettere soldi seri su roba elementare"... beh, come ho già detto più volte - diversi anni fa ho scritto un Expert Advisor molto complesso e non elementare, sul cui TS l'autore ha speso più di un anno, e poi - l'ho codificato per quasi altri sei mesi. E... All'inizio l'Expert Advisor ha iniziato a guadagnare, e solo in un paio di mesi ha iniziato ad affondare, e ho perso tutto quello che avevo guadagnato.

Ora giudicate voi stessi - qualsiasi "prodotto di base" può funzionare allo stesso modo - per uno o due mesi darà un buon profitto, e poi inizierà a fallire. A cosa serve la roba non elementare dopo? Dopo quell'episodio - e sono arrivato alla conclusione che dobbiamo creare un "campionato di calcio", e selezionare i "giocatori", e non "correre per il campo con la palla" da soli. Ora - ho MOLTI sistemi in atto per tutto il tempo che funzionano abbastanza bene. E la mia domanda principale ora non è "cosa fare per far funzionare il TS", ma "come selezionare tra i TS che funzionano, quelli che funzioneranno ancora per qualche tempo".

Per quanto riguarda il volume - ho sei TS che lavorano ora su un "controllo" di 1.000 centesimi. E alcuni aprono anche con un volume di 0,02. Quindi non credo che ci siano problemi possibili qui.

 
Roman Shiredchenko:

Gettare un pezzo di codice o un indicatore su cui questi picchi sono visti con il codice di connessione delle sue letture, sarebbe molto interessante guardare in mestieri.

Non avevo affatto un canale TS. Non ci ha guadagnato niente...

Temo che il mio codice sarebbe difficile da capire per voi (diciamo "voi"). Il mio codice è un'intera libreria di diverse migliaia di file.

Diciamo che qui c'è la funzione OnRefresh() del modello principale, da cui tutti i 672 TC sono ereditati, essa è responsabile di prendere una decisione:

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 funzione _GetSignal() nei discendenti è dove viene deciso l'input.

Qui, diciamo, questa funzione è per tutti i canali TS (a seconda del sistema, le funzioni sono chiamate lì per trend o 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);
};

Il puntatore all'interfaccia Price-Chenel è usato per lavorare, è ricevuto dal Data Provider durante l'inizializzazione:

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

Cioè, creiamo un oggetto di parametri del canale dei prezzi, e richiediamo al fornitore di dati un puntatore all'interfaccia di questo indicatore.

Il dataprovider cerca, e se un tale indicatore non è ancora stato creato, lo crea e restituisce il puntatore. Ecco questo codice:

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

Così - "tutto per tutto" è agganciato, e solo una sezione di codice, come qui, può essere mostrata separatamente. Non funzionerà, ovviamente.

 
Ma, per coloro che sono interessati, posso darvi la password di investimento per il conto dove lavora la Lega TC (ci sono tre conti, secondo il numero di divisioni - la più alta, la media e la più bassa). Lì dovete monitorare le transazioni per il mago giusto (perché ci sono più di cento maghi su un conto alla volta). Se si può fare - nessun problema, scriverò in privato invest-password. Raccogliendo trade sul mago giusto - sarai in grado di costruire gli stessi grafici, come sto presentando qui.
 
Georgiy Merts:

Ora, ho un sacco di sistemi che funzionano bene tutto il tempo. E la mia domanda principale ora non è "cosa fare per far funzionare il TS", ma "come scegliere tra i TS che funzionano, quelli che funzioneranno ancora per qualche tempo".

E io, invece di molti, ho solo due TS, uno per i lunghi, l'altro per i corti, e la questione di scegliere quale di essi funzionerà e quando, è la stessa, purtroppo, nessuno ha e non avrà mai una risposta esatta a questo.

 
revers45:

E io, invece di molti, ho solo due TS, uno per i long e uno per gli short, e la domanda su quale funzionerà e quando è la stessa, purtroppo, nessuno ha e non avrà mai la risposta esatta.

Nell'esperienza della Lega dei TC - la probabilità che il TC smetta di funzionare è pari all'1% al giorno. Due sistemi sono troppo pochi, la probabilità che entrambi smettano di funzionare entro un paio di mesi è dell'ordine del 70%.

E cosa farai dopo?

Proprio ora ricordo molto bene la mia condizione, quando il mio Expert Advisor, su cui ho lavorato per più di sei mesi (e prima ancora per diversi anni di sviluppo del mio TS), ha iniziato a fallire. Ero completamente scoraggiato e non sapevo cosa fare.

Ora, quando ho un gruppo di TS funzionanti, la situazione è completamente diversa. Il TS ha smesso di funzionare - è sgradevole. Al diavolo, dovrò installarne un altro. Vorrei averlo fatto subito. Il comfort interno è molto di più.

 

Gheorghe, dov'è finito il monitoraggio?

C'è un argomento, ma non si possono seguire i risultati.

Non è interessante.

 
Boris Gulikov:

Gheorghe, dov'è finito il monitoraggio?

C'è un argomento, ma non c'è un monitoraggio dei risultati.

Non è interessante.

Cosa vuol dire "dove"?

Cos'è questo?

Il rapporto del 10.12.18 è dell'altro ieri. E le classifiche dei primi cinque, e una tabella sui primi venti, e il mio breve riassunto.

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

Cosa vuol dire "dove"?

Che cos'è?

Il rapporto del 10.12.18 è dell'altro ieri. E le classifiche dei primi cinque, e una tabella sui primi venti, e il mio breve riassunto.

Va bene, naturalmente. Ma sono più abituato a vedere i risultati del sistema (o dei sistemi) come un segnale.

Sono entrato, ho guardato il grafico e sì, c'è un risultato. Cosa scrive Gueorgui nella sua rubrica? Come fa a commentare?

E senza un segnale dal vivo, è tutto sbagliato, è tutto sbagliato.

Posso capire nessun segnale se le vostre strategie non mostrano ancora risultati digeribili.

Ma il tuo rapporto sembra andare abbastanza bene.

Non capisco cosa mi impedisce di mettere cinque delle migliori strategie sul mercato reale e monitorarle qui come segnale pubblico.

 
Boris Gulikov:

Questo è figo, ovviamente. Ma in generale preferisco vedere i risultati del sistema (o dei sistemi) sotto forma di segnale.

Guardo il grafico e vedo i risultati. Cosa scrive il signor Gueorgui nella sua rubrica? Come fa a commentare?

E senza un segnale dal vivo, è tutto sbagliato, è tutto sbagliato.

Posso capire che non ci sia un segnale se le vostre strategie non mostrano ancora risultati digeribili.

Ma il tuo rapporto sembra andare abbastanza bene.

Non capisco cosa mi impedisce di mettere cinque delle migliori strategie sul mercato reale e monitorarle qui come segnale pubblico.

E sono più abituato al segnale. Chi può dirlo? Ma non posso aprire 672 terminali, 672 conti, 672 segnali...

L'ho già detto molte volte - mi trovo costantemente di fronte alla questione della selezione di un TS stabile. Quindi, prendo un sistema, sembra funzionare... Ma basta metterlo su un conto separato - e bam... E smette di funzionare, inizia a mostrare perdite (ovunque, su un conto separato e su un conto demo), esce dal rating...

Come suggerisce di selezionare i sistemi? Beh, diciamo che molti dei migliori TS sono sistemi "reverse trailing", quando lo SL non è impostato e il TP è trailing. Il comportamento di questi sistemi è molto simile a quello di Martin. Ho provato a metterli su un account separato già diverse volte, il risultato è sempre lo stesso. Ho avuto alcuni buoni scambi, poi una tendenza indovinata e una perdita enorme.

La questione della selezione è la mia più difficile e irrisolta al momento.

Suggerisci come pensi di selezionare i sistemi per il segnale? E aprire il segnale.