许多人感兴趣的话题:MetaTrader 4和MQL4的新内容 - 即将发生的重大变化 - 页 66

 
Mischek:
嗯,不会有的。

究竟什么不会发生? 匹配,或其自动后果?

说得更具体些...;)

 
MetaDriver:

究竟什么不会发生? 匹配,或其自动后果?

请具体说明...;)

不会有任何教训,就是这样。:)
 
MetaDriver:

究竟什么不会发生? 匹配,或其自动后果?

请具体说明...;)

你夸大的后果。
 
MetaDriver:

究竟什么事情不会发生?

不会有任何东西。一个大的metatrader。和沉默)。
 
MetaDriver:

在某种意义上,MT5平台上大规模引入匹配 技术可能成为市场的 "炸弹",因为理论上它可能在不久的将来导致外汇市场的 "反市场革命"。也许 "革命 "一词是夸张的,也许不是,因为任何交易者将能够做市商(影响价格)。随着原生聚合器的大规模传播,覆盖了世界市场的重要部分....。流动性供应商对货币定价的垄断权力(好吧,几乎)的时代可能(可能)永远结束了。

在这种背景下,出现了一个 "划时代 "的问题:交易员是否为 "新时代 "做好了准备? "普通交易员大众 "有什么常规工具来测试、优化和调试传播算法?

没有。

测试器中没有tick历史记录,也没有调试功能。 报价基础的格式没有给使用限价订单的HFT策略( 所有 传播算法都是这样)的测试和优化留下机会。

我同意这一点。 只是要反驳一下:目前的报价格式对于突破策略和反向策略来说都是很愚蠢的,但你不能用这样简单的方法来解决它。你至少可以治愈一类策略,而在即将到来的情况下,它采取了一个 "戏剧性的形状"(见上文)。 而其他策略不会受到影响!如果你看到了,请给我一个例子,说明以提议的方式修改价差会使测试/优化变得不那么现实的一类策略。

事实上,测试者仍然是tickwise,所以这只是一个历史的格式问题。 如果有必要,也可以使用 "非标准引号 "的可能性。
MetaDriver

我正试图 "绕着弯子 "看得更远一些//你写的一切都很正确。

"大规模做市",正是因为触发了你所描述的情景,最终可能会导致美元失去 "普遍交换者 "的地位。 这是 "未成年人 "点差崩溃的一个简单后果。 外汇市场将变得更有活力和效率。在我看来,任何对汇率的非市场监管都充满了重大的滥用行为。不管宣称的目标有多高尚--总是有可能将内部人员货币化,认为任何法律机制都能反对它是愚蠢的。

简而言之--我对 "诚实的外汇 "感兴趣,也许我个人不会从这样的逆转中获得经济利益(也许我会)。 但如果我输了,至少我会知道,我输了是因为我开发了一个愚蠢的算法,而不是因为我被 "欺骗 "了。

暂时无可奉告,我再考虑一下。 我还没有看到一个纯粹靠止损来交易恒定手数的盈利策略。一个也没有。从理论上讲,这是非常可以理解的。(断言这种策略的存在就是断言存在任何H-波动率持续大于2.0的交易区间。) 我所看到的所有有效的趋势策略要么是使用市场订单成交,要么是使用限价器(或标记)在回撤时进入/退出。 对于highAsk/lowBid标记,历史并不比LowAsk/HighBid更有价值。 对他们来说,重要的信息是关于条形OHLC各点的价差。

最后,我们了解到,像HighBid+LowAsk这样的半措施并不足以使测试人员达到要求。

 
Urain:

最后,很明显,像HighBid+LowAsk这样的一半措施将不足以使测试者充分。

如果你从我写的东西中得出这样的结论...那么你也不明白)
 
TheXpert:
如果这是你从我所写的内容中得出的结论......那么你也不明白)。

你打算怎么做?他会进来,说几句话,就这样,保证会有几个不眠之夜。)

这个帖子不是给我的,但我也不会睡觉。

 
MetaDriver:

( 认为这些存在就是认为存在任何H-波动率持续大于2.0的交易期限 )

嗯,这根本就是一种趋势的圣杯。也不是一直低于2倍。没有这样的工具,沿着整个系列的H-波动率稳定地小于或大于2。在不同的环节/在不同的时刻。知道什么时候交易一个趋势,什么时候交易一个回报。过滤集市))
 
hrenfx:

我需要为一个新的贸易改进我的测试器。为了理解旧的代码,比起写一个新的代码,浪费的时间更多(我浪费了几个星期--偶尔的方法)。

因此,我花了5个小时(包括调试)从头开始写一个新的测试器。 它的表现(对我这个首发的人来说很满意)。

  • 与M1 HighBid + LowAsk一起工作(结果比MT5-测试仪更准确)。
  • 一个符号。
  • 速度(i7 2700K)约100,000,000条/秒(277外汇年/秒)在测试TS - 不是空的,很多东西都是计算的。不断地在市场上。
  • 没有MM--没有地段。
  • 只以点为单位盈利。
  • 交易者有可能控制滑点和佣金。
  • 优化器有自己的优化标准--对于每一个优化标准,它都会打开自己的文件(可能需要很多GB),其中有分类的交易字符串。
  • 测试器中没有错误检查 - 我知道我的测试器的所有细微差别,所以我不允许。
  • TS是以略微删节的MQL4编写的--所有不必要的东西都被删除。但你可以使用C++的所有力量。
  • 测试器是在没有OOP的情况下写的--我不知道怎么做才算合格。所以它实际上是一种纯C语言。
  • 源代码为免费的C++~20Kb。
  • 停止和市场被扔掉了(OrderClose被留下)--没有必要。
  • 每一次运行(通过选择--指定运行编号)都可以在数学包中进行可视化和研究--公平和平衡变化文件的编写很简单。
  • 没有遗传学。
  • 没有OpenCL--做不到。
  • 单线程。愚蠢地加载所有核心--手动运行多个优化器。
  • 控制台应用。
  • TC输入参数、测试仪设置和优化范围都在文件中设置。
  • TC与测试器一起被编译成一个EXE文件。
  • 在开始之前,只有三个文件:EXE、历史、设置。
  • 如果当前的运行状态不满足条件(例如,沉降太高),优化器有一个中断运行的过程。
  • MQL4脚本为测试人员准备了历史,它是很久以前写的。
  • 没有为订单表动态分配内存--一旦分配内存就会被遗忘。
  • 没有日志--我不看它们。
  • 没有订单历史--以同样的方式。
  • 对指标和与之相关的一切都没有概念--我们不需要它们来做TS。
  • 价格是整数(long int)。

如果在MQL5中实现了同样的废话,我们可以在矩阵优化模式下使用云计算。每次只需发送历史记录--需要对此类信息进行内置压缩。

理论上,理论上可以达到~100Bb/s的速度(在测试TS)。我想知道MT5-测试仪在同一鹦鹉的整个云上的表现如何?

对于各种研究来说,每秒1000亿条是一个很好的速度。如果换算成其他单位,这个速度表示一年一分钟的外汇历史在一个符号上每秒运行~300,000次。

大部分时间都花在了学习语言的语法上--只是在谷歌上搜索。不是一个程序员.

我马上告诉你,为你自己的小需求写一个通用的框架是非常浪费时间的。最好是探索。如果有什么需要考虑的地方--就完成它。

这只是一个核心,现在你需要一个狡猾的优化器的工具包。在这里需要更多的时间--你必须考虑清楚。

在这里,我读到这些,我想到,要么一个人完全迷失在他的意识流中,要么 他写的东西至少有一半只是一个普通的谎言

一个没有深厚语言知识的自学成才的程序员写了一个单线程的测试器,其性能为每秒100 000 000条,持续了数小时?相比之下:专业水平最高的人花了数年时间来创建一个合格的、高性能的HFT测试器,创建整个团队与之合作,并使其充满策略,而这里有一个人决定自己建立一个测试器,并立即得到了领先的(封闭的)HFT平台的一个数量级的性能。

让我们来计算一下,我们需要多少带宽内存才能每秒运行100 000 000条。每个条形图是4个价格+AskLow HighBid,这导致6个整数类型,每个64位(价格是整数(long int))。 对于每秒100.000.000条,它需要

64比特*6价格*100,000,000条=38,400,000,000比特=4,800,000,000字节=. 4 577 Mbytes/秒。.


这意味着,从根本上和纯粹的理论上讲,这种性能可以在DDR2 533内存模块和更高的内存模块 上实现。至少申报的性能与现代硬件的物理极限相当。

但软件时间成本带来了更大的限制。这些都是不能忽视的。这就是为什么我拿了一个快速的64位C语言编译器Win-Lcc 64,并测量了在没有繁重数学计算的情况下直接搜索一个条形阵列 的性能。请注意:我们说的是直接,即最快的搜索。没有环境操作和其他开销。与dickfix不同的是,我提供了我的 "策略测试器 "的完整源代码,这样任何人都可以在他们喜欢的编译器中编译它并测量其性能。

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define  LAPS 10000              //Количество серий
#define  ELEMENTS 10000          //Количество баров в одной серии
#define  INVOKE                  //Определено, если требуется эмулировать
                                //вызов функции

//Представление бара
struct bar
{
        long long Open;
        long long High;
        long long Low;
        long long Close;
        long long AskLow;
        long long BidHigh;
};

int main(void)
{
        struct bar bar_array[ELEMENTS];
        //Общее время выполнения стратегии
        clock_t eleps_time = 0;
        //Общее время выполения
        clock_t total_time = 0;
        //К сожалению заявленный объем памяти (100 000 000 баров) выделить не удалось,
    //поэтому выделяем память порциями, 1000 раз, по 100 000 баров за раз.
        clock_t ttime = clock();
        for(int lap = 0; lap < LAPS; lap++)
        {
                //Заполняем бары случайными числами
                for(int i = 0; i < ELEMENTS; i++)
                {
                        bar_array[i].Open = (long long)rand();
                        bar_array[i].High = (long long)rand();
                        bar_array[i].Low = (long long)rand();
                        bar_array[i].Close = (long long)rand();
                        bar_array[i].AskLow = (long long)rand();
                        bar_array[i].BidHigh = (long long)rand();
                        //if(i < 5)
                        //      printf("%i\n", bar_array[i].High);
                }
                //Эмулируем работу ТС c массивом котировок
                //Рассчитываем время на выполнение этого блока и суммируем его, получая общее время
                //выполнения
                clock_t btime = clock();
                //Наша стратегия будет проверять простое соответствие проверяемого бара настоящему.
                //Настоящий бар, это бар чей high > open, low, close а low < high, open, close
                int signal = 0;

                for(int i = 0; i < ELEMENTS; i++)
                {
                        #ifndef  INVOKE
                        if( bar_array[i].High > bar_array[i].Low &&
                            bar_array[i].High > bar_array[i].Open &&
                                bar_array[i].High > bar_array[i].Close)
                                signal++;
                        #endif
                        #ifdef  INVOKE
                        signal += TradeSystem(&bar_array[i]);
                        #endif
                }
                eleps_time += clock() - btime;
        }
        printf("Bars was worked: %i\n", LAPS*ELEMENTS);
        //Печатаем общее время выполнения
    double timedif = ((double)clock() / (double)CLOCKS_PER_SEC);
    printf("Bars %f seconds\n", timedif);
        //Печатаем время выполнения торговой системы
        double eleps_diff = (double)eleps_time / (double)CLOCKS_PER_SEC;
        printf("The TradeSystem time is %f seconds\n", eleps_diff);
        printf("The Eleps tik is %i tiks\n", eleps_time);
        return 0;
}
//
// Функция торговой системы. Принимает на вход бар,
// обрабатывает его и возвращает целочисленный результат
int TradeSystem(struct bar &cbar)
{
        if( cbar.High > cbar.Low &&
                cbar.High > cbar.Open &&
                cbar.High > cbar.Close)
                                return 1;
        return 0;
}

你可以看到,这段代码,根据Invoke指令,要么通过数组并进行简单的比较(一个非常快速的操作),要么调用一个函数来进行同样的比较。

让我们看看这段代码需要多少时间来搜索和比较100 000 000条。

我们可以看到,直接通过100,000,000条需要1.28秒,这比宣传的性能几乎差三分之一。

可以看出,对100 000 000个条形图的搜索,在每个条形图上调用计算函数,需要1.79秒,这比宣布的性能差了1.5倍多。

所有测试都是在i7 870,DDR3 3200 8Gb的 硬件上进行的。

大部分时间花在实际的数据准备上(约9秒)。这在优化器的设计中,只要有一点不优化,就会导致巨大的开销。但我没有把这个时间考虑进去,因为我们只讨论了战略运行。

你得出你自己的结论。我希望我已经用数字表明,所说的结果,说得不好听一点,与现实不符。甚至描述优化器的代码的理论性能也不符合声称的结果。而如果你实现一个真正的测试器,接近声称的功能,性能会下降得更低,因为任何函数调用和任何或多或少有用的数学计算都会立即减少裸搜索的时间。

 
Avals:
嗯,这根本就是一种趋势的圣杯。两者都没有稳定地低于2倍。没有这样的仪器,使H波在整个系列中始终小于或大于2。在某些章节/某些时刻。知道什么时候交易一个趋势,什么时候交易一个回报。过滤集市))

没错!但在这种情况下,我们来限制交易,作为理想交易系统发展的最后阶段。

现在用你的大脑想一想,如果一个 "理想 "的系统必须交易 "限制",那么为什么一个真正的系统要交易 "马奎特 "或 "停止"? 出于谦虚?;)