Aliaksandr Hryshyn: Me pregunto, ¿cuántas personas utilizan los comentarios a las funciones (clases, estructuras...) utilizando exactamente este diseño a la izquierda?
Lo utilizo muy a menudo y de forma densa (es cierto que no lo formateo como "cuadrados", lo escribo "a secas".
Aquí está mi archivo de interfaz del historial de pujas actual. Y no es el número máximo de comentarios.
// С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;
};
En general, cuanto más específica sea la clase, más comentarios debería tener.
Bueno, a no ser que tengas megamemoria, como Peter Konov, puedes prescindir de los comentarios.
Je, je, je... Me confunde cuando "no se puede ver el bosque por los árboles".
Sólo en este fragmento - todo parece correcto, pero sin un solo comentario, y como este "amontonamiento", sin omisiones, hombre, qué difícil es de entender...
En cuanto al formato. Es necesario introducir varios estilos. Uno es el de MQ. Propongo esta:
No me gustan la mayoría de los corchetes en el estilo actual. No entiendo por qué los han movido. Siempre alineo todos los corchetes con el tabulador, como en tu ejemplo.
Lo utilizo muy a menudo y de forma densa (es cierto que no lo formateo como "cuadrados", lo escribo "a secas".
Aquí está mi archivo de interfaz del historial de pujas actual. Y no es el número máximo de comentarios.
En general, cuanto más específica sea una clase, más comentarios debería tener.
Bueno, a no ser que tengas una megamemoria como la de Peter Konov, ahí puedes prescindir de los comentarios.
El mío es similar, sólo que con menos comentarios :).
//Использование модели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);
"Embadurnar" los comentarios en todo el listado, como se supone a mí, no es de mi agrado.
Estaría bien que hubiera una opción para desactivar esto:
Optimizo en un probador de estrategias, al finalizar, se ejecuta OnTesterDeinit() para analizar los resultados, o simplemente para recoger datos. En este momento, el probador de estrategias pasa al estado como si todo hubiera terminado, pero en este momento, el procesamiento final de los datos todavía puede tener lugar en el fondo durante mucho tiempo. Cuando se cierra la ventana con el gráfico de símbolos, el Asesor Experto se cierra forzosamente.
Describamos también la situación cuando OnTesterDeinit() está escribiendo en un archivo pensando que la optimización actual ha terminado, comenzamos la siguiente con rangos mínimos de parámetros que se calculan rápidamente. Como resultado tenemos que la ejecución anterior no se ha completado y la nueva está en la misma etapa, en nuestro ejemplo conduce a un error de acceso de escritura a los archivos, o simplemente a un desorden en el archivo, y visualmente no es rastreable, sólo a través del gestor de carga o archivo.... Me gustaría poder ver en el probador que esta operación aún no se ha completado.
Optimizo en un probador de estrategias, al finalizar, se ejecuta OnTesterDeinit() para analizar los resultados, o simplemente para recoger datos. En este momento, el probador de estrategias pasa al estado como si todo hubiera terminado, pero en este momento, el procesamiento final de los datos todavía puede tener lugar en el fondo durante mucho tiempo. Cuando se cierre la ventana con el gráfico de símbolos, el Asesor Experto se cerrará forzosamente.
Describamos otra situación cuando la escritura en el archivo se realiza en OnTesterDeinit() pensando que la optimización actual ha terminado, iniciamos la siguiente con rangos mínimos de parámetros que se calculan rápidamente. Como resultado tenemos que la ejecución anterior no se ha completado y la nueva está en la misma etapa, en nuestro ejemplo conduce a un error de acceso de escritura a los archivos, o simplemente a un desorden en el archivo, y visualmente no es rastreable, sólo a través del gestor de carga o archivo.... Me gustaría poder ver en el probador que esta operación aún no se ha completado.
Al optimizar, se abre una nueva ventana de gráfico: ¿podemos utilizar el identificador de gráfico para averiguar el final de la operación? Parece que hay una opción de cerrar el gráfico, entonces después de la finalización de los cálculos en OnTesterDeinit() la ventana se puede cerrar y, finalmente, sólo tenemos que controlar la presencia del gráfico abierto en el inicio de la optimización, tan pronto como ha desaparecido - el probador está listo para una nueva optimización.
Cuando la optimización abre una nueva ventana de gráfico, ¿hay alguna forma de averiguar el final del trabajo por el identificador del gráfico? Parece que hay una opción de cerrar el gráfico, entonces después de la finalización de los cálculos en OnTesterDeinit() se puede cerrar la ventana, y al final sólo tenemos que controlar la presencia del gráfico abierto al inicio de la optimización, cuando ha desaparecido - el probador está listo para una nueva optimización.
Por lo tanto, este código debe ser cambiado, pero ¿qué pasa si no existe tal posibilidad?
Así que hay que cambiar el código, pero ¿y si no se puede?
Entonces no hay manera. Esta es una situación controvertida, por un lado el optimizador está libre y listo para seguir trabajando, pero por otro lado puede haber un solapamiento - la decisión depende de la situación.
Me pregunto, ¿cuántas personas utilizan los comentarios a las funciones (clases, estructuras...) utilizando exactamente este diseño a la izquierda?
Lo utilizo muy a menudo y de forma densa (es cierto que no lo formateo como "cuadrados", lo escribo "a secas".
Aquí está mi archivo de interfaz del historial de pujas actual. Y no es el número máximo de comentarios.
En general, cuanto más específica sea la clase, más comentarios debería tener.
Bueno, a no ser que tengas megamemoria, como Peter Konov, puedes prescindir de los comentarios.
Sí, a quien le gusta lo que le gusta. Personalmente, no puedo ver el código tan bien formateado como para no ver el código en sí.
Quizás dominarVisual Studio Code sería una buena solución.
Je, je, je... Me confunde cuando "no se puede ver el bosque por los árboles".
Sólo en este fragmento - todo parece correcto, pero sin un solo comentario, y como este "amontonamiento", sin omisiones, hombre, qué difícil es de entender...
Este tipo de comentarios los borro enseguida, ya que tapan los ojos y escribo así
¡Allí! Sí.
Para funciones cortas y sencillas, el estilo de comentario más normal, en mi opinión.
Voy a poner mis cinco centavos.
En cuanto al formato. Es necesario introducir varios estilos. Uno es el de MQ. Propongo esta:
Voy a poner mis cinco centavos.
En cuanto al formato. Es necesario introducir varios estilos. Uno es el de MQ. Propongo esta:
No me gustan la mayoría de los corchetes en el estilo actual. No entiendo por qué los han movido. Siempre alineo todos los corchetes con el tabulador, como en tu ejemplo.
Lo utilizo muy a menudo y de forma densa (es cierto que no lo formateo como "cuadrados", lo escribo "a secas".
Aquí está mi archivo de interfaz del historial de pujas actual. Y no es el número máximo de comentarios.
En general, cuanto más específica sea una clase, más comentarios debería tener.
Bueno, a no ser que tengas una megamemoria como la de Peter Konov, ahí puedes prescindir de los comentarios.
El mío es similar, sólo que con menos comentarios :).
"Embadurnar" los comentarios en todo el listado, como se supone a mí, no es de mi agrado.
Estaría bien que hubiera una opción para desactivar esto:
¿Puedes decirme exactamente cómo pones los comentarios en ellos? ¿Lo editas manualmente? ¿Hay una combinación secreta?
Esta es la situación:
Optimizo en un probador de estrategias, al finalizar, se ejecuta OnTesterDeinit() para analizar los resultados, o simplemente para recoger datos. En este momento, el probador de estrategias pasa al estado como si todo hubiera terminado, pero en este momento, el procesamiento final de los datos todavía puede tener lugar en el fondo durante mucho tiempo. Cuando se cierra la ventana con el gráfico de símbolos, el Asesor Experto se cierra forzosamente.
Describamos también la situación cuando OnTesterDeinit() está escribiendo en un archivo pensando que la optimización actual ha terminado, comenzamos la siguiente con rangos mínimos de parámetros que se calculan rápidamente. Como resultado tenemos que la ejecución anterior no se ha completado y la nueva está en la misma etapa, en nuestro ejemplo conduce a un error de acceso de escritura a los archivos, o simplemente a un desorden en el archivo, y visualmente no es rastreable, sólo a través del gestor de carga o archivo.... Me gustaría poder ver en el probador que esta operación aún no se ha completado.
Esta es la situación:
Optimizo en un probador de estrategias, al finalizar, se ejecuta OnTesterDeinit() para analizar los resultados, o simplemente para recoger datos. En este momento, el probador de estrategias pasa al estado como si todo hubiera terminado, pero en este momento, el procesamiento final de los datos todavía puede tener lugar en el fondo durante mucho tiempo. Cuando se cierre la ventana con el gráfico de símbolos, el Asesor Experto se cerrará forzosamente.
Describamos otra situación cuando la escritura en el archivo se realiza en OnTesterDeinit() pensando que la optimización actual ha terminado, iniciamos la siguiente con rangos mínimos de parámetros que se calculan rápidamente. Como resultado tenemos que la ejecución anterior no se ha completado y la nueva está en la misma etapa, en nuestro ejemplo conduce a un error de acceso de escritura a los archivos, o simplemente a un desorden en el archivo, y visualmente no es rastreable, sólo a través del gestor de carga o archivo.... Me gustaría poder ver en el probador que esta operación aún no se ha completado.
Al optimizar, se abre una nueva ventana de gráfico: ¿podemos utilizar el identificador de gráfico para averiguar el final de la operación? Parece que hay una opción de cerrar el gráfico, entonces después de la finalización de los cálculos en OnTesterDeinit() la ventana se puede cerrar y, finalmente, sólo tenemos que controlar la presencia del gráfico abierto en el inicio de la optimización, tan pronto como ha desaparecido - el probador está listo para una nueva optimización.
Cuando la optimización abre una nueva ventana de gráfico, ¿hay alguna forma de averiguar el final del trabajo por el identificador del gráfico? Parece que hay una opción de cerrar el gráfico, entonces después de la finalización de los cálculos en OnTesterDeinit() se puede cerrar la ventana, y al final sólo tenemos que controlar la presencia del gráfico abierto al inicio de la optimización, cuando ha desaparecido - el probador está listo para una nueva optimización.
Por lo tanto, este código debe ser cambiado, pero ¿qué pasa si no existe tal posibilidad?
Así que hay que cambiar el código, pero ¿y si no se puede?
Entonces no hay manera. Esta es una situación controvertida, por un lado el optimizador está libre y listo para seguir trabajando, pero por otro lado puede haber un solapamiento - la decisión depende de la situación.