Strukturregeln. Lernen, wie man Programme strukturiert, Erforschung von Möglichkeiten, Fehlern, Lösungen usw. - Seite 6

 
FAQ:

ZS: Das ist ein bisschen klein, also warum machen wir nicht ein globaleres Projekt?

Haben Sie einen konkreten Vorschlag?
 
MetaDriver :

Nun, kleiner Trottel (allgemein gesagt), wie stopfen Sie diese Lücken in den Top 4? Ist alles in DLLs? :)

Keine DLL, reine MCL + winepi für die Ereignisbehandlung .

Diesbezüglich müssen wir Zeit finden, alles schön zu beschreiben und einen großartigen Artikel zu machen. Ich kann entweder ein Beispiel oder eine Implementierung von visuellen Pseudoklassen für MT4 werfen, aber ich fürchte, es wird ohne eine detaillierte Beschreibung schwer zu verdauen sein. Das Wesentliche beim Erstellen eines DOM (Data Object Module) für MT in Analogie zu JS - sie sind sowieso sehr ähnlich. Für Samen - sozusagen die Hauptfunktion des Herzens:

 //+------------------------------------------------------------------+
//| 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);
}
MetaDriver :
Haben Sie ein konkretes Angebot?

Es gibt, und die Aufgabe ist lebendig, aber ich habe Angst, es hier auszusprechen, ich kann in einem persönlichen.

 
C-4:
Heutzutage zeichnet kein normaler Programmierer mehr Flussdiagramme. Das ist alles theoretischer Unsinn, der den Schülern beigebracht werden soll, aber nicht in realen Projekten funktioniert.
Das ist kein Unsinn. Sie war notwendig, als Programme in Maschinencodes geschrieben wurden. Und dann wurden sie in Lehrbücher geschleppt und wurden zu Unsinn, wenn Programme in normalen Sprachen beschrieben wurden. Und dann gab es noch das USPD, das Unified System for Program Documentation. Und um dem Kunden vorgelegt werden zu können, musste er nach sehr strengen Regeln erstellt werden. Es musste ein Blockdiagramm und alle Arten von Beschreibungen geben.
 
FAQ:

Keine DLL, reine MCL + winapi für die Ereignisverarbeitung.

Diesbezüglich muss ich Zeit finden, um alles schön zu beschreiben und einen großen Artikel zu verfassen. Ich kann entweder Beispiel oder Implementierung von visuellen Pseudoklassen für MT4 werfen, aber ich fürchte, es wird schwer zu verdauen sein, ohne detaillierte Beschreibung. Die Essenz ist, DOM (Data Object Module) für MT in Analogie zu JS zu erstellen - sie sind wirklich ähnlich. Für eine Fibel - sozusagen die Hauptfunktion des Herzens:

(Ja, mit einem Schwung. ))

DOM - das ist eine Menge. Gib mir wenigstens ein paar Screenshots... Oder (falls verfügbar) ein eigenständiges kompiliertes Beispiel, um es im Terminal zu testen. Haben Sie eine?

 
MetaDriver:

(Lacht...) Mit einem Knall. ))

DOM - das ist eine Menge. Gib mir wenigstens ein paar Screenshots... Oder (falls verfügbar) ein eigenständiges kompiliertes Beispiel, um es im Terminal zu testen. Haben Sie eine?

Schau mal hier :https://www.youtube.com/user/opmlv da gibt es eine Menge Material, um die Entwicklung nachzuvollziehen :)
Rustamzhan Salidzhanov
Rustamzhan Salidzhanov
  • www.youtube.com
Краткая сборка софта созданного мной , для торговой платформы MetaTrader 4. Все имущественные права на данный софт принадлежат заказчикам, как правообладателям. И не могут быть переданы третим лицам без их (правообладателей) согласия. Я за собою оставляю авторское право как создатель данного софта. Quick assembly of software created by me for...
 
MetaDriver:

Sollen wir es mal versuchen?

Nichts.

1. Das Panel steht ganz am Ende. Die Strategie ist primär, wenn sie nicht funktioniert, ist das Panel sinnlos und nutzlos.

2. Die Umsetzung des Handelsteils hängt von der Strategie ab, so dass es im Rahmen des Sturms auf eine hypothetische Strategie nichts zu diskutieren gibt. Die Umsetzung der Strategie hängt merkwürdigerweise auch von der Strategie ab :)

3. Erzeugen Sie sofort einen Auslöser, um die Strategie, die im Handelsblock berücksichtigt wird, zu deaktivieren. Und deaktivieren Sie die Erteilung neuer Aufträge.

4. Gremium. Was ein Gremium ist - eine Routine.

 

Was das Schreiben des TS betrifft, so geht es ungefähr so:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion über den Hochfrequenzhandel auf MT5

hrenfx, 2013.02.06 14:30


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

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

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

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

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

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

 
TheXpert:

Nichts.

1. Das Panel geht direkt zum Heck. Die Strategie ist primär, wenn es nicht weitergeht, ist das Panel sinnlos und nutzlos.

2. Die Umsetzung des Handelsteils hängt von der Strategie ab, so dass es im Rahmen eines hypothetischen Strategieangriffs nichts zu diskutieren gibt. Die Umsetzung der Strategie hängt merkwürdigerweise auch von der Strategie ab :)

3. Erzeugen Sie sofort einen Auslöser, um die Strategie, die im Handelsblock berücksichtigt wird, zu deaktivieren. Und deaktivieren Sie die Erteilung neuer Aufträge.

4. Gremium. Was für ein Gremium - eine Routine.

Nun, hier haben wir gleich etwas, worüber wir streiten können. :))

Nicht um zu argumentieren, sondern um auf die Möglichkeiten hinzuweisen:

1. Die Strategie ist primär, wenn es nicht weitergeht, ist die Platte sinnlos und nutzlos.

So weit, ich stimme zu, aber mit einem Vorbehalt: das Programm sollte sofort orientiert werden, um in zwei Modi arbeiten, so dass die Strategie / Handel Teil sollte auf einmal vorgeschrieben werden, unter Berücksichtigung der Anwesenheit / Abwesenheit von Kontrolle aus dem Panel und mit / ohne Anzeige von Informationen auf dem Panel.

2. Die Umsetzung des Handelsteils hängt von der Strategie ab, .......

Der gesamte Handelsteil ist in einer Klasse (CMarketDriver) geschrieben, die die Ordereingabe, die Positionsverfolgung, die Requotes und andere mit dem Handel zusammenhängende Dinge vollständig implementiert. Für alle Symbole auf einmal. Der Teil der Strategie empfängt nur die empfohlenen Marktpositionen für die Symbole: d.h. er füllt das Array der Strukturen des Formats {string Instrument; double Position} aus und fordert die Synchronisierung mit dem Server an: MD.Synchronize(PositionArray). Das ist alles. Derzeit wird nur mit Marktaufträgen gehandelt, aber eine Version, die mit innerhalb der Spanne festgelegten Limits handelt (um die Handelskosten zu senken), ist in Vorbereitung. Für den Handel Takeprofits / Stops nicht verwenden, aber MarketDriver kann Schutzstopps im Falle einer langen Verlust der Verbindung zum Server (Stop-Parameter werden einmal in Treiber-Einstellungen angegeben). By the way, sehr erfolgreich, fast keine Probleme strukturierte Lösung. Für die Prüfung der strategischen Ideen in der Tester - keine Probleme mit dem Handel, kann die ganze Aufmerksamkeit auf die Strategie gewidmet werden - alle Handels hat lange debuggt und in den Handel Treiber gekapselt.

2............., so dass es im Rahmen eines hypothetischen Strategieangriffs nichts zu diskutieren gibt. Die Umsetzung der Strategie hängt merkwürdigerweise auch von der Strategie ab :)

In diesem Fall besteht das Problem darin, das Programm so umzustrukturieren, dass ich bei der Weiterentwicklung (z. B. Hinzufügen eines dritten Scheibenwischers) nicht den größten Teil des Codes ändern muss. Dann kann das Programm in Richtung Mehrwährung entwickelt werden (der Einfachheit halber nehmen wir an, dass der Handel mit Symbolen strikt unabhängig ist und Wechselbeziehungen nicht berücksichtigt werden). Wie ist der strategische Teil zu organisieren, der eine solche Entwicklung voraussetzt?

3. Setzen Sie sofort den Auslöser, um die im Handelsblock berücksichtigte Strategie zu deaktivieren. Und deaktivieren Sie die Aufgabe neuer Bestellungen.

Aber das müssen wir nicht, schließlich erwarten wir hier keine großen Schwierigkeiten.

4. Gremium. Nun, das Gremium ist eine lästige Pflicht.

Aber die Organisation der ereignisgesteuerten Verbindung der Strategie mit dem Panel ist eine ziemlich kreative Aufgabe, insbesondere wenn wir versuchen, eine mehr oder weniger universelle Vorlage für ein solches Panel zu entwickeln, die leicht an verschiedene Expert Advisors angepasst und leicht weiterentwickelt werden kann, wenn das Projekt wächst/entwickelt wird.

 
MetaDriver:

Das müssen Sie nicht, es hängt fast nie von mir ab.

Bei mir kommt es fast immer darauf an. Insbesondere bei der Arbeit mit ECN. Ich meine, es wird natürlich nicht alles auf der untersten Ebene gemacht, sondern nur durch die Hüllen der Standardhandelsfunktionen.

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

Bei mir kommt es fast immer darauf an. Insbesondere bei der Arbeit mit ECN. Ich meine, es wird natürlich nicht alles auf der untersten Ebene gemacht, sondern nur durch die Hüllen der Standardhandelsfunktionen.

Ich weiß nicht, wie sich meine Beziehung zu ECN dort entwickeln wird (ich werde ein Konto bei RoboForex eröffnen), aber ich werde mein Bestes tun, um diese strukturelle Entkopplung (Strategie/Markttreiber) beizubehalten. Es ist so bequem, dass ich sogar bereit bin, einige moderate Handelskosten (wie entgangenen Gewinn) in Kauf zu nehmen.

Sehen Sie, wie einfach der Hauptzyklus des EA am Ende aussieht:

// Тестовый советник для тестирования обученных в 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  // Если режим записи
..............
Testen Sie die vereinfachte Testversion und sehen Sie, ob Ihnen das Schema gefällt. Wenn ja, passen Sie es an Ihre Bedürfnisse an und nutzen Sie es zu Ihrem Vorteil.
Dateien: