Reglas de estructura. Aprender a estructurar los programas, explorar las posibilidades, los errores, las soluciones, etc. - página 6

 
FAQ:

ZS. Es un poco pequeño, ¿por qué no hacemos uno más global?

¿Tiene una propuesta concreta?
 
MetaDriver :

Bueno, pinchazo tady (en términos generales) ¿cómo tapas estas brechas en los cuatro primeros? ¿Está todo en DLL? :)

Sin DLL, puro MCL + winepi para el manejo de eventos .

Con respecto a esto, necesitamos encontrar tiempo para describir todo bellamente y hacer un gran artículo. Puedo lanzar un ejemplo o una implementación de pseudoclases visuales para MT4, pero me temo que será difícil de digerir sin una descripción detallada. La esencia de crear un DOM (módulo de objetos de datos) para MT por analogía con JS: son realmente similares de todos modos. Para semilla - la función principal del corazón por así decirlo:

 //+------------------------------------------------------------------+
//| Brief Description included Functions                             |
/*+----exported function---------------------------------------------+
bool   ObjSet(ObjNm,ObjTyp,isets[],tsets[],{ObjParent})Устанавливает на график объект класса Interface.
void   ObjDelete(string nm,bool delChild=true) Удаляет объект с графика, вместе , или без первого потомка
void   ObjsDelete(string nm) Удаляет объект, вместе со всеми его потомками
double ObjGet(string nm, int prop_id) Ищет объект и возвращает значение его свойства
bool   ObjSearch(string ObjNm):int[];string; Возвращает признак наличия объекта класса Interface
int    This(int prop_id) Ищет значение свойства объекта в списке свойств : obj_props[10]
//+----internal function---------------------------------------------+
string ObjGetName(string,int[],{string})  Собирает полное имя объекта класса Interface
void   ObjSetLabel()Обертка для стандартной функции
*/ //+----------------------------------------------------------------+
//|                                      OBJECTS_INTERFACE_CLASS.mq4 |
//|           Copyright © 2012, XrustSolution. mail:xrustx@gmail.com |
//|          https://www.youtube.com/user/opmlv http://forexrust.info |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, XrustSolution."
#property link        "mail: xrustx@gmail.com https://www.youtube.com/user/opmlv http://forexrust.info"
//+------------------------------------------------------------------+
//|   Extern variables                                               |
//+------------------------------------------------------------------+
extern    string    ObjectsInterfaceSettings = "-------- ObjectsInterfaceSettings ----------" ;
extern    int       X_Distance                                = 2       ;
extern    int       Y_Distance                                = 2       ;
extern    int       ChartCorner                               = 0       ;

//+------------------------------------------------------------------+
//|   Defines                                                        |
//+------------------------------------------------------------------+
#define GlobalPrefix     "wnd:"    // Префикс имени класса
#define GlobalParent     "chart"    // Имя глобального родителя
#define hName           "Header" // Имя главного родителя (заголовка)
#define wName           "Window" // Имя главного окна
#define cName           ""        // Стандартное имя текущего объекта
#define tName           "Txt"    // Стандартное имя для текстовой строки
#define Objects 500                // Максимальное количество командных объектов
//+------------------------------------------------------------------+
//|   Global variables                                               |
//+------------------------------------------------------------------+
string ObjParent = "" ;           // Глобальное имя родителя Object Parent Name
string ObjName   = "" ;           // Глобальное имя объекта  Object Own Name
int     obj_props[ 10 ];             // Набор свойств объекта : {xdLeft,ydUp,xdRight,ydDown,zIndex,Class,Corner,Color,Window};
//+------------------------------------------------------------------+
string   ObjsParent[Objects];     // Список имен родителей командных объектов
string   ObjsNames[Objects];       // Список имен командных объектов
int      CommObjs[Objects][ 6 ];     // Список параматров командных объектов = {класс,угол,х0,у0,х1,у1}
string   ObjsDom[Objects][ 2 ];     // Список всех объектов и их дочерних элементов (объектов) ObjsDom[Parent][Childrens]
string   ObjsDel[ 5000 ];           // Список старых объектов для удаления при перемещении окон  
string   ObjsName[ 5000 ];       // Список полных имен объектов
//+------------------------------------------------------------------+
//|   Defines                                                        |
//+-----ObjectsTypes-------------------------------------------------+
#define         OBJ_CANVAS       30        // Холст\Окно\Прямоугольник (Основной элемент)
//+---Предопределенные типы окон-------------------------------------+
#define         OBJ_WINDOW     31 // Пустое окно
#define         OBJ_TXTWND     32 // Текстовое окно с форматированием текста
#define         OBJ_HTMWND     33 // Текстовое окно с форматированием, активными ссылками
#define         OBJ_CHARTW     34 // Псевдографическое окно с возможностями граф построений
//#define       OBJ_LEDWND     34 // 

//+---Кнопки командные-----------------------------------------------+ 
#define   OBJ_BUTTON      40 // Кнопка (пустая) общего назначения
//----Кнопки предопределенные(Команда)
#define   OBJ_BUTBUY     41 // OP_BUY
#define   OBJ_BUTSEL     42 // OP_SELL
#define   OBJ_BUTCLO     43 // ORDER_CLOSE
#define   OBJ_BUTREV     44 // ORDER_REVERSE
#define   OBJ_BUTBST     45 // OP_BUYSTOP
#define   OBJ_BUTBLM     46 // OP_BUYLIMIT
#define   OBJ_BUTSST     47 // OP_SELLSTOP
#define   OBJ_BUTSLM     48 // OP_SELLLIMIT
#define   OBJ_BUTDEL     49 // ORDER_DELETE
//+---Ярлыки командные (кнопки 1х1 с значком)------------------------+
#define   OBJ_LABCNT     50 // Командный ярлык (Контрол) Без обкладки в виде канваса 1х1 наследие двигательного аппарата команд
#define   OBJ_LABCOM     51 // Командный ярлык кнопка 1х1 с канвасом (пустой) 
//----Ярлыки предопределенные(Команда)
         /*----Группа ярлыков кнопок находящихся в заголовке (верхнем меню)---*/
#define   OBJ_LABCLO     52 // Ярлык/Кн.закрыть
#define   OBJ_LABHID     53 // Ярлык/Кн.Свернуть
#define   OBJ_LABSHW     54 // Ярлык/Кн.развернуть
#define   OBJ_LABSET     55 // Ярлык/Кн.Настройки
         /*----Двухцветные ярлычки (триггеры(серый\зеленый))----*/
#define   OBJ_LABALR     56 // Ярлык/Кн.Алерт
#define   OBJ_LABSND     57 // Ярлык/Кн.Звук
#define   OBJ_LABEML     58 // Ярлык/Кн.Мыло
#define   OBJ_LABSEL     59 // Ярлык/Кн.Select\Unselect
         /*----Группа ярлыков стрелок и др предустановленных спец символов---*/
#define   OBJ_LABLFT     60 // Ярлык/Стрелка Влево
#define   OBJ_LABRGT     61 // Ярлык/Стрелка Вправо
#define   OBJ_LABUP       62 // Ярлык/Стрелка Вверх
#define   OBJ_LABDWN     63 // Ярлык/Стрелка Вниз
     
#define   OBJ_LAB_TXT     69 // Текстовая строка / значек в ярлыке
//+----Хидеры(заголовки)-Основной родительский объект, наследует все остальные+
#define   OBJ_HD         70 // Пустой хидер (прямоугольник 1 размера блока)
#define   OBJ_HDC         71 // + Кнока закрытия
#define   OBJ_HDH         72 // + Кнопка свернуть\развернуть
#define   OBJ_HDCH       73 // + закрыть + развернуть
#define   OBJ_HDCHT       74 // + закрыть + развернуть + настройки
#define   OBJ_HDСHTS     75 // + закрыть + развернуть + настройки + системное меню алертов
//+-----ObjectProperties---------------------------------------------+
#define   OBJ_PRP_X0         17    // левая координата (Х0)
#define   OBJ_PRP_Y0         18    // верхняя координата (Y0)
#define   OBJ_PRP_X1         19    // правая координата (Х0) 
#define   OBJ_PRP_Y1         20    // нижняя координата (Х0)
#define   OBJ_PRP_ZI         21    // Зет Индекс
#define   OBJ_PRP_CLS         22    // Класс Объекта
#define   OBJ_PRP_CRN         23    // Угол привязки объекта
#define   OBJ_PRP_CLR         24    // Цвет
#define   OBJ_PRP_WND         25    // Окно в котором объект находиться
#define   OBJ_PRP_LAY         26    // Резерв (здесь будет количество слоев, для более точного определения параметров элементов)
//+-----Массив аргументов для функции GetObjectName()----------------+
int      Props[ 10 ];                                                      
//              Props[0] = Лево         
//              Props[1] = Верх 
//              Props[2] = Право        
//              Props[3] = Низ  
//              Props[4] = Счетчик по Х 
//              Props[5] = Счетчик по У 
//              Props[6] = Зет индекс (основной)        
//              Props[7] = Зет индекс (дополнительный для объектов из нескольких слоев) 
//              Props[8] = Идентификатор зет индекса последнего (верхнего) слоя в объекте
//              Props[9] = Идентификатор типа объекта                                           
//+---Массивы с корректыми размерами шрифтв Webdings для >= 416 билда---------------+
int realSz[ 21 ] = { 15 , 23 , 31 , 35 , 43 , 47 , 55 , 67 , 75 , 83 , 87 , 91 , 95 , 99 , 119 , 123 , 127 , 143 , 148 , 156 , 164 }; // Таблица реальных размеров
int fontSz[ 21 ]  = { 11 , 17 , 23 , 26 , 32 , 35 , 41 , 50 , 56 , 62 , 65 , 68 , 71 , 74 , 89 , 92 , 95 , 107 , 110 , 116 , 122 }; // Таблица корректных шрифтов
int szCorr[ 21 ] = { 4 , 5 , 6 , 7 , 9 , 10 , 12 , 15 , 17 , 19 , 20 , 21 , 22 , 23 , 28 , 29 , 30 , 34 , 36 , 38 , 40 }; // Разница между размером шрифта, и реальным размером
int vertCr[ 21 ] = {- 3 ,- 2 ,- 1 ,- 1 ,- 2 , 0 ,- 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,   0 , - 1 ,   0 ,   0 ,   0 ,   0 ,   0 }; // Таблица cмещения по вертикали от размера шрифта

//+------------------------------------------------------------------+
//|  Includes                                                        |
//+------------------------------------------------------------------+
#include <OBJ_CANVAS.mqh> //SetCanvas(onm,xd,yd,xs,ys,[sz,zindx,oClr,crn,wnd,pnm,bord,bClr]);
#include <OBJ_LAB_TEXT.mqh> //SetTextString(onm,pnm,typ,txt,fnm,clr,[center,xd,yd,psz,fsz,crn,wnd]):int:error;
//#include <OBJ_BUTTON.mqh>//SetButton(onm,pnm,type[,xd,yd,xs,ys,text,tx_fnt,txClr,sz,bgClr,bdClr,crn,wnd]);
#include <OBJ_HEADER.mqh>
#include <OBJ_LED_SIMPLE.mqh>
//+------------------------------------------------------------------+
//|           Function  : string GetObjectName(string,int[],{string})|
//|           Copyright © 2012, XrustSolution. mail:xrustx@gmail.com |
//|          https://www.youtube.com/user/opmlv http://forexrust.info |
//+------------------------------------------------------------------+
//|                     Собирает полное имя объекта класса Interface |
//+------------------------------------------------------------------+
//|Полное имя объекта должно состоять из :                           |
//|wnd:        = Основной префикс имени                         4 зн |
//|z_0ax:      = Z индекс для опр. порядка отображения окна 1-9 6 зн |10 зн
//|c_30:       = Тип объекта класса (смотреть в списке типов)   5 зн |15 зн
//|lu_xxx_yyy: = Координаты левого верхнего угла               10 зн |25 зн
//|rd_xxx_yyy: = Координаты правого нижнего угла               10 зн |35 зн
//|id_xxx_yyy: = Номера объектов                               10 зн |45 зн
//|#name|parent= Собственное имя обьекта из максимум 15 знаков,    до|60 зн
//|состоящее из имени элемента класса, и имени родительского объекта |
//+------------------------------------------------------------------+
//|Разделители:  типов свойств     = двоеточите(:),                  |
//|              значений свойств  = нижнее подчеркивание(_)         |
//|              имя объекта       = решетка(#)конец описания свойств|
//|              имя родителя      = слеш[|]                         |
//+------------------------------------------------------------------+
string     ObjGetName( string Name,                                   // Имя объекта
                                                         int       Props[],                                 // Набор свойств объекта
                                                         string Parent = GlobalParent                   // Имя родителя, по умолчанию = "chart" , то есть основное окно графика
                                                        ){ string out= "" ;
//+------------------------------------------------------------------+
   if (Parent== "" ){Parent = "chart" ;}
   if (Props[ 9 ]!=OBJ_LAB_TXT){ // если объект текстовая строка добавляем в описание имя шрифта
        out = StringConcatenate (GlobalPrefix,                                   //
                                                                         "z_" ,Props[ 6 ],StringSetChar( "" , 0 ,Props[ 7 ]+ 97 ),StringSetChar( "" , 0 ,Props[ 8 ]+ 97 ), ":" ,
                                                                         "c_" ,Props[ 9 ], ":" ,
                                                                         "lu_" ,Props[ 0 ], "_" ,Props[ 1 ], ":" ,
                                                                         "rd_" ,Props[ 2 ], "_" ,Props[ 3 ], ":" ,
                                                                         "id" ,Props[ 4 ], "" ,Props[ 5 ], ":" ,
                                                                         "#"   ,Name    , "|" ,Parent);
        } else { // работаем как обычно
        out = StringConcatenate (GlobalPrefix,                                   //
                                                                         "z_" ,Props[ 6 ],StringSetChar( "" , 0 ,Props[ 7 ]+ 97 ),StringSetChar( "" , 0 ,Props[ 8 ]+ 97 ), ":" ,
                                                                         "c_" ,Props[ 9 ], ":" ,
                                                                         "lu_" ,Props[ 0 ], "_" ,Props[ 1 ], ":" ,
                                                                         "fn_font_name:" ,
                                                                         "id" ,Props[ 4 ], "" ,Props[ 5 ], ":" ,
                                                                         "#"   ,Name    , "|" ,Parent);
        }                                                               
         return (out);
}
Metacontrolador :
¿Tiene una oferta específica?

Hay, y la tarea está viva, pero me da miedo pronunciarla aquí, puedo en un personal.

 
C-4:
Hoy en día, ningún programador normal dibuja diagramas de flujo. Todo esto son tonterías teóricas pensadas para ser enseñadas a los escolares, pero no para trabajar en proyectos reales.
No es una tontería. Era necesario cuando los programas se escribían en código máquina. Y luego fueron arrastrados a los libros de texto y se convirtieron en un sinsentido cuando los programas se describieron en lenguajes normales. Y luego estaba el USPD, el Sistema Unificado de Documentación de Programas. Y para presentarlo al cliente había que redactarlo según normas muy estrictas. Tenía que haber un diagrama de bloques y todo tipo de descripciones.
 
FAQ:

Sin DLL, puro MCL + Vinapi para el procesamiento de eventos.

Con respecto a esto, necesito encontrar tiempo para describir todo bien y hacer un gran artículo. Puedo lanzar cualquier ejemplo o implementación de pseudoclases visuales para MT4, pero me temo que será difícil de digerir sin una descripción detallada. La esencia es crear el DOM (Módulo de Objetos de Datos) para MT por analogía con JS - son realmente similares. Para una imprimación - la función principal del corazón por así decirlo:

(Sí, con un columpio. ))

DOM - eso es mucho. Dame un par de capturas de pantalla al menos... O (si está disponible) algún ejemplo compilado independiente, para sentirlo en la terminal. ¿Tienes uno?

 
MetaDriver:

(Risas...) Con una explosión. ))

DOM - eso es mucho. Dame un par de capturas de pantalla al menos... O (si está disponible) algún ejemplo compilado independiente, para sentirlo en la terminal. ¿Tienes uno?

compruébalo aquí :https://www.youtube.com/user/opmlv hay un vagón lleno de cosas para rastrear cómo evolucionó :)
Rustamzhan Salidzhanov
Rustamzhan Salidzhanov
  • www.youtube.com
Краткая сборка софта созданного мной , для торговой платформы MetaTrader 4. Все имущественные права на данный софт принадлежат заказчикам, как правообладателям. И не могут быть переданы третим лицам без их (правообладателей) согласия. Я за собою оставляю авторское право как создатель данного софта. Quick assembly of software created by me for...
 
MetaDriver:

¿Lo intentamos?

Nada.

1. El panel está a la cola. la estrategia es primordial, si no funciona, el panel no tiene sentido ni utilidad.

2. La aplicación de la parte comercial depende de la estrategia, por lo que no hay nada que discutir en el marco del asalto a una estrategia hipotética. La aplicación de la estrategia, curiosamente, también depende de la estrategia :)

3. Inmediatamente haga un trigger para desactivar la estrategia contabilizada en el bloque de negociación. Y desactivar la realización de nuevos pedidos.

4. Panel. Lo que es un panel: una rutina.

 

En cuanto a la redacción del ST, es algo así:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Discusión sobre el comercio de alta frecuencia en MT5

hrenfx, 2013.02.06 14:30


Простой и довольно эффективной логикой написания боевого робота является следующая схема:
- робот делится на две части: тестер и синхронизатор.
- тестер на основании ранней истории и только что пришедшей выдает текущее состоянии торговой стратегии.
- синхронизатор "переносит" текущие тестерные открытые позиции и приказы на реал.

Это чем-то напиминает копирование торговых сигналов с одного счета на другой. Только вместо примитивного копировщика работает грамотный синхронизатор.

К сожалению, правильную логику синхронизатора посмотреть где-либо практически невозможно, поэтому озадачевшемуся придется подумать самому - очень полезно.

Но и такая логика построения боевого-робота далеко не совершенна, т.к. встает дилема первичности курицы и яйца. Поэтому применяются более сложные свои схемы, основанные на опыте автора-алготрейдера.

Все эти действия совершаются только ради одного - адекватной настройки стратегии. Какой бы совершенной не была схема, все равно одинаковые боевые роботы на разных счетах одного и того же ECN/STP брокера покажут расхождения. И помимо поиска рыночных закономерностей, важной задачей для алготрейдера также является уменьшение этих расхождений. Как уже говорилось выше, чем ближе брокер к возможстям HFT, тем меньше расхождения.

Если вникнуть в написанное, должно прийти понимание, что результаты работы стратегии на реале являются также своего рода тестером. И выводы на основании этой торговли также должны быть вероятностными.

 
TheXpert:

Nada.

1. La estrategia es primordial, si no sigue adelante, el panel no tiene sentido ni utilidad.

2. La aplicación de la parte comercial depende de la estrategia, por lo que no hay nada que discutir en el marco de un hipotético asalto a la estrategia. La aplicación de la estrategia, curiosamente, también depende de la estrategia :)

3. Inmediatamente haga un trigger para desactivar la estrategia contabilizada en el bloque de negociación. Y desactivar la realización de nuevos pedidos.

4. Panel. Qué panel - una rutina.

Bueno, aquí tenemos algo que discutir de una vez. :))

No para discutir, digamos, sino para señalar las posibilidades:

1. Panel directo a la cola. La estrategia es primordial, si no va a arar, el panel es inútil y sin sentido.

Hasta ahora, estoy de acuerdo, pero con una advertencia: el programa debe ser inmediatamente orientado a trabajar en dos modos, por lo que la estrategia / parte de comercio debe ser prescrito a la vez, teniendo en cuenta la presencia / ausencia de control del panel y con / sin visualización de la información en el panel.

2. La aplicación de la parte comercial depende de la estrategia, .......

No depende de mi estrategia. Toda la parte de trading está escrita en una clase (CMarketDriver), que implementa completamente la entrada de órdenes, el seguimiento de posiciones, las recotizaciones y otras cosas relacionadas con el trading. Para todos los símbolos a la vez. La parte de la estrategia sólo recibe las posiciones de mercado recomendadas para los símbolos: es decir, rellena el array de estructuras del formato {string Instrument; double Position} y solicita la sincronización con el servidor: MD.Synchronize(PositionArray). Eso es todo. Por ahora sólo opera con órdenes de mercado, pero está en camino una versión que opera con límites fijados dentro del spread (para reducir los costes de las operaciones). Para el comercio takeprofits / paradas no utilizan, pero MarketDriver puede poner paradas de protección en caso de pérdida prolongada de la conexión con el servidor (parámetros de parada se especifican una vez en la configuración del conductor). Por cierto, muy exitoso, casi no hay problemas solución estructurada. Para la prueba de las ideas estratégicas en el probador - no hay problemas con el comercio, toda la atención se puede dedicar a la estrategia - todo el comercio ha sido durante mucho tiempo depurado y encapsulado en el controlador de comercio.

2............., así que no hay nada que discutir en el marco de un hipotético asalto de estrategia. La aplicación de la estrategia, curiosamente, también depende de la estrategia :)

Por ejemplo, tengo una nueva idea: operar en la intersección de un par de limpiaparabrisas. En este caso, el problema es reestructurar el programa para que, al desarrollarlo (por ejemplo, añadiendo un tercer limpiaparabrisas), no tenga que cambiar la mayor parte del código. Entonces, el programa puede desarrollarse hacia la multidivisa (para simplificar el proyecto, supongamos que el comercio por símbolos es estrictamente independiente y no se consideran las interrelaciones) ¿Cómo organizar la parte estratégica, previendo tal desarrollo?

3. Inmediatamente se establece el disparador para desactivar la estrategia tomada en cuenta en el bloque de negociación. Y desactivar la realización de nuevos pedidos.

Pero no es necesario. Después de todo, no esperamos muchos problemas aquí.

4. Panel. Bueno, el panel es una tarea.

Pero la organización de la conexión de la estrategia con el panel es una tarea bastante creativa, especialmente si intentamos desarrollar una plantilla más o menos universal para dicho panel que pueda adaptarse fácilmente a diferentes Asesores Expertos y desarrollarse fácilmente a medida que el proyecto crece/se desarrolla.

 
MetaDriver:

No hace falta, casi nunca depende de mí.

Conmigo casi siempre depende. Especialmente cuando se trabaja con ECN. Es decir, no todo se hace al nivel más bajo, por supuesto, sino a través de los cascos de las funciones comerciales estándar.

Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
TheXpert:

Conmigo casi siempre depende. Especialmente cuando se trabaja con ECN. Es decir, no todo se hace al nivel más bajo, por supuesto, sino a través de los cascos de las funciones comerciales estándar.

No sé cómo resultará mi relación con ECN allí (voy a abrir una cuenta con RoboForex), pero intentaré lo mejor posible para mantener este desacoplamiento estructural (estrategia/conductor de mercado). Es tan conveniente, que incluso estoy listo para algunos costos comerciales moderados (como la pérdida de ganancias).

Vea lo simple que parece el ciclo principal del EA al final:

// Тестовый советник для тестирования обученных в GPU-оптимизаторе нейросеток (или записи значений котировок/индикаторов для отправки исходных данных в тот же оптимизатор).
void OnTick()
  {
   if(Mode==TradesMode) //-- Если режим тестирования
     {
      for(int i=0;i<CountInd;i++)
        {
         vInds[i]=GetInd(i,0);   // получаем значения индикаторов
        }
      Net.CalcResult(vInds);             // рассчитываем значение нейросетки
      float net_result=Net.NetResult[0];  // забираем рекомендованную рыночную позицию      
      SP.Pos=net_result*Lot;             // заполняем структуру для MarketDriver'a
      int err;
      MD.Synhronize(SP,err);             // синхронизируемся с торговым сервером.
     }
   else // Mode==RecordMode  // Если режим записи
..............
Compruebe la versión simplificada de prueba y vea si le gusta el esquema. Si es así, ajústelo a sus necesidades y utilícelo en su beneficio.
Archivos adjuntos: