構造のルール プログラムの構成方法を学び、可能性、エラー、解決策などを探る。 - ページ 6

 
FAQ:

ZS.ちょっと小さいので、もっとグローバルなものをやりませんか?

具体的な案はあるのでしょうか?
 
MetaDriver :

さて、(一般的に)タディプリックは、これらのギャップをトップ4にどのように埋めますか。すべてがDLLに含まれていますか? :)

DLLなし、 イベント処理用の純粋なMCL+winepi。

これに関して、私たちはすべてを美しく説明し、素晴らしい記事を作る時間を見つける必要があります。 MT4のビジュアル疑似クラスの例または実装のいずれかを投げることができますが、詳細な説明なしでは理解するのは難しいでしょう。 JSとの類推によってMT用のDOM(データオブジェクトモジュール)を作成することの本質-とにかくそれらは本当に似ています。シードの場合-いわば心臓の主な機能:

 //+------------------------------------------------------------------+
//| 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
特定のオファーがありますか?

あり、タスクは生きていますが、私はここでそれを発音することを恐れています、私は個人的にすることができます。

 
C-4:
今どき、普通のプログラマーがフローチャートを描くことはない。これはすべて、小学生に教えるための机上の空論であり、実際のプロジェクトでは通用しない。
ナンセンスではありません。プログラムが機械語で書かれているときに必要だった。そして、教科書に引きずり込まれ、普通の言語でプログラムを記述するとナンセンスになってしまう。そして、USPD(Unified System for Program Documentation)というのがありました。そして、それをお客様に提出するためには、非常に厳しいルールに則って作成する必要がありました。ブロック図やいろいろな説明書きがあったはずです。
 
FAQ:

DLLを使わず、純粋なMCL+イベント処理 にVinapiを使用。

これについては、時間を見つけて、すべてをうまく表現し、大きな記事にする必要があります。MT4用のビジュアル擬似クラスの例か実装のどちらかを投げられますが、詳細な説明がないと消化しきれないと思います。本質は、JSとのアナロジーでMT用のDOM(Data Object Module)を作ることであり、両者は実によく似ている。入門編に。いわば心臓の主な働きです。

(そう、ブランコで。))

DOM - それは大変だ、せめてスクリーンショットを2枚ほどくれ......。あるいは、(もしあれば)スタンドアロンでコンパイルされたサンプルで、ターミナルでそれを感じられるようにします。あるのか?

 
MetaDriver:

(笑...)ドカンとね。))

DOM - それは大変だ、せめてスクリーンショットを2枚ほどくれ......。あるいは、(もしあれば)スタンドアロンでコンパイルされたサンプルで、ターミナルでそれを感じられるようにします。あるのか?

https://www.youtube.com/user/opmlv 進化の軌跡をたどるための資料がワゴンの中に入っています。)
Rustamzhan Salidzhanov
Rustamzhan Salidzhanov
  • www.youtube.com
Краткая сборка софта созданного мной , для торговой платформы MetaTrader 4. Все имущественные права на данный софт принадлежат заказчикам, как правообладателям. И не могут быть переданы третим лицам без их (правообладателей) согласия. Я за собою оставляю авторское право как создатель данного софта. Quick assembly of software created by me for...
 
MetaDriver:

試してみようか?

何もない。

1.パネルは最後尾にある。戦略は一次的なもので、それがうまくいかなければ、パネルは無意味で役に立たない。

2.取引部分の実装はストラテジーに依存するため、仮想ストラテジーの嵐という枠組みで議論することはない。戦略の実行も、不思議なことに、戦略次第なのです :)

3.取引ブロックに計上されているストラテジーを無効にするトリガーを即座に作成する。そして、新規注文を無効にする。

4.パネルパネルとは何か、それは日課である。

 

TSの書き方としては、次のような感じです。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MT5での高頻度取引に関する考察

hrenfx, 2013.02.06 14:30


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

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

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

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

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

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

 
TheXpert:

何もない。

1.パネルは尾翼に直行。戦略は第一、突っ走らなければ、パネルは無意味で役に立たない。

2.取引部分の実装はストラテジーに依存するため、仮想ストラテジー突撃の枠組みで議論することはない。戦略の実行は、奇妙なことに戦略にも依存するのです :)

3.取引ブロックに計上されているストラテジーを無効にするトリガーを即座に作成する。そして、新規注文を無効にする。

4.パネルなんというパネル-ルーティンなんだ。

さて、ここで一気に論点を整理する。:))

議論するためではなく、可能性を指摘するためとでも言いましょうか。

1.パネルが尾翼に直行する。戦略が第一で、突っ走らなければ、パネルは無意味で役に立たない。

ここまでは同感ですが、注意点があります。プログラムは2つのモードで動作するよう即座に方向付ける必要があるので、パネルからの制御の有無、パネルへの情報表示の有無を考慮して、戦略/取引部分を一度に規定する必要があります。

2.トレーディング部分の実装は、戦略、...........................に依存します。

取引部分はすべてクラス(CMarketDriver)で書かれており、注文入力、ポジション追跡、リクオート、その他取引に関連するものを完全に実装しています。すべてのシンボルを一度にストラテジー部は、シンボルの推奨ポジションを受け取るだけです。つまり、{string Instrument; double Position}という形式の構造体の配列に 入力し、サーバーに同期を要求します。 MD.Synchronize(PositionArray) 以上がその内容です。現在は成行注文のみですが、スプレッド内に指値を設定して取引するバージョン(取引コストを削減するため)も準備中です。取引ではテイクプロフィット/ストップは使用しませんが、MarketDriverはサーバーへの接続が長時間失われた場合に備えて保護ストップを置くことができます(ストップパラメータはドライバー設定で一度指定します)。 ところで、非常に成功しており、ほとんど何の問題もなくソリューションが構成されています。 テスターでの戦略的アイデアのテストについては、取引で問題はなく、すべての注意を戦略に注ぐことができます - すべての取引が長いデバッグと取引ドライバーのカプセル化されています。

2......ということで、仮想の戦略突撃の枠内で議論することはない。戦略の実行は、奇妙なことに戦略にも依存するのです :)

例えば、2つのワイパーが交わることで取引するという斬新なアイデアがあるのですが、この場合、開発時に(例えば3つ目のワイパーを追加する)コードの大部分を変更する必要がないようにプログラムを再構築することが問題です。そのとき、プログラムは多通貨化に向けて発展するかもしれない(プロジェクトの簡略化のため、記号による取引は厳密に独立しており、相互関係は考慮されていないとする)。 そのような発展を見越した上で、戦略部分をどのように整理すればよいのだろうか。

3.取引ブロックに考慮されているストラテジーを無効にするトリガーを即座に設定します。そして、新規発注を無効にする。

しかし、その必要はない。 何しろ、ここでのトラブルはあまり期待できないのだから。

4.パネルまあ、パネルが雑なんですけどね。

特に、異なるExpert Advisorに簡単に適用でき、プロジェクトの成長/発展に合わせて簡単に開発できる、そのようなパネルの多かれ少なかれ普遍的なテンプレートを開発しようとすると、戦略のイベント駆動型のパネルとの接続の構成は、かなり創造的な作業となります。

 
MetaDriver:

そんなことしなくても、ほとんど私に左右されることはありません。

私の場合、ほとんどいつも依存します。特にECNと連携している場合。つまり、すべてはもちろん最低レベルで行われているわけではなく、標準的な取引機能の 殻を破っているだけなのです。

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

私の場合、ほとんどいつも依存します。特にECNと連携している場合。つまり、すべてはもちろん最低レベルで行われているわけではなく、標準的な取引機能の 殻を破って行われているだけなのです。

まあ、それはそれで悪いことなのですが。 ECNとの関係がそこでどうなるかはわかりませんが(RoboForexに口座開設予定)、この構造的デカップリング(戦略とマーケットドライバー)を維持するためにがんばろうと思います。 あまりに便利なので、多少の取引コスト(利益損失など)も覚悟の上でやっています。

最終的にEAのメインサイクルがいかにシンプルに見えるかをご覧ください。

// Тестовый советник для тестирования обученных в 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  // Если режим записи
..............
簡易テスター版をご覧いただき、気に入ったものがあれば、微調整してご活用ください。
ファイル: