Aliaksandr Hryshyn: Ich frage mich, wie viele Leute Kommentare zu Funktionen (Klassen, Strukturen...) mit genau diesem Design auf der linken Seite verwenden?
Ich verwende sie sehr häufig und dicht (Ich formatiere sie zwar nicht als "Quadrate", aber ich schreibe sie "einfach so".
Hier ist meine aktuelle Bietungshistorie als Schnittstellendatei, und das ist nicht die maximale Anzahl von Kommentaren.
// С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;
};
Im Allgemeinen gilt: Je spezifischer die Klasse, desto mehr Kommentare sollte sie haben.
Nun, wenn Sie nicht über einen Mega-Speicher verfügen, wie Peter Konov, können Sie auf Kommentare verzichten.
Ja, wer mag schon, was er mag. Ich persönlich kann nicht sehen, dass der Code so gut formatiert ist, dass ich den Code selbst nicht sehen kann.
Vielleicht wäre die Beherrschung vonVisual Studio Code eine gute Lösung.
Heh heh heh... Es verwirrt mich, wenn man "den Wald vor lauter Bäumen nicht sieht".
Nur in diesem Fragment - alles scheint richtig zu sein, aber ohne einen einzigen Kommentar, und wie diese "Anhäufung", ohne Auslassungen, Mann, wie schwer ist es zu verstehen...
Was die Formatierung betrifft. Sie müssen mehrere Stile eingeben. Die eine ist die von MQ. Ich schlage dies vor:
Ich mag die geschweiften Klammern im aktuellen Stil nicht. Ich verstehe nicht, warum sie sie verlegt haben. Ich richte alle Klammern immer an Tabulator aus, wie in Ihrem Beispiel.
Ich verwende sie sehr häufig und dicht (Ich formatiere sie zwar nicht als "Quadrate", aber ich schreibe sie "einfach so".
Hier ist meine aktuelle Bietungshistorie als Schnittstellendatei, und das ist nicht die maximale Anzahl von Kommentaren.
Im Allgemeinen gilt: Je spezifischer eine Klasse ist, desto mehr Kommentare sollte sie haben.
Es sei denn, Sie haben ein Mega-Gedächtnis wie Peter Konov - dann können Sie auf Kommentare verzichten.
Meine ist ähnlich, nur weniger Kommentare :).
//Использование модели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);
Das "Verschmieren" von Kommentaren in der gesamten Auflistung, wie es mir unterstellt wird, ist nicht nach meinem Geschmack.
Es wäre schön, wenn es eine Option gäbe, um dies zu deaktivieren:
Ich optimiere in einem Strategietester, nach Abschluss wird OnTesterDeinit() ausgeführt, um die Ergebnisse zu analysieren oder einfach nur Daten zu sammeln. In diesem Moment geht der Strategietester in den Zustand über, als ob alles fertig wäre, aber zu diesem Zeitpunkt kann die endgültige Datenverarbeitung noch lange im Hintergrund stattfinden. Wenn das Fenster mit dem Symbolchart geschlossen wird, wird der Expert Advisor zwangsweise geschlossen.
Beschreiben wir auch die Situation, wenn OnTesterDeinit() in eine Datei schreibt und denkt, dass die aktuelle Optimierung beendet ist, beginnen wir die nächste mit minimalen Parameterbereichen, die schnell berechnet werden. Das Ergebnis ist, dass der vorherige Lauf nicht abgeschlossen ist und der neue auf der gleichen Stufe ist. In unserem Beispiel führt das zu einem Fehler beim Schreibzugriff auf Dateien oder einfach zu einem Mischmasch in der Datei, und visuell ist das nicht nachvollziehbar, nur durch den Lastmanager oder file.... Ich möchte im Prüfgerät sehen können, dass dieser Vorgang noch nicht abgeschlossen ist.
Ich optimiere in einem Strategietester, nach Abschluss wird OnTesterDeinit() ausgeführt, um die Ergebnisse zu analysieren oder einfach nur Daten zu sammeln. In diesem Moment geht der Strategietester in den Zustand über, als ob alles fertig wäre, aber zu diesem Zeitpunkt kann die endgültige Datenverarbeitung noch lange im Hintergrund stattfinden. Wenn das Fenster mit dem Symbolchart geschlossen wird, wird der Expert Advisor zwangsweise geschlossen.
Beschreiben wir auch die Situation, wenn OnTesterDeinit() in eine Datei schreibt und denkt, dass die aktuelle Optimierung beendet ist, beginnen wir die nächste mit minimalen Parameterbereichen, die schnell berechnet werden. Das Ergebnis ist, dass der vorherige Lauf nicht abgeschlossen ist und der neue auf der gleichen Stufe ist. In unserem Beispiel führt das zu einem Fehler beim Schreibzugriff auf Dateien oder einfach zu einem Mischmasch in der Datei, und visuell ist das nicht nachvollziehbar, nur durch den Lastmanager oder file.... Ich möchte im Prüfgerät sehen können, dass dieser Vorgang noch nicht abgeschlossen ist.
Bei der Optimierung öffnet sich ein neues Diagrammfenster - können wir die Diagramm-ID verwenden, um das Ende des Vorgangs zu ermitteln? Es scheint, dass es eine Option zum Schließen des Diagramms, dann nach dem Ende der Berechnungen in OnTesterDeinit() das Fenster geschlossen werden kann und schließlich müssen wir nur das Vorhandensein des Diagramms offen zu Beginn der Optimierung zu überwachen, sobald es verschwunden ist - der Tester ist bereit für eine neue Optimierung.
Wenn die Optimierung ein neues Diagrammfenster öffnet - gibt es eine Möglichkeit, das Ende der Arbeit anhand der Diagramm-ID zu ermitteln? Es scheint, dass es eine Option zum Schließen des Diagramms, dann nach dem Ende der Berechnungen in OnTesterDeinit() das Fenster geschlossen werden kann, und am Ende müssen wir nur das Vorhandensein des Diagramms offen zu Beginn der Optimierung zu überwachen, sobald es verschwunden ist - der Tester ist bereit für eine neue Optimierung.
Dieser Code muss also geändert werden, aber was, wenn es keine solche Möglichkeit gibt?
Sie müssen also den Code ändern, aber was, wenn Sie das nicht können?
Dann gibt es keinen Weg. Dies ist eine kontroverse Situation, einerseits ist der Optimierer frei und bereit für weitere Arbeit, andererseits kann es zu Überschneidungen kommen - die Entscheidung hängt von der Situation ab.
Ich frage mich, wie viele Leute Kommentare zu Funktionen (Klassen, Strukturen...) mit genau diesem Design auf der linken Seite verwenden?
Ich verwende sie sehr häufig und dicht (Ich formatiere sie zwar nicht als "Quadrate", aber ich schreibe sie "einfach so".
Hier ist meine aktuelle Bietungshistorie als Schnittstellendatei, und das ist nicht die maximale Anzahl von Kommentaren.
Im Allgemeinen gilt: Je spezifischer die Klasse, desto mehr Kommentare sollte sie haben.
Nun, wenn Sie nicht über einen Mega-Speicher verfügen, wie Peter Konov, können Sie auf Kommentare verzichten.
Ja, wer mag schon, was er mag. Ich persönlich kann nicht sehen, dass der Code so gut formatiert ist, dass ich den Code selbst nicht sehen kann.
Vielleicht wäre die Beherrschung vonVisual Studio Code eine gute Lösung.
Heh heh heh... Es verwirrt mich, wenn man "den Wald vor lauter Bäumen nicht sieht".
Nur in diesem Fragment - alles scheint richtig zu sein, aber ohne einen einzigen Kommentar, und wie diese "Anhäufung", ohne Auslassungen, Mann, wie schwer ist es zu verstehen...
Ich lösche diese Art von Kommentaren sofort, da sie die Augen verstopfen, und ich schreibe wie folgt
So! Ja.
Für kurze und einfache Funktionen ist dies meiner Meinung nach der normalste Kommentarstil.
Ich werde meine fünf Cent dazugeben.
Was die Formatierung betrifft. Sie müssen mehrere Stile eingeben. Die eine ist die von MQ. Ich schlage dies vor:
Ich werde meine fünf Cent dazugeben.
Was die Formatierung betrifft. Sie müssen mehrere Stile eingeben. Die eine ist die von MQ. Ich schlage dies vor:
Ich mag die geschweiften Klammern im aktuellen Stil nicht. Ich verstehe nicht, warum sie sie verlegt haben. Ich richte alle Klammern immer an Tabulator aus, wie in Ihrem Beispiel.
Ich verwende sie sehr häufig und dicht (Ich formatiere sie zwar nicht als "Quadrate", aber ich schreibe sie "einfach so".
Hier ist meine aktuelle Bietungshistorie als Schnittstellendatei, und das ist nicht die maximale Anzahl von Kommentaren.
Im Allgemeinen gilt: Je spezifischer eine Klasse ist, desto mehr Kommentare sollte sie haben.
Es sei denn, Sie haben ein Mega-Gedächtnis wie Peter Konov - dann können Sie auf Kommentare verzichten.
Meine ist ähnlich, nur weniger Kommentare :).
Das "Verschmieren" von Kommentaren in der gesamten Auflistung, wie es mir unterstellt wird, ist nicht nach meinem Geschmack.
Es wäre schön, wenn es eine Option gäbe, um dies zu deaktivieren:
Können Sie mir genau sagen, wie Sie die Kommentare einfügen? Bearbeiten Sie sie manuell? Gibt es eine geheime Kombination?
Die Situation ist wie folgt:
Ich optimiere in einem Strategietester, nach Abschluss wird OnTesterDeinit() ausgeführt, um die Ergebnisse zu analysieren oder einfach nur Daten zu sammeln. In diesem Moment geht der Strategietester in den Zustand über, als ob alles fertig wäre, aber zu diesem Zeitpunkt kann die endgültige Datenverarbeitung noch lange im Hintergrund stattfinden. Wenn das Fenster mit dem Symbolchart geschlossen wird, wird der Expert Advisor zwangsweise geschlossen.
Beschreiben wir auch die Situation, wenn OnTesterDeinit() in eine Datei schreibt und denkt, dass die aktuelle Optimierung beendet ist, beginnen wir die nächste mit minimalen Parameterbereichen, die schnell berechnet werden. Das Ergebnis ist, dass der vorherige Lauf nicht abgeschlossen ist und der neue auf der gleichen Stufe ist. In unserem Beispiel führt das zu einem Fehler beim Schreibzugriff auf Dateien oder einfach zu einem Mischmasch in der Datei, und visuell ist das nicht nachvollziehbar, nur durch den Lastmanager oder file.... Ich möchte im Prüfgerät sehen können, dass dieser Vorgang noch nicht abgeschlossen ist.
Die Situation ist wie folgt:
Ich optimiere in einem Strategietester, nach Abschluss wird OnTesterDeinit() ausgeführt, um die Ergebnisse zu analysieren oder einfach nur Daten zu sammeln. In diesem Moment geht der Strategietester in den Zustand über, als ob alles fertig wäre, aber zu diesem Zeitpunkt kann die endgültige Datenverarbeitung noch lange im Hintergrund stattfinden. Wenn das Fenster mit dem Symbolchart geschlossen wird, wird der Expert Advisor zwangsweise geschlossen.
Beschreiben wir auch die Situation, wenn OnTesterDeinit() in eine Datei schreibt und denkt, dass die aktuelle Optimierung beendet ist, beginnen wir die nächste mit minimalen Parameterbereichen, die schnell berechnet werden. Das Ergebnis ist, dass der vorherige Lauf nicht abgeschlossen ist und der neue auf der gleichen Stufe ist. In unserem Beispiel führt das zu einem Fehler beim Schreibzugriff auf Dateien oder einfach zu einem Mischmasch in der Datei, und visuell ist das nicht nachvollziehbar, nur durch den Lastmanager oder file.... Ich möchte im Prüfgerät sehen können, dass dieser Vorgang noch nicht abgeschlossen ist.
Bei der Optimierung öffnet sich ein neues Diagrammfenster - können wir die Diagramm-ID verwenden, um das Ende des Vorgangs zu ermitteln? Es scheint, dass es eine Option zum Schließen des Diagramms, dann nach dem Ende der Berechnungen in OnTesterDeinit() das Fenster geschlossen werden kann und schließlich müssen wir nur das Vorhandensein des Diagramms offen zu Beginn der Optimierung zu überwachen, sobald es verschwunden ist - der Tester ist bereit für eine neue Optimierung.
Wenn die Optimierung ein neues Diagrammfenster öffnet - gibt es eine Möglichkeit, das Ende der Arbeit anhand der Diagramm-ID zu ermitteln? Es scheint, dass es eine Option zum Schließen des Diagramms, dann nach dem Ende der Berechnungen in OnTesterDeinit() das Fenster geschlossen werden kann, und am Ende müssen wir nur das Vorhandensein des Diagramms offen zu Beginn der Optimierung zu überwachen, sobald es verschwunden ist - der Tester ist bereit für eine neue Optimierung.
Dieser Code muss also geändert werden, aber was, wenn es keine solche Möglichkeit gibt?
Sie müssen also den Code ändern, aber was, wenn Sie das nicht können?
Dann gibt es keinen Weg. Dies ist eine kontroverse Situation, einerseits ist der Optimierer frei und bereit für weitere Arbeit, andererseits kann es zu Überschneidungen kommen - die Entscheidung hängt von der Situation ab.