Aliaksandr Hryshyn: Mi chiedo, quante persone usano i commenti alle funzioni (classi, strutture...) usando esattamente questo design a sinistra?
Lo uso molto spesso e densamente (è vero, non lo formatto come "quadrati", lo scrivo "così".
Ecco il mio attuale file di interfaccia della storia delle offerte. E questo non è il numero massimo di commenti.
// СTradeHistoryI переносимый интерфейс торговой истории // История состоит из компонент-наследников интерфейса CHistoryPosComponentI// // Реально для МТ4 имплементацией интерфейса является объект CMT4TradeHistory, для МТ5 - объект CMT5TradeHistory// CMT4TradeHistory представляет из себя массив объектов CMT4HistoryOrderInfo, наследников интерфейса CHistoryPosComponentI.// Фактически это массив исторических МТ4-ордеров.// CMT5TradeHistory представляет из себя массив объектов CMT5HistoryPositionInfoCore, наследников интерфейса CHistoryPosComponentI.// Объект CMT5HistoryPositionInfoCore не имеет прямого аналога в МТ5-терминах, это два массива ордеров и сделок, а также структура данных,// имеющуая идентификатор позиции (m_lPosID или POSITION_IDENTIFIER), тикет магик, вид позиции, и так далее, по аналогии с МТ4-ордером,// фактически, массивы ордеров и сделок - это аналоги ордеров и сделок обычной неттинговой МТ5-позиции, а структура данных - относится// к хеджевой позиции, и имеет аналог МТ4-ордера. //// Реально при запросе у позиции компоненты CHistoryPosComponentI в МТ4 мы получаем указатель на ордер (класс CMT4HistoryOrderInfo),// а в МТ5 - на ядро позиции (класс CMT5HistoryPositionInfoCore) #include <MyLib\DebugOrRelease\DebugSupport.mqh>
#include <MyLib\Common\MyObject.mqh>
#include <MyLib\Common\CurSymEnum.mq5>
#include <MyLib\Common\TrendEnums.mqh>
#include <MyLib\Trade\TradePosComponentI.mqh>
#include <MyLib\Trade\SortTradePosComponentT.mqh>
class CTSContainerI;
class CROTradeHistoryI: public CMyObject
{
public:
void CROTradeHistoryI() { SetMyObjectType(MOT_TRADE_READONLY_HISTORY_I); };
virtualvoid ~CROTradeHistoryI() {};
virtualuint GetTotalComponents() const = 0; // Получение общего числа компонентvirtual CHistoryPosComponentI* GetComponent(uint uiComponentIdx) const = 0;
virtual CHistoryPosComponentI* GetOldestOpenComponent() const = 0; // Может вернуть NULL !!!virtual CHistoryPosComponentI* GetNewestCloseComponent() const = 0; // Может вернуть NULL !!!// Функция ищет внутри истории компоненту с указанным тикетом. // В случае, если ее нет - возвращается false.// Если компонента найдена - возвращается true, и uiComponentIdx устанавливается на индекс компоненты внутри позиции.virtualbool FindComponentByTicket(long lTicket,uint &uiComponentIdx) const = 0;
// Функция анализирует историю и возвращает символ, по которому совершены сделки.// Если все выбранные сделки имеют один и тот же символ - возвращается этот символ.// Если сделки имеют разные символы или сделок нет - возвращается CS_CURRENT.// Если хотя бы один символ CS_UNKNOWN - возвращается CS_UNKNOWNvirtual ECurrencySymbol GetSymbols() const = 0;
};
class CTradeHistoryI: public CROTradeHistoryI
{
public:
void CTradeHistoryI() { SetMyObjectType(MOT_TRADE_HISTORY_I); };
virtualvoid ~CTradeHistoryI() {};
// Выбор существующей истории. // Указывается магик и символ, по которому выбираются исторические ордера, а также промежуток времени, в котором необходимо искать их.// Если ulMagic = 0 - выбираются все позиции по всем магикам.// Если ECurrencySymbol = CS_UNKNOWN - выбираются все позиции по всем символам// Если ECurrencySymbol = CS_CURRENT - запрашивается функция Symbol(), и выбираются все позиции по этому символу// ptcTSContainer - указатель на контейнер таймсерий, по которому можно определять просад для каждой позиции. Может быть NULL, в этом случае просад устанавливается нулевым.// Возвращает число компонент позиции внутри истории (может быть нулевым если ничего не найдено) или WRONG_VALUE в случае ошибок// NOTE !!! // При выборе - отложенные ордера не учитываются.virtualint Select(ulong ulMagic = 0,ECurrencySymbol csSymbol = CS_CURRENT,datetime dtFrom = MIN_DATETIME,datetime dtTill = NEVER_EXPIRES,CTSContainerI* ptcTSContainer = NULL) = 0;
// Расширенный интерфейсvirtualvoid Sort(ESortTPCMode stmMode = STM_BY_OPEN_TIME_A) = 0;
};
In generale, la classe più specifica - più commenti dovrebbe avere.
Beh, a meno che tu non abbia una mega-memoria, come Peter Konov, puoi fare a meno dei commenti.
Heh heh heh... Mi confondo quando "non si vede la foresta per gli alberi".
Solo in questo frammento - tutto sembra essere corretto, ma senza un solo commento, e come questa "ammucchiata", senza omissioni, amico, quanto è difficile da capire...
Per quanto riguarda la formattazione. È necessario inserire diversi stili. Uno è quello di MQ. Io propongo questo:
Non mi piacciono soprattutto le parentesi graffe nello stile attuale. Non capisco perché li abbiano spostati. Allineo sempre tutte le parentesi a Tab, come nel tuo esempio.
Lo uso molto spesso e densamente (è vero, non lo formatto come "quadrati", lo scrivo "così".
Ecco il mio attuale file di interfaccia della storia delle offerte. E questo non è il numero massimo di commenti.
In generale, più una classe è specifica, più commenti dovrebbe avere.
Beh, a meno che tu non abbia una mega-memoria come Peter Konov - puoi fare a meno dei commenti lì.
Il mio è simile, solo meno commenti :).
//Использование моделиclass Catboost
{
private:
staticint lng_id;//public:
//Правило сплита: предиктор больше указанного значения(true/false)struct sSplit_rule
{
uint predictor_id; //Индекс предиктораdouble border; //С чем сравнивается он
};
//Набор правил, при соответствии которым получим результат листа leafstruct sLeaf
{
double leaf; //Значение листа
sSplit_rule split_rules[]; //Набор правил
};
uint TreeDepth[]; //Глубины деревьев, глубина означает колчиство правил. В каждом правиле используется один бинарный признак.uint TreeSplits[]; //Какие бинарные признаки использует каждое деревоuint BorderCounts[]; //На сколько бинарных признаков будет разбит каждый предикторfloat Borders[]; //Пороговые значения для всех предикторов, они определяют значения бинарных признаков(0/1). Если предиктор выше значения в массиве, будет 1, иначе 0.double LeafValues[]; //Результаты деревьев для каждого сочетания используемых бинарных признаковuint features_pos[]; //Откуда взялась бинарная фича.Указывается индекс.
~Catboost(void);
Catboost();
//Создание экземпляра класса (инициализация конкретной модели)
Catboost(uint &TreeDepth_[],uint &TreeSplits_[],uint &BorderCounts_[],float &Borders_[],double &LeafValues_[]);
//Приеменение модели//features -предикторыdouble ApplyCatboostModel(constdouble &features[]);
//Приеменение модели.Модель передаётся через массивыstaticdouble ApplyCatboostModel(constdouble &features[],uint &TreeDepth_[],uint &TreeSplits_[],uint &BorderCounts_[],float &Borders_[],double &LeafValues_[]);
//Применение модели с сохранением данных о влиянии предикторов на результатdouble ApplyCatboostModel_data(constdouble &features[],datetime time);
long data_counter; //Счётчик выполнения функции ApplyCatboostModel_data
CSV *csv_tree_rules; //Сюда сохраняются все сработанные правила, результаты деревьев
CSV *csv_model_rules; //Сюда сохраняются правила, которые сработали во всей модели.перекрывающиеся правила будут удаляться//Перобразование модели CatBoost с исходников C++ в MQLstaticbool CatBoost_model_to_MQL(string input_file_cpp,string output_file_mql);
//Чтение модели с файла исходника C++bool Model_read_from_file(string input_file_cpp);
//Получение полного списка правил для каждого листа leaf_rules_outvoid Get_leaf_rules(sLeaf &leaf_rules_out[]);
};
int Catboost::lng_id=cLng::Set_users_errors_messages("Catboost",Catboost_lngs,Catboost_strings);
"Spalmare" i commenti su tutta la lista, come si suppone a me, non è di mio gradimento.
Sarebbe bello se ci fosse un'opzione per disattivarlo:
Ottimizzo in un tester di strategia, al completamento, OnTesterDeinit() viene eseguito per analizzare i risultati, o semplicemente per raccogliere dati. In questo momento, il tester di strategia passa allo stato come se tutto fosse finito, ma in questo momento, l'elaborazione finale dei dati può ancora avvenire in background per molto tempo. Quando la finestra con il grafico del simbolo viene chiusa, l'Expert Advisor verrà chiuso forzatamente.
Descriviamo anche la situazione in cui OnTesterDeinit() sta scrivendo in un file pensando che l'ottimizzazione corrente sia finita, iniziamo la prossima con intervalli minimi di parametri che vengono calcolati rapidamente. Come risultato abbiamo che l'esecuzione precedente non è completata e quella nuova è nella stessa fase, nel nostro esempio porta a un errore di accesso in scrittura ai file, o semplicemente a un mishmash nel file, e visivamente non è rintracciabile, solo attraverso load manager o file.... Vorrei poter vedere nel tester che questa operazione non è ancora completa.
Ottimizzo in un tester di strategia, al completamento, OnTesterDeinit() viene eseguito per analizzare i risultati, o semplicemente per raccogliere dati. In questo momento, il tester di strategia passa allo stato come se tutto fosse finito, ma in questo momento, l'elaborazione finale dei dati può ancora avvenire in background per molto tempo. Quando la finestra con il grafico del simbolo viene chiusa, l'Expert Advisor verrà chiuso forzatamente.
Descriviamo un'altra situazione in cui la scrittura nel file viene fatta in OnTesterDeinit() pensando che l'ottimizzazione corrente sia finita, iniziamo la prossima con intervalli minimi di parametri che vengono calcolati rapidamente. Come risultato abbiamo che l'esecuzione precedente non è completata e quella nuova è nella stessa fase, nel nostro esempio porta a un errore di accesso in scrittura ai file, o semplicemente a un mishmash nel file, e visivamente non è rintracciabile, solo attraverso load manager o file.... Vorrei poter vedere nel tester che questa operazione non è ancora completa.
Quando si ottimizza si apre una nuova finestra del grafico - possiamo usare l'id del grafico per capire la fine dell'operazione? Sembra che ci sia un'opzione di chiusura del grafico, quindi dopo la fine dei calcoli in OnTesterDeinit() la finestra può essere chiusa e alla fine abbiamo solo bisogno di monitorare la presenza del grafico aperto all'inizio dell'ottimizzazione, non appena è scomparso - il tester è pronto per una nuova ottimizzazione.
Quando l'ottimizzazione apre una nuova finestra del grafico - c'è un modo per scoprire la fine del lavoro per id del grafico? Sembra che ci sia un'opzione per chiudere il grafico, quindi dopo la fine dei calcoli in OnTesterDeinit() la finestra può essere chiusa, e alla fine abbiamo solo bisogno di monitorare la presenza del grafico aperto all'inizio dell'ottimizzazione, quando è scomparso - il tester è pronto per una nuova ottimizzazione.
Quindi, questo codice deve essere cambiato, ma se non ci fosse questa possibilità?
Quindi devi cambiare il codice, ma se non ci riesci?
Allora non c'è modo. Questa è una situazione controversa, da un lato l'ottimizzatore è libero e pronto per ulteriori lavori, ma dall'altro lato ci può essere una sovrapposizione - la decisione dipende dalla situazione.
Mi chiedo, quante persone usano i commenti alle funzioni (classi, strutture...) usando esattamente questo design a sinistra?
Lo uso molto spesso e densamente (è vero, non lo formatto come "quadrati", lo scrivo "così".
Ecco il mio attuale file di interfaccia della storia delle offerte. E questo non è il numero massimo di commenti.
In generale, la classe più specifica - più commenti dovrebbe avere.
Beh, a meno che tu non abbia una mega-memoria, come Peter Konov, puoi fare a meno dei commenti.
Sì, a chi piace quello che piace. Personalmente, non posso vedere il codice così ben formattato da non poter vedere il codice stesso.
Forse padroneggiareVisual Studio Code sarebbe una buona soluzione.
Heh heh heh... Mi confondo quando "non si vede la foresta per gli alberi".
Solo in questo frammento - tutto sembra essere corretto, ma senza un solo commento, e come questa "ammucchiata", senza omissioni, amico, quanto è difficile da capire...
Cancello subito questo tipo di commento, perché ostruisce gli occhi e scrivo così
Ecco! Sì.
Per funzioni brevi e semplici, lo stile di commento più normale, secondo me.
Metterò i miei cinque centesimi.
Per quanto riguarda la formattazione. È necessario inserire diversi stili. Uno è quello di MQ. Io propongo questo:
Metterò i miei cinque centesimi.
Per quanto riguarda la formattazione. È necessario inserire diversi stili. Uno è quello di MQ. Io propongo questo:
Non mi piacciono soprattutto le parentesi graffe nello stile attuale. Non capisco perché li abbiano spostati. Allineo sempre tutte le parentesi a Tab, come nel tuo esempio.
Lo uso molto spesso e densamente (è vero, non lo formatto come "quadrati", lo scrivo "così".
Ecco il mio attuale file di interfaccia della storia delle offerte. E questo non è il numero massimo di commenti.
In generale, più una classe è specifica, più commenti dovrebbe avere.
Beh, a meno che tu non abbia una mega-memoria come Peter Konov - puoi fare a meno dei commenti lì.
Il mio è simile, solo meno commenti :).
"Spalmare" i commenti su tutta la lista, come si suppone a me, non è di mio gradimento.
Sarebbe bello se ci fosse un'opzione per disattivarlo:
Puoi dirmi esattamente come ci metti i commenti? Lo modifica manualmente? C'è una combinazione segreta?
Ecco la situazione:
Ottimizzo in un tester di strategia, al completamento, OnTesterDeinit() viene eseguito per analizzare i risultati, o semplicemente per raccogliere dati. In questo momento, il tester di strategia passa allo stato come se tutto fosse finito, ma in questo momento, l'elaborazione finale dei dati può ancora avvenire in background per molto tempo. Quando la finestra con il grafico del simbolo viene chiusa, l'Expert Advisor verrà chiuso forzatamente.
Descriviamo anche la situazione in cui OnTesterDeinit() sta scrivendo in un file pensando che l'ottimizzazione corrente sia finita, iniziamo la prossima con intervalli minimi di parametri che vengono calcolati rapidamente. Come risultato abbiamo che l'esecuzione precedente non è completata e quella nuova è nella stessa fase, nel nostro esempio porta a un errore di accesso in scrittura ai file, o semplicemente a un mishmash nel file, e visivamente non è rintracciabile, solo attraverso load manager o file.... Vorrei poter vedere nel tester che questa operazione non è ancora completa.
Ecco la situazione:
Ottimizzo in un tester di strategia, al completamento, OnTesterDeinit() viene eseguito per analizzare i risultati, o semplicemente per raccogliere dati. In questo momento, il tester di strategia passa allo stato come se tutto fosse finito, ma in questo momento, l'elaborazione finale dei dati può ancora avvenire in background per molto tempo. Quando la finestra con il grafico del simbolo viene chiusa, l'Expert Advisor verrà chiuso forzatamente.
Descriviamo un'altra situazione in cui la scrittura nel file viene fatta in OnTesterDeinit() pensando che l'ottimizzazione corrente sia finita, iniziamo la prossima con intervalli minimi di parametri che vengono calcolati rapidamente. Come risultato abbiamo che l'esecuzione precedente non è completata e quella nuova è nella stessa fase, nel nostro esempio porta a un errore di accesso in scrittura ai file, o semplicemente a un mishmash nel file, e visivamente non è rintracciabile, solo attraverso load manager o file.... Vorrei poter vedere nel tester che questa operazione non è ancora completa.
Quando si ottimizza si apre una nuova finestra del grafico - possiamo usare l'id del grafico per capire la fine dell'operazione? Sembra che ci sia un'opzione di chiusura del grafico, quindi dopo la fine dei calcoli in OnTesterDeinit() la finestra può essere chiusa e alla fine abbiamo solo bisogno di monitorare la presenza del grafico aperto all'inizio dell'ottimizzazione, non appena è scomparso - il tester è pronto per una nuova ottimizzazione.
Quando l'ottimizzazione apre una nuova finestra del grafico - c'è un modo per scoprire la fine del lavoro per id del grafico? Sembra che ci sia un'opzione per chiudere il grafico, quindi dopo la fine dei calcoli in OnTesterDeinit() la finestra può essere chiusa, e alla fine abbiamo solo bisogno di monitorare la presenza del grafico aperto all'inizio dell'ottimizzazione, quando è scomparso - il tester è pronto per una nuova ottimizzazione.
Quindi, questo codice deve essere cambiato, ma se non ci fosse questa possibilità?
Quindi devi cambiare il codice, ma se non ci riesci?
Allora non c'è modo. Questa è una situazione controversa, da un lato l'ottimizzatore è libero e pronto per ulteriori lavori, ma dall'altro lato ci può essere una sovrapposizione - la decisione dipende dalla situazione.