使用任何编程语言创建交易机器人的分步指南

我没有资格就投资,法律等提供建议。我不是要这样做。本指南的目的是教您有关出于教育目的对交易机器人进行编程的知识。您必须了解,通过创建机器人,您应对其做出的决定,其执行的投资操作以及与交易活动相关的风险负责。我对您在阅读本材料后所做的决定不承担任何责任。请记住,机器人程序可能会损失很多钱,因此请谨慎使用它们。



您经常会遇到这样的文章:“程序员需要实现的10个项目”。这些文章中经常列出交易机器人。我相信开发交易机器人是值得的投资。因此,我决定花一些时间编写有关此内容的教程。



但是,我决定对那些想创建自己的机器人的人应该熟悉的概念进行分解,而不是对某些代码进行逐行分析。我的材料的重点是,在阅读之后,您将自己编写代码。



因此,我将讨论开发交易机器人的有用知识,以及为此所需的知识(从与交易所合作到实施简单的交易策略)。在这里,我将探讨与简单交易机器人的体系结构和内部结构有关的问题,以及它们背后的思想。 我将演示用伪代码编写的示例。因此,您可以阅读本指南,并立即以所选的编程语言编写自己的机器人。 结果,您将使用熟悉的工具感到自在。您将能够从容地参与编程,而不必花费时间来设置工作环境并习惯于新语言。 您将选择一种武器,我将教您如何使用该武器。



















步骤1.选择武器



在本教程的第一步,您将选择要使用的编程语言。您必须自己决定这个问题。



如果您计划在未来为bot配备机器学习机制,则可能会首选Python之类的某些语言。但我的主要想法是,您可以选择最方便使用的语言。



步骤2.寻找战场





在编写交易机器人的教程中常常忽略了一个重要主题。它涉及交易所的选择。事实是,为了使机器人能够执行其创建的目的,它需要访问可以进行交易的交易所。选择交流并知道如何使用它与编程技能一样重要。



因此,您的第一步将是确定您将要进行的交易(股票,货币,加密货币)并确定您将在何处进行交易。



如果我们谈论交易所交易的资产,那么我建议您注意加密货币。提出此建议的原因不是我是区块链技术和加密货币的支持者(我对此问题完全持开放态度),而不仅仅是加密货币市场每周7天全天候工作。



更多的“传统”资产只能在特定的时间间隔(通常仅在工作日)进行交易。例如,股票市场通常从上午9点至下午4点开放,并在周末关闭。尽管外汇市场可以全天候运作,但通常在周末关闭。



在这方面,加密货币最适合我们,因为这个市场的选择将使我们的机器人能够连续工作。此外,加密货币以其高水平的波动性而闻名。这意味着,首先,您在进行交易时会损失很多钱,其次,它们是研究和测试交易策略的绝佳工具。



我们已经讨论过交换资产。现在让我们讨论在选择要为其创建机器人的交易所时要考虑的要求。即,我在谈论两个基本要求:



  1. 您必须具有在选定交易所上进行交易的合法能力,并能够使用其提供的交易工具。如果我们谈论加密货币,那么在某些国家/地区禁止交易。选择乐器和交易所时要考虑到这一点。
  2. API, . , .


在确定某个交换符合这两个基本要求之后,您可以对其进行更深入的分析。例如,估计佣金的大小,评估其可靠性和受欢迎程度,并查看其API文档的质量。



但是,与其他所有事项一样重要,我建议您评估交易所的交易量。低交易量往往落后于价格走势。此外,对他们执行限价指令更加困难(我们将在下面对此进行更多讨论)。



如果您最终决定选择加密货币,那么这里是领先交易所的好清单。在这里您可以找到有关它们的各种信息,以帮助您选择交易所。



步骤3.建立营地





如果交换是战场,那么现在我们将讨论将军队派往战场的地点。顺便说一句,也许是时候让我配合这样的类比了。



我在这里谈论服务器。僵尸程序代码必须在某些服务器上执行,这将允许僵尸程序将请求发送到交换API。



当然,在测试机器人时,您的计算机可以充当服务器。但是,如果您需要机器人始终保持工作状态,那么常规计算机绝对不是最佳选择。



我在这里有两个建议:



  1. Raspberry Pi可以扮演服务器角色(这种方法更有趣)。
  2. 服务器可以是某种云服务(这种方法更好)。


我认为在您自己的Raspberry Pi服务器的基础上组织一个bot是一个有趣且现代的想法,因此,如果您喜欢这个想法,可以将其付诸实践。



但是大多数机器人制造商可能会选择AWSAzureGCSDigital Ocean等云服务提供商



大多数主要的云提供商都提供良好的免费计划,因此您可以免费向该提供商托管机器人。



这结束了我关于服务器的对话。您应该选择最适合自己的东西。对于像我们正在进行的这样的小型项目,选择的项目不会对最终结果产生重大影响。



步骤4.创建一个机器人





现在,乐趣开始了。但是,在开始我们项目的这一部分之前,请检查是否已完成以下操作:



  1. 您已经在交易所注册并获得了使用它的必要许可。
  2. 您可以使用交换API,并且具有API密钥。
  3. 您已选择为机器人托管。


如果这些问题得到解决,则意味着我们可以继续。



▍最简单的机器人



我的目标是帮助到现在为止完全不了解机器人的人提高到创建简单的工作机器人的水平。因此,我将告诉您如何创建一个简单的交易机器人,您可以根据自己的需求进行扩展和改进。



我们的漫游器会有一些限制:



  1. 该漫游器只能停留在以下两种状态之一:买(买)或卖(卖)。他不会经常以不同的价格下订单。如果最后一个操作是销售,则机器人将尝试执行的下一个操作是购买。
  2. 该机器人将使用固定的阈值来做出购买和出售决策。更智能的机器人可能能够根据各种指标独立调整这些值,但是我们的机器人的策略和限制将手动设置。
  3. 他只会交易一个货币对。例如-BTC / USD。


这些限制使我们的任务更加容易。该机器人很简单,这意味着它更易于构建和维护。这也将使我们能够非常快速地将其代码部署到服务器。基本上,我们在这里谈论的是KISS原则。



▍决策机制



这是一个简单的图表,概述了我们的机器人如何运行。





现在,您可以开始计划您的机器人架构。



首先,我们需要一个变量,该变量将存储有关机器人当前确切状态的信息。这是买或卖。布尔变量或枚举是存储此类信息的不错选择。



然后,您需要设置买卖操作的阈值。这些值以百分比表示,代表自上次交易以来资产价格的涨跌幅。



例如,如果我以100美元的价格买了东西,而现在的价格是102美元,那么我们要处理的是价格上涨2%。如果将卖出操作的阈值设置为价格上涨1%,则看到该2%的漫游器将出售该资产,因为它已经获得了超过我们设置的阈值的利润。



在我们的情况下,这样的值将是常数。我们需要4个这样的值-每个机器人状态2个。



for购买操作的阈值(如果机器人处于卖出状态)



  • DIP_THRESHOLD:如果价格下跌幅度大于指定值,则机器人进行购买操作DIP_THRESHOLD其背后的理由是实施低买高卖策略。也就是说,机器人将尝试以降低的价格购买资产,期望价格上涨并且有可能出售该资产。
  • UPWARD_TREND_THRESHOLD:如果价格上涨的值大于此常量指定的值,则机器人会购买资产。此举与“低买高卖”的理念背道而驰。其目的是在价格进一步上涨之前确定上升趋势,并且不要错过购买机会。


这是一个可以帮助您理解这些常量含义的插图。





如果我们在图中用红色SELL标记标记的那一刻执行了SELL操作,则在此之后,决定执行BUY操作的机器人将由阈值DIP_THRESHOLD指导UPWARD_TREND_THRESHOLD



如果价格低于下方的绿线或上方的绿线,我们将执行买入操作。在图中所示的情况下,价格超过了上限。因此,我们以该值为指导UPWARD_TREND_THRESHOLD执行了BUY操作。



for用于卖出操作的阈值(如果机器人处于买入状态)



  • PROFIT_THRESHOLD:如果价格已高于根据此值计算得出的价格,则机器人会出售资产,因为该资产以前是以较低价格购买的。这就是我们获利的方式。我们以高于购买时价格的价格出售资产。
  • STOP_LOSS_THRESHOLD:理想情况下,我们希望漫游器仅在出售对我们有利时出售资产。但是,也许市场急剧下滑。在这种情况下,我们决定在遭受太大损失之前退出交易,然后以较低的价格购买资产。该阈值用于亏损平仓。此操作的目的是防止更大的损失。


这是一个例子。





这显示了购买时购买标记所在的情况。之后,价格达到指定的限制PROFIT_THRESHOLD,我们以利润出售资产。机器人就是这样赚钱的。



既然我们对机器人的功能有了一个大致的了解,现在该看一下伪代码了。



▍使用API​​的有用功能



机器人需要的第一件事是具有使用交换API交换数据的能力。我们使用几个辅助函数来实现这些功能:



FUNCTION getBalances():
    DO:  GET-  API    
      
    RETURN:   

FUNCTION getMarketPrices():
    DO:  GET-  API    
      
    RETURN:   

FUNCTION placeSellOrder():
    DO:
        1.      ( 
           , , 
        50%  )
        2.  POST-  API   
         SELL
    RETURN:   

FUNCTION placeBuyOrder():
    DO:
        1.      ( 
           , , 
        50%  )
        2.  POST-  API   
         BUY
    RETURN:   

//  ,    
//    
FUNCTION getOperationDetails():
    DO:  GET-  API   
      
    RETURN:   


上面的代码应该是不言自明的,没有太多解释。但是,实现此功能后,您必须确切知道发出发起购买或出售某物的POST请求时需要将哪些数据传输到API。



例如,通常在交易XAU / USD对(黄金和美元)时,在执行请求时,您可以指定需要购买多少黄金或需要出售多少美元。执行此类请求时,清楚地了解所执行操作的含义非常重要。



Bo主机器人回路



现在,我们已经准备了帮助程序功能,让我们开始描述机器人的动作。首先,我们需要创建一个以固定间隔运行的无限循环。假设我们希望机器人每30秒尝试执行一次操作。这是一个像这样的循环:



FUNCTION startBot():
    INFINITE LOOP:
        attemptToMakeTrade()
        sleep(30 seconds)


接下来,我们将配置上面讨论的变量和常量,并编写允许其做出决定的机器人逻辑。结果,除了辅助功能和主循环外,主程序代码还将如下所示:



bool isNextOperationBuy = True

const UPWARD_TREND_THRESHOLD = 1.50
const DIP_THRESHOLD = -2.25

const PROFIT_THRESHOLD = 1.25
const STOP_LOSS_THRESHOLD = -2.00

float lastOpPrice = 100.00

FUNCTION attemptToMakeTrade():
    float currentPrice = getMarketPrice()
    float percentageDiff = (currentPrice - lastOpPrice)/lastOpPrice*100
    IF isNextOperationBuy:
        tryToBuy(percentageDiff)
    ELSE:
        tryToSell(percentageDiff)

FUNCTION tryToBuy(float percentageDiff):
    IF percentageDiff >= UPWARD_TREND_THRESHOLD OR percentageDiff <= DIP_THRESHOLD:
        lastOpPrice = placeBuyOrder()
        isNextOperationBuy = False

FUNCTION tryToSell(float percentageDiff):
    IF percentageDiff >= PROFIT_THRESHOLD OR percentageDiff <= STOP_LOSS_THRESHOLD:
        lastOpPrice = placeSellOrder()
        isNextOperationBuy = True


请注意,此代码中的阈值是随机选择的。您应该根据自己的交易策略选择这些值。



将上面的代码与辅助功能以及主要的bot循环(可以由诸如function表示)结合起来main,这意味着我们现在有了一个非常简单的工作bot,具有bot典型的基本功能。



在周期的每个迭代中,机器人将在分析当前情况时使用其代码中硬编码的阈值检查其当前状态(买入或卖出)并尝试执行交易操作。然后,如果操作完成,则漫游器将更新有关其当前状态的信息以及有关上次执行操作的价格的数据。



步骤5.改进机器人





我们的机器人的基本架构已准备就绪。但是我们可以通过为其添加一些附加功能来对其进行一些改进。



▍杂志



当我开始创建该机器人的变体之一时,对我来说非常重要的是,该机器人将不断记录有关其操作的信息,并将其显示在终端和单独的日志文件中。



程序的每个步骤都应随附以下记录:



[BALANCE] USD Balance = 22.15$
[BUY] Bought 0.002 BTC for 22.15 USD
[PRICE] Last Operation Price updated to 11,171.40 (BTC/USD)
[ERROR] Could not perform SELL operation - Insufficient balance


日志文件中包含时间戳。结果,如果我每天连接到服务器一次,并且看到例如错误消息,那么我可以准确找出错误发生的时间以及机器人在这段时间内一直在做什么。



使bot具有这些功能就是写一个可以命名的函数createLog应该在主要bot循环的每个步骤中调用此函数。该函数可能是这样的:



FUNCTION createLog(string msg):
    DO:
        1.  msg  
        2.  msg   ,   


trends趋势识别



我们的机器人的主要目标是廉价购买资产并将其出售,从而获利。但是在他的代码中,有两个常量代表两个阈值,这部分地与这个目标相矛盾。这个UPWARD_TREND_THRESHOLDSTOP_LOSS_THRESHOLD



这些值旨在通过在价格下跌时出售资产来限制损失,并在价格上涨时组织购买资产。这里的要点是,在它们的帮助下,我们尝试预测趋势,价格(一旦出现)超出了常规策略的范围,但可能损害我们或给我们金钱。这两者和另一个都为我们提供了一些行动。



价格分析的工作方式现在极大地限制了我们。通过比较一对指标进行的价格分析与识别趋势的机制相距甚远。



但是幸运的是,我们可以毫不费力地使趋势检测系统更可靠。



我们只需要组织观察比以前更多的价格值即可。之前,我们仅存储有关一个价格指标的信息-有关上次操作(lastOpPrice时资产价值的信息例如,您可以存储有关漫游器周期的最后10或20次迭代的价格信息,并将其与当前价格进行比较,不仅限于此lastOpPrice这很可能可以更好地识别趋势,因为使用这种方法,我们可以捕获短期价格波动,而不是长时间的波动。



▍数据库?



一个简单的机器人实际上并不需要数据库。毕竟,他使用的数据量很少,并将他需要的所有信息存储在内存中。



但是,例如,如果僵尸程序异常停止,该怎么办?在没有人为干预的情况下,他怎么能知道这是什么意思lastOpPrice



为了避免在重新启动bot代码时需要人工干预,我们可能需要一些简单的数据库,其中可以存储一些指标,例如lastOpPrice



通过这种方法,机器人在启动时可能不会使用代码中硬编码的值。而是,它访问存储的数据并从上次中断的地方继续。



根据您认为此“数据库”的简单程度,甚至可以决定使用常规的.txt或.json文件,因为无论如何,我们都在谈论存储有限的数据集。



▍控制面板





如果您想要组织机器人活动的可视化,并在不编辑其代码的情况下对其进行管理,则可能需要将机器人连接至某种控制面板。



这将要求机器人具有自己的服务器API来管理其功能。



例如,这种方法使更改阈值变得容易。



有许多仪表板模板可用,这意味着,如果您决定执行此类操作,则甚至不必从头开始创建一个。例如,看看Start BootstrapCreative Tim



historical历史数据测试策略



许多交易所允许客户访问历史价格数据。另外,如果您需要这种数据,通常很容易掌握。



在实际应用交易策略之前,对测试交易策略非常有用。这允许使用历史数据和假钱运行模拟。这使您可以了解阈值的性能,并在必要时更改这些值。



on关于阈值和索赔的其他信息



下订单时要记住一些注意事项。



首先,您需要知道两种订单:限价单和市场订单。如果您对此一无所知,则绝对应该阅读特殊文献。我将用几句话来解释这些想法。



市场订单是按当前市场价格执行的订单。在大多数情况下,这意味着可以立即执行。



另一方面,限价订单是放置的指示价格低于市场价格(对于买入订单而言)或高于市场价格(对于出售订单而言)的订单。同时,由于价格可能未达到指定值,因此无法保证将执行这些订单。



限价订单的优势在于,它们允许在预期市场波动的情况下在交易员认为可能的价格下单。



此外,与市场订单相比,通常向此类订单收取更低的佣金。这是由于以下事实:所谓的“承办费”通常应用于市场订单,而通常称为“制造商费用”来限制订单。



这些佣金之所以这样命名,是因为任何人下了市价单就是在“获取”当前市场价格。限价单不在市场价格之内,它们为市场增加了流动性,从而“创造了一个市场”,为此,其创造者将获得较低的佣金报酬。



请注意,我们在这里考虑的机器人最适合处理市场订单。



并且,在结束关于佣金的讨论时,我想指出,在设置值时PROFIT_THRESHOLD,还应考虑佣金。



为了获利,机器人必须首先执行买入操作,然后执行卖出操作。这意味着将收取两次佣金。



结果,需要对机器人进行配置,以便从销售中获得的利润至少可以弥补佣金。否则,机器人将亏本交易。



让我们考虑一下,从使用佣金的假设出发,该佣金不取决于应用程序的数量和操作的类型。因此,以100.00美元购买资产的佣金为0.50美元。如果以100.75美元的价格出售该资产并收取相同的佣金,那么事实证明毛利润为0.75%。但是,实际上,我们正在处理0.25%的净亏损。



现在想象您的机器人总是以净亏损关闭交易。在这种情况下,您可能会很快损失很多钱。



结果



我的主要目标是揭示开发交易机器人时需要了解的概念。我试图以一种即使对于那些从未在交易所进行交易的人也可以理解的方式来描述一切。同时,我没有将叙述与任何特定的编程语言联系在一起。



我假设该材料的读者知道如何使用他们选择的编程语言发出HTTP请求。因此,我没有详细介绍编程,而是专注于其他方面。



我告诉了您开发交易机器人的一切。希望您现在可以创建自己的机器人。



您是否使用交易机器人?






All Articles