分类
到底该怎么用期权赚钱

为什么要使用高频外汇?

2019年六月到七月实盘利润图

为什么大部分外汇都是使用美元?

第一个是商品美元还流机制。日本、德国等“贸易国家”向美国出口赚取美元以后,还要将其中相当大部分借给美国。美元是世界清算货币、结算货币和主要的资本市场交易货币,如果不借给它,美国要自己满足基础货币发行的话就会印钞,有可能引发美元贬值。这意味着,一方面其他国家本身拥有的美元储备缩水,这是他们不愿意看到的;另一方面美元贬值意味着其他国家的本币升值,对出口非常不利。所以,作为“贸易国家”的悲剧就在于,需要被动地维持美元汇率的稳定,尽量不让美元贬值。也就是说,世界上最大的债权国要维持世界上最大的债务国的货币稳定,这是商品美元还流机制迫使其他国家承担的被动责任,也是其他国家大量购买美国国债、公司债的原因。

第二个是石油交易的美元计价机制。1971年尼克松关闭“黄金窗口”、美元与黄金脱钩之后,美元面临的最大问题是如何确保自身的储备货币地位。为此,美国迅速找到了石油这种工业血液,联合沙特等国建立了石油交易的美元计价机制。这就意味着其他国家若要进口石油就必须用美元支付,因而必须储备美元。这样,美元在与黄金脱钩之后依然牢固地保持着全球储备货币的地位。

第三个是美国对外债务的本币计价机制。美国80%以上的对外债务是以自己可以印刷的美元计价的。也就是说,在理论上和实践上讲,针对自己的对外负债,美国是可以通过印刷美元解决的。当然,正是由于美元是美国控制世界的最主要工具,现实中美联储、财政部还是格外慎重的,轻易不会乱来。但事实上,美国在2008年金融危机之后已经搞了4次量化宽松,释放出大量流动性。

为什么我要选择高频交易?为什么选择比特币做高频交易?

2019年六月到七月实盘利润图

高频交易(high frequency trading - HFT)指的是具有很高交易频率的交易系统。一般持仓时间低于一天,每日资金周转大于30,属于高频的范畴。与之相对应的是低频交易(购买资产并且持有相当长的时间)。

在高频交易领域中,为什么我们选择 Java 开发外汇算法交易系统?

Java精选 于 2020-11-20 09:55:08 发布 364 收藏 1

为了获得这几个关键的微秒,大多数玩家都会在昂贵硬件上进行投资:带有超频液冷 CPU 的服务器池(在 2020 年,你可以买到一台拥有 56 个核心、5.6GHz 和 为什么要使用高频外汇? 1TB 内存服务器),在主要的交易所数据中心进行拼装,高端纳秒网络交换机,专用跨洋线路(Hibernian Express是一个主要供应商),甚至是微波网络。

常见的是使用高度定制的 Linux 内核,带有操作系统旁路,这样数据就可以直接从网卡 "跳转" 到应用程序、基于 IPC 进程间通信,甚至使用 FPGA(可编程单用途芯片)。

在过去 14 年里,我们在外汇算法交易领域用 Java 为什么要使用高频外汇? 为什么要使用高频外汇? 进行开发,并使用具有竞争力的强大而廉价的硬件。

在一个团队小,资源有限以及熟练开发人员欠缺的工作环境,Java 意味着我们可以快速进行软件迭代,因为 Java 生态系统比 C 系列具有更快的开发时间。可以在早上讨论改进措施,并在下午在生产中实施、测试和发布。

在我们这个领域,一个错误可以在几秒钟内抹去一整年的利润,因此不能在质量上妥协。我们使用了许多开源库和项目,实现了严格的敏捷开发环境,包括使用 Jenkins、Maven、单元测试、夜间构建和 Jira。

通过 Java,开发人员可以专注于业务逻辑,而不是像 C++ 那样调试一些晦涩的内存 Coredump 或跟指针打交道。而且,由于 Java 强大的内存管理,初级程序员也可以在入职第 1 天就开发代码,并且风险有限。

只要有良好的设计模式和干净的编码习惯,就可以用 Java 达到 C++ 的延迟。

Java 可以优化和编译应用程序运行期间观察到的最佳路径,但是 C++ 会预先编译所有内容,因此,即使未使用的方法,也仍将是最终可执行二进制文件的一部分。

没有银弹,Java 这块有一个问题,而且是一个重大的问题,让 Java 成为一门如此强大和令人愉快语言的原因,也是它的缺点(至少对于微秒级敏感的应用),那就是 Java 虚拟机(JVM)。

1. Java 即时编译代码(Just in Time 编译器),这意味着第一次遇到一些代码时,也可能产生编译延迟。

2. Java 管理内存的方式是通过在堆空间中分配内存块。每隔一段时间,它就会清理这个空间,删除旧的对象,为新的对象腾出空间。主要问题是,为了进行准确的统计,应用程序线程需要被瞬间 "冻结"。这个过程被称为垃圾收集(GC)。

GC 是低延迟应用程序开发人员放弃 Java 的主要原因。

市场上有一些 Java 虚拟机。最常见和标准的是 Oracle Hotspot JVM,它在 Java 社区中被广泛使用,主要是出于历史原因。

对于要求非常高的应用程序,Azul Systems 提供了一个很棒的替代方案,称为 Zing。

Zing 是 Oracle Hotspot JVM 一个强大的替代品。Zing 解决了 GC 暂停和 JIT 编译问题。

让我们来研究使用 Java 的固有问题和可能的解决方案。

像 C++ 这样的语言被称为编译语言,因为交付的代码完全是二进制的,可以直接在 CPU 上执行。

PHP 或 Perl 被称为解释语言,因为解释器(安装在目标机器上)会边运行边编译每一行代码。

Java 介于两者之间;它将代码编译成所谓的 Java 字节码,而字节码又可以在它认为合适的时候被编译成二进制。

Java 之所以不在启动时编译代码,与长期的性能优化有关。通过观察应用程序的运行情况,分析实时的方法调用和类的初始化,Java 会编译经常调用的部分代码。它甚至可能会根据经验做出一些假设(这部分代码永远不会被调用,或者这个对象永远是一个 String)。

1. 一个方法需要被调用一定的次数来达到编译阈值,然后才能被优化和编译(这个限制是可以配置,但通常是 10000 次左右的调用)。在此之前,未经优化的代码并没有以 "全速" 运行。Java 在更快的编译和高质量的编译之间做了一个取舍(如果假设不对,会有重新编译的代价)。

2. 当 Java 应用程序重启时,又回到了原点,必须等待再次达到这个阈值。

Azul Zing 通过让其 JVM 将编译后的方法和类的状态 "保存" 在它所谓的配置文件中来解决这些问题。这种名为 ReadyNow!® 的独特功能,意味着 Java 应用程序始终以最佳速度运行,即使在重新启动后也是如此。

当使用现有的配置文件重新启动应用程序时,Azul JVM 会立即调用其先前的结果并直接编译标注的的方法,从而解决了 Java 预热问题。

Hotspot JVM 大延迟峰值清晰可见,而 Zing 的延迟随着时间的推移保持相当稳定。

百分位数分布表明,1% 的时间里,Hotspot JVM 产生的延迟是 Zing JVM 的 16 倍。

GC 的影响在 Java 开发者中是一个很大的话题;一个完整的垃圾收集通常被称为 "stop-the-world 暂停",因为它会冻结整个应用程序。

多年来,许多 GC 算法都试图在吞吐量(多少 CPU 用于实际的应用逻辑而不是垃圾收集)与 GC 暂停(应用可以承受暂停多长时间)之间做一个取舍。

自 Java 9 以来,G1 收集器一直是默认 为什么要使用高频外汇? GC,其主要思想是根据用户提供的时间目标来划分 GC 暂停时间。它通常提供较短的暂停时间,但代价是较低的吞吐量。此外,暂停时间会随着堆的大小而增加。

Java 提供了大量的设置来调整其垃圾收集(以及 JVM),从堆大小到收集算法,以及分配给 GC 的线程数。所以,看到 Java 应用程序配置了大量的自定义选项是很常见的。

一个古老的(现在仍然使用的)技术是使用可重用对象的对象池。例如,一个数据库连接池将持有 10 个已打开的连接的引用,准备在需要时使用。

多线程通常需要锁,这会导致同步延迟和暂停(特别是当它们共享资源时)。一个流行的设计是一个环形缓冲队列系统,在一个无锁的设置中,有许多线程写和读( 参阅 disruptor)。

一些专家甚至选择完全自己实现 Java 内存管理,自己管理内存分配,虽然解决了一个问题,但却带来了更多的复杂性和风险。

在这种情况下,显然应该考虑其他 JVM,于是我们决定尝试 Azul Zing JVM。

这是因为 Zing 使用了一个独特的收集器,叫做 C4(Continuurrentously Concurrent Compacting Collector),它允许无暂停地收集垃圾,而不关心 Java 堆的大小(最高可达 8 TB)。

在这种情况下,Java 程序员可以享受到两全其美的好处,既可以享受到 Java 的简单性(无需偏执于创建新对象),又可以享受到 Zing 的底层性能,使整个系统的延迟高度可预测。

多亏了 GC easy,一个通用的 GC 日志分析器,我们可以在真实的自动交易应用中(在模拟环境中)快速比较两种 JVM。

在我们的应用中,使用 Zing 的 GC 比使用标准的 Oracle Hotspot JVM 小 180 倍左右。

更令人印象深刻的是,GC 暂停通常与实际应用暂停时间相对应,而 Zing 智能 GC 通常是在最小或没有实际暂停的情况下平行发生的。

总之,Java 在享受简单性和面向业务的特性同时,仍然可以实现高性能和低延迟。虽然 C++ 仍然可用于特定的底层组件,如驱动程序、数据库、编译器和操作系统,但大多数现实生活中的应用程序都可以用 Java 来开发,包括那些最苛刻的应用程序。

这就是为什么根据 Oracle 公司的统计, Java 是第一大编程语言,在全球拥有数百万开发人员和超过 510 亿台 Java 虚拟机的原因。

作者:Jad Sarmo

medium.com/@jadsarmo/why-we-chose-java-for-our-high-frequency-trading-application-600f7c04da94

为什么要使用高频外汇?

秋招来啦,大彬利用周末时间整理了各大互联网公司操作系统高频面试题,在这里分享给大家~

操作系统的四个特性?

进程和线程的区别如下

扫描二维码关注公众号,回复: 为什么要使用高频外汇? 14482664 查看本文章

并发和并行

并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。单核处理器可以做到并发。比如有两个进程 为什么要使用高频外汇? A 和 B , 为什么要使用高频外汇? A 运行一个时间片之后,切换到 B , B 运行一个时间片之后又切换到 A 。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。

多线程相较单线程的好处

什么是协程?

线程和协程有什么区别呢?

1、管道通信

匿名管道( pipe )为什么要使用高频外汇? :管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道是半双工的通信方式,数据只能单向流动。

2、消息队列

3、共享内存。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

4、信号量。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

什么是死锁?

如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方持有的资源,所以这两个线程就会互相等待而进入死锁状态。

线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过 Thread.sleep(1000) 。让线程 A 休眠 1s 为的是让线程 B 得到执行然后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死锁。

死锁怎么产生?怎么避免?

死锁产生的四个必要条件

避免死锁的方法

进程调度策略有哪几种?

先来先服务:非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。另外,对 I/O 密集型进程也不利,因为这种进程每次进行 I/O 操作之后又得重新排队。

短作业优先:非抢占式的调度算法,按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

最短剩余时间优先:最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

时间片轮转:将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

优先级调度:为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

进程有哪些状态?

进程一共有 5 种状态,分别是创建、就绪、运行(执行)、终止、阻塞。

运行状态就是进程正在 CPU 上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。

就绪状态就是说进程已处于准备运行的状态,即进程获得了除 CPU 之外的一切所需资源,一旦得到 CPU 即可运行。

阻塞状态就是进程正在等待某一事件而暂停运行,比如等待某资源为可用或等待 I/O 完成。即使 为什么要使用高频外汇? CPU 空闲,该进程也不能运行。

运行态→阻塞态:往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。

阻塞态→就绪态:则是等待的条件已满足,只需分配到处理器后就能运行。

运行态→就绪态:不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。

就绪态→运行态:系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态。

操作系统里的内存碎片怎么理解?

有什么解决办法

什么是分页?

把内存空间划分为大小相等且固定的块,作为主存的基本单位。因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录映射关系,以实现从页号到物理块号的映射。

访问分页系统中内存数据需要两次的内存访问 (一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。

什么是分段?

分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。

分段内存管理当中,地址是二维的,一维是段号,二维是段内地址;其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。

分页和分段有什区别?

页面置换算法

为什么要页面置换:

几种页面置换算法:

最佳置换算法(理想):将当前页面中在未来最长时间内不会被访问的页置换出去

先进先出:淘汰最早调入的页面

最近最久未使用 LRU:每个页面有一个t来记录上次页面被访问直到现在,每次置换时置换t值最大的页面(用寄存器或栈实现)

时钟算法clock(也被称为最近未使用算法NRU):页面设置访问为,将页面链接为一个环形列表,每个页有一个访问位0/1, 1表示又一次获救的机会,下次循环指针指向它时可以免除此次置换,但是会把访问位置为0, 代表他下次如果碰到循环指针就该被置换了。页面被访问的时候访问位设为1。页面置换的时候,如果当前指针的访问位为0,置换,否则将这个值置为0,循环直到遇到访问位为0的页面。

改进型Clock算法:在clock算法的基础上添加一个修改位,优先替换访问位和修改位都是0的页面,其次替换访问位为0修改位为1的页面。

最少使用算法LFU:设置寄存器记录页面被访问次数,每次置换当前访问次数最少的。

用户态和内核态

为什么要有这两种状态?

需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络,CPU划分出两个权限等级 -- 用户态和内核态。