Discusión sobre el artículo "Implementando OLAP en la negociación (Parte 4): Análisis cuantitativo y visual de los informes del Simulador de estrategias"
Cuando analizaba el código del artículo, tenía la sensación constante de que no sería capaz ni de acercarme a un nivel tan alto. Desgraciadamente, no pude entenderlo debido a mi incompetencia.
Pido al autor que muestre (código listo), a modo de ejemplo, cómo añadir esta funcionalidad al conjunto de herramientas presentado?
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.
fxsaber, 2020.01.14 11:42 AM
uchar Bytes2[]; if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Si fuera posible leer el último registro de caché de una sola ejecución { const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Condúcelo al objeto correspondiente.
fxsaber, 2019.11.11 04:45 pm.
uchar Bytes[]; MTTESTER::GetLastOptCache(Bytes); // TESTERCACHE<TestCacheSymbolRecord> Cache; // Optimización de símbolos TESTERCACHE<ExpTradeSummary> Cache; // Optimización estándar if (Cache.Load(Bytes)) // Leer la caché de optimización.
Por favor, aclare la pregunta. SingleTesterCache y TesterCache ya están conectados en el artículo.
Quiero ejecutar EX5 y que recoja automáticamente el último archivo opt/tst (la última tarea correspondiente ejecutada en Tester) para su análisis.
Quiero ejecutar EX5 y que recoja automáticamente el último archivo opt/tst (el último trabajo correspondiente ejecutado en Tester) para su análisis.
He aquí una variante para una ejecución independiente.
//+------------------------------------------------------------------+ //|TSTcube.mqh || //|Copyright (c) 2020, Marketeer || //| https://www.mql5.com/en/users/marketeer | //| Procesamiento analítico en línea de hipercubos comerciales | //| https://www.mql5.com/es/articles/6602 | //| https://www.mql5.com/es/articles/6603 | //| https://www.mql5.com/es/articles/7656 | //|rev. 5.03.2020 | //+------------------------------------------------------------------+ #include "ReportCubeBase.mqh" #include <fxsaber/SingleTesterCache/SingleTesterCache.mqh> #include <fxsaber/MultiTester/MTTester.mqh> // + class TesterDeal: public Deal { public: TesterDeal(const TradeDeal &td) { time = (datetime)td.time_create + TimeShift; price = td.price_open; string t = dealType(td.action); type = t == "buy" ? +1 : (t == "sell" ? -1 : 0); t = dealDir(td.entry); direction = 0; if(StringFind(t, "in") > -1) ++direction; if(StringFind(t, "out") > -1) --direction; volume = (double)td.volume; profit = td.profit; deal = (long)td.deal; order = (long)td.order; comment = td.comment[]; symbol = td.symbol[]; commission = td.commission; swap = td.storage; // saldo - SingleTesterCache.Deals[i].reserve } static string dealType(const ENUM_DEAL_TYPE type) { return type == DEAL_TYPE_BUY ? "buy" : (type == DEAL_TYPE_SELL ? "sell" : "balance"); } static string dealDir(const ENUM_DEAL_ENTRY entry) { string result = ""; if(entry == DEAL_ENTRY_IN) result += "in"; else if(entry == DEAL_ENTRY_OUT || entry == DEAL_ENTRY_OUT_BY) result += "out"; else if(entry == DEAL_ENTRY_INOUT) result += "in out"; return result; } }; template<typename T> class TesterReportAdapter: public BaseReportAdapter<T> { protected: SINGLETESTERCACHE *ptrSingleTesterCache; virtual bool fillDealsArray() override { for(int i = 0; i < ArraySize(ptrSingleTesterCache.Deals); i++) { if(TesterDeal::dealType(ptrSingleTesterCache.Deals[i].action) == "balance") { balance += ptrSingleTesterCache.Deals[i].profit; } else { array << new TesterDeal(ptrSingleTesterCache.Deals[i]); } } return true; } public: ~TesterReportAdapter() { if(CheckPointer(ptrSingleTesterCache) == POINTER_DYNAMIC) delete ptrSingleTesterCache; } virtual bool load(const string file) override { if(StringFind(file, ".tst") > 0) { BaseReportAdapter<T>::load(file); if(CheckPointer(ptrSingleTesterCache) == POINTER_DYNAMIC) delete ptrSingleTesterCache; bool loaded = true; // + ptrSingleTesterCache = new SINGLETESTERCACHE(); if(file == "*.tst") // + { // + uchar Bytes2[]; // + // ¿Por qué MTTESTER::GetLastTstCacheFileName() es privada? // + // Imprimir("Cargando ", MTTESTER::GetLastTstCacheFileName()); // + if(MTTESTER::GetLastTstCache(Bytes2) != -1) // + { // + loaded = ptrSingleTesterCache.Load(Bytes2); // + } // + } else { loaded = ptrSingleTesterCache.Load(file); // * } if(!loaded) // * { delete ptrSingleTesterCache; ptrSingleTesterCache = NULL; return false; } size = generate(); Print("Tester cache import: ", size, " trades from ", ArraySize(ptrSingleTesterCache.Deals), " deals"); } return true; } }; TesterReportAdapter<RECORD_CLASS> _defaultTSTReportAdapter;
Quiero que el nombre del último archivo tst aparezca en el registro, pero el método correspondiente es privado.
En la configuración debe seleccionar el archivo "*.tst" (un nombre vacío inicia el análisis del historial de la cuenta en línea).
Para los resultados de la optimización:
#include <fxsaber/MultiTester/MTTester.mqh> // + ... template<typename T> class OptCacheDataAdapter: public DataAdapter { private: TESTERCACHE<ExpTradeSummary> Cache; ... public: OptCacheDataAdapter() { reset(); } void load(const string optName) { bool loaded = true; // + if(optName == "") // + { // + uchar Bytes[]; // + // ¿Por qué GetLastOptCacheFileName() es privada? // + // Print("Loading ", MTTESTER::GetLastOptCacheFileName()); // + MTTESTER::GetLastOptCache(Bytes); // + loaded = Cache.Load(Bytes); // + } else { loaded = Cache.Load(optName); // * } if(loaded) // * { customize(); reset(); } else { cursor = -1; } } ...
Me gustó el artículo, así como todos los artículos sobre la tecnología OLAP.
Personalmente, me faltaba el vuelo del pensamiento, - formulaciones filosóficas de la esencia, dando una idea de todo el enfoque, - del espacio cubierto de tareas y potencial. Y el potencial es enorme. Me entristecen los múltiples e insignificantes detalles que hacen perder el tiempo al lector. Dicen - hay tal variable allí, y hay tal variable aquí..... Me doy cuenta de que esto es necesario para los principiantes que copian soluciones, pero aun así.... Ninguna tecnología es estática, y si sus clases y métodos se utilizan ahora, entonces en el futuro, alguien va a querer cambiar todo por sí mismo, y para él la utilidad del artículo disminuirá en proporción al número de entidades privadas. Escriba más sobre el enfoque en su conjunto: sobre su presente y su futuro. Hay que ser más global con estos planteamientos.
Pero, esta es mi opinión subjetiva. Gracias por el artículo.
Quería mostrar el nombre del último archivo tst en el registro, pero el método correspondiente es privado.
No se me ocurrió que alguien pudiera necesitarlo. Si tienes más comentarios sobre privado->público, dímelo. Lo haré.
Hola Señor,
He intentado compilar el archivo 'OLAPGUI_Opts.mq5' pero hay 17 errores en algunos archivos de inclusión.
Saludos cordiales,
Ben

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Implementando OLAP en la negociación (Parte 4): Análisis cuantitativo y visual de los informes del Simulador de estrategias:
El presente artículo propone un conjunto de herramientas básico para el análisis OLAP de los informes del Simulador sobre las pasadas únicas y resultados de la optimización en forma de los archivos de los formatos estándar (tst y opt), así como, una interfaz gráfica interactiva para este instrumental. Los códigos fuente MQL se adjuntan.
Para ver la distribución general de ganancias por los niveles con el paso 100, seleccionamos el campo profit de la estadística por el eje X y el agregador count.
Distribución de ganancias de todas las pasadas por los rangos con el paso 100
Finalmente, el agregador identity nos da la posibilidad de estimar la influencia de la cantidad de transacciones en el beneficio. En realidad, este agregador permite ver visualmente muchas otras regularidades.
Beneficio vs número de trades
Conclusión
Autor: Stanislav Korotky