世界金融市场为您提供了巨大的获利和亏损潜力。 市场上总是有获利的潜力,因为您可以向任一方向进行交易。 无论您的立场是看涨还是看跌,交易者的赚钱能力始终存在,亏损能力也一直存在。

情绪,心理思维陷阱和心理纪律经常阻碍利润,这是所有新交易者中有 95%(或 更多 )在第一个月损失所有投资资本的主要原因

使用以MQL4语言编写的Meta Trader中的Expert Advisor算法交易机器人是通过代码进入市场的一种方法,从而使人们从图片中脱颖而出,仅使用数字和程序逻辑即可。

摆脱情感是一种措施,但这并不意味着机器人不会输。 实际上,即使是大型投资银行也必须在交易造成致命损失之前关闭交易机器人。 2013年, 高盛公司的交易算法出现了严重错误,花费了1亿美元。

您需要了解,在继续阅读本指南之前,甚至考虑使用您的来之不易的现金 ,您可能会从代码中损失经纪帐户中的所有存款(在最坏的情况下,某些经纪人可能会损失更多的费用)应用)

您最终应对交易负责,即使程序代码为您负责。 虽然可能会造成损失,但您也可以在帐户上增加帐户数量并使它在睡眠时呈指数增长。

如果您想完全在自动驾驶上运行,则完全不需要任何交互即可实现。 在继续日常生活的同时,您实际上可以被动地赚钱。

我完全提倡这种完全免提交易的策略,我也从未使用过这种策略,并且发现它根本无法盈利。 监视活跃的机器人和当前的交易,同时密切关注经济日历和事件,与放任自流并期望获得最佳状态大不相同。 胜利可能是史诗般的,但无人值守的损失要大得多。

安装MQL4

请从他们的网站下载MT4并将其安装在您的计算机上。

  • Windows用户
  • macOS用户
  • Linux用户

MT4运行之后,您将需要一个具有支持MT4的代理的帐户。 然后,他们将可以为您提供MT4登录凭据。

所有经纪人都将提供一个模拟帐户,鼓励您始终使用该模拟帐户来编写和测试您的软件。

在桌面上配置MT4后,我们可以继续创建自己的EA交易算法交易机器人。

如何编写机器人

有许多种语言适合从头开始编写算法交易机器人,但是实际上,您将遇到的复杂情况是使用API​​来指导您的股票经纪人将提供的市场准入—这实际上是您如何使自己能够将交易订单下达金融市场。

可以使用多种语言来处理市场数据,并且可能比MT4 MQL4可以运行回溯测试的速度要快(回溯测试是测试算法机器人的一种方式;稍后将对此进行更多介绍)。 出于功能简化和对金融软件的一般支持的原因,我强烈建议使用MetaTrader 4的本地语言MQL4(MetaQuotes语言4)来编写算法交易机器人。

MQL4的语法

MQL4的形式类似于PHP,C,C ++或VBScript。 下面是一个在市场数据的每一个波动点都会调用的函数的示例:

void OnTick(){if(Bars<100 || IsTradeAllowed()==false)return;if(CalculateCurrentOrders(Symbol())==0){CheckForOpen();} else {CheckForClose();}}

在这里,我们检查是否有足够的市场数据加载了Bars < 100 。 MQL4集的预定义变量如棒 (其中包含的杆装载到图表的数量)。

另外,我们用或||检查 是IsTradeAllowed()的条件。 这是一个检查功能,用于检查交易环境当前是否不繁忙。

MQL4的元素(如这些预定义变量和Symbol()之类的图表操作函数)使您在公园里散步时编写策略,对我来说,为什么用MQL4编码算法交易机器人确实比其他语言更可取。

我建议您在有时间对使用MQL4进一步满足自己的需求更有信心时,仔细阅读《 MQL4参考》 。

在MetaEditor中编辑MQL4代码

我建议使用MT4交易平台随附的内置MetaEditor IDE。 要进入编辑器,只需在左侧导航器窗格中右键单击现有的Expert Advisor,然后从菜单中选择Modify


然后将打开MT4的MetaEditor,您将能够创建一个新文件。 这提供了用户语法突出显示和调试输出。

重要说明:如果要在外部编辑器中进行编辑,则必须使用MetaEditor将mq4文件编译为ex4专家顾问。 因此,必须熟悉MetaEditor。

我们的算法

对于我们的战略,我们将开始使用的支撑位和阻力来自SMA(S moothed 中号 oving 一个 verage)指标的基础。 SMA可以预测进入/退出信号看涨或看跌 。 平滑的移动平均线有助于我们消除市场的噪音,从而使我们更清楚地了解价格走势的方向。


无论是上升趋势还是下降趋势,SMA都可以作为支撑或阻力 ,具体取决于方向。 当价格上涨时,SMA将充当支撑的底线,而当价格下跌时,SMA将充当阻力/上限。

入学依据

当我们绘制两个不同时期的SMA(40个时期之一和100个时期之一)时,我们可以看到它们如何交叉并为进入奠定基础。 如前所述,当SMA低于价格(小于收盘价)时,我们认为这是支撑的基础,而当SMA高于价格(大于收盘价)时,我们认为这是一条线。 抵抗

因此,在代码中,我们首先执行以下操作以创建一种检查输入交叉的方法,以便稍后确定输入的基础:

//+------------------------------------------------------------------+
//| Check for cross over of inputs                                      |
//+------------------------------------------------------------------+
int CheckForCross(double input1, double input2)
{static int previous_direction = 0;static int current_dirction = 0;// Up Direction = 1if(input1 > input2){current_direction = 1;}// Down Direction = 2if(input1 < input2){current_direction = 2;}// Detect a direction changeif(current_direction != previous_direction){previous_direction = current_dirction;return (previous_direction);} else {return (0);}
}

现在,我们可以使用MQL4提供的iMA技术指标方法来计算SMA,然后通过CheckForCross函数运行它,以查看是否存在交叉:

shortSma = iMA(NULL, 0, PeriodOne, 0, MODE_SMMA, PRICE_CLOSE, 0);
longSma = iMA(NULL, 0, PeriodTwo, 0, MODE_SMMA, PRICE_CLOSE, 0);// Check if there has been a cross on this tick from the two SMAs
int isCrossed = CheckForCross(shortSma, longSma);

在这里,我们使用的是MODE_SMMA返回美国moothed M上的小号 oving从A verage iMA为我们选择的平滑方法技术指标的方法。

如果要使用另一种平滑方法,则有多种选择,例如“简单”,“指数”和“线性加权”。

与所有支持和阻力一样,标准交易方法在这里起作用: 买入支撑卖出阻力

因此,对于我们的算法,我们将要做到这一点。 当双向出现交叉时,我们将采用适当的贸易方向并进入市场。

f(isCrossed == 1){ticket = OrderSend(Symbol(),OP_BUY, LotsOptimized(),Ask,3,0,0,"Double SMA Crossover",MAGICNUM,0,Blue);if(ticket > 0){if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))Print("BUY Order Opened: ", OrderOpenPrice());}elsePrint("Error Opening BUY Order: ", GetLastError());return(0);}if(isCrossed == 2){ticket = OrderSend(Symbol(),OP_SELL, LotsOptimized(),Ask,3,0,0,"Double SMA Crossover",MAGICNUM,0,Blue);if(ticket > 0){if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))Print("SELL Order Opened: ", OrderOpenPrice());}elsePrint("Error Opening SELL Order: ", GetLastError());return(0);}}

在这里,我们将iMA技术指标定义的两个SMA加载后,检查先前定义的CheckForCross函数的返回。

我们使用MQL4提供的OrderSend打开交易。 最佳实践是,将结果存储在ticket变量中,然后检查返回值是否为正,以便处理可能已从经纪人方面报告的任何错误。

退出依据

像条目(除了在逆时)的基础上,当SMA创建死亡交叉 ,我们可以利用这个信号,我们的贸易关闭,如果任何交易是开放的。 这样做的逻辑如下:

// Get the current total orderstotal = OrdersTotal();// Manage open orders for exit criteriafor(cnt = 0; cnt < total; cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()){// Look for long positionsif(OrderType()==OP_BUY){// Check for Exit criteria on buy - change of directionif(isCrossed == 2){OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // Close the positionreturn(0);}}else //Look for short positions - inverse of prior conditions{// Check for Exit criteria on sell - change of directionif(isCrossed == 1){OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // Close the positionreturn(0);}}}}

在这里,我们进入一个for循环以迭代所有未结订单,尽管目前我们一次只能进行一笔交易-这使我们可以在将来扩展并在需要时进行多次未结交易。

这也使OrderSelect方法的使用更加容易,因为我们可以使用for循环中的cnt变量。

进入迭代之后,我们只需查看当前的OrderType (检查“ 购买OP_BUY或“ 出售 OP_SELL订单),然后从CheckForCross方法的返回中应用条件逻辑即可。

加钱管理

现在,我们的算法很简单,有交易入场和退出的基础,但是在资金管理方面仍然非常愚蠢。 为了将风险控制在一定范围内,我们只会将每笔交易的可交易权益的五分之一放在其中,因此现在我们需要将其纳入我们的算法中。

lot = NormalizeDouble((AccountFreeMargin()/5)/1000.0,1);
if(lot<0.1) lot=0.1;
return(lot);

这意味着,如果您的帐户中有10,000美元,我们一次只能进行五分之一的交易(2,000美元),因此脚本将仅以0.1或0.2的较小手数进行交易-例如,第五次计算。

我们使用AccountFreeMargin和NormalizeDouble来生成此手数,如果以最小手数0.1以下的方式计算,则将其设置为0.1。

随着账户的增长(或收缩!),风险敞口将仅被设置为账户净值的五分之一。 这意味着从理论上讲不会发生固定金额的过度暴露(例如,在任何规模的账户上交易特定的固定手数),从而消除了或大大降低了因过度交易而产生的追加保证金的风险。

如果市场由于尖峰/波动而在返回之前剧烈波动,而您又不想存入更多资金,则追加保证金是非常现实的风险。

用外行的术语来说,交易的手数将由我们的脚本动态计算以满足股票的大小。 因此,越来越大的利润潜力是非常现实的。

注意: 一个不错的功能可能是提供一个参数来限制可交易池。 例如,如果您只希望使用账户中的$ 1,000进行交易,而无论可用保证金如何,您都可以将可交易金额设置为$ 1,000,而不是整个账户规模。

就我个人而言,在使用新脚本时,我总是使用这样的功能,以减少风险,直到我真正确定该脚本的功能足以允许更多资金使用为止。

以编程方式,这需要一个参数,并且需要对上面的代码示例稍作更改以检查该变量,而不是AccountFreeMargin()值。

收支平衡

此外,我们将尝试执行一些收支平衡的情况,这意味着如果市场发生变化,不利于我们在开市时造成大量损失,我们将寻求以最小的损失退出并至少保持收支平衡以保留我们的资本。

这可以通过监视我们的交易损失以及与开放价格的关系来实现。 如果方向发生变化并且我们的交易被排除在货币之外,我们可以尝试以尽可能接近入场价的价格平仓:

bool BreakEven(int MN){int Ticket;for(int i = OrdersTotal() - 1; i >= 0; i--) {OrderSelect(i, SELECT_BY_POS, MODE_TRADES);if(OrderSymbol() == Symbol() && OrderMagicNumber() == MN){Ticket = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Green);if(Ticket < 0) Print("Error in Break Even : ", GetLastError());break;}}return(Ticket);
}

上面使用OrderModify尝试将止损设置为订单开盘价。 这是一种粗略但简单的方法,可确保当价格回到入门价时我们退出。 仅当当前未实现利润处于亏损状态时才应用此方法。

添加盈亏平衡保证金

可以通过简单地添加到OrderOpenPrice方法来增加收支平衡的利润,如下所示:

Ticket = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+10, OrderTakeProfit(), 0, Green);

在此示例中,我们通过止损限制输入到闭包的点差为10分。

注意:应检查此方法的交易方向,例如应根据买入或卖出头寸将其增加或降低入场价。

确保收益不丢失的另一种方法是使用止损 ,这将在另一指南中详细讨论。

整个剧本

这是我们的专家顾问的完整列表。 我们有几个可用的参数可供使用,例如止盈水平,止损和SMA时期。

请随意使用参数,以了解最适合您的交易情况的参数,并微调您的算法。

请记住:过去的表现绝不代表未来。

//+------------------------------------------------------------------+
//|                                                   Double Sma.mq4 |
//|                                   Copyright 2017, Tom Whitbread. |
//|                                           http://www.gript.co.uk |
//+------------------------------------------------------------------+
#property copyright   "2017, Tom Whitbread."
#property link        "http://www.gript.co.uk"
#property description "Smoothed Moving Average sample expert advisor"#define MAGICNUM  20131111// Define our Parameters
input double Lots          = 0.1;
input int PeriodOne        = 40; // The period for the first SMA
input int PeriodTwo        = 100; // The period for the second SMA
input int TakeProfit       = 40; // The take profit level (0 disable)
input int StopLoss         = 0; // The default stop loss (0 disable)
//+------------------------------------------------------------------+
//| expert initialization functions                                  |
//+------------------------------------------------------------------+
int init()
{return(0);
}
int deinit()
{return(0);
}
//+------------------------------------------------------------------+
//| Check for cross over of SMA                                      |
//+------------------------------------------------------------------+
int CheckForCross(double input1, double input2)
{static int previous_direction = 0;static int current_direction  = 0;// Up Direction = 1if(input1 > input2){current_direction = 1;}// Down Direction = 2if(input1 < input2){current_direction = 2;}// Detect a direction changeif(current_direction != previous_direction){previous_direction = current_direction;return (previous_direction);} else {return (0);}
}//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized(){double lot = Lots;// Calculate Lot size as a fifth of available free equity.lot = NormalizeDouble((AccountFreeMargin()/5)/1000.0,1);if(lot<0.1) lot=0.1; //Ensure the minimal amount is 0.1 lotsreturn(lot);}//+------------------------------------------------------------------+
//+ Break Even                                                       |
//+------------------------------------------------------------------+
bool BreakEven(int MN){int Ticket;for(int i = OrdersTotal() - 1; i >= 0; i--) {OrderSelect(i, SELECT_BY_POS, MODE_TRADES);if(OrderSymbol() == Symbol() && OrderMagicNumber() == MN){Ticket = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Green);if(Ticket < 0) Print("Error in Break Even : ", GetLastError());break;}}return(Ticket);
}//+------------------------------------------------------------------+
//+ Run the algorithm                                               |
//+------------------------------------------------------------------+
int start()
{int cnt, ticket, total;double shortSma, longSma, ShortSL, ShortTP, LongSL, LongTP;// Parameter Sanity checkingif(PeriodTwo < PeriodOne){Print("Please check settings, Period Two is lesser then the first period");return(0);}if(Bars < PeriodTwo){Print("Please check settings, less then the second period bars available for the long SMA");return(0);}// Calculate the SMAs from the iMA indicator in MODE_SMMA using the close priceshortSma = iMA(NULL, 0, PeriodOne, 0, MODE_SMMA, PRICE_CLOSE, 0);longSma = iMA(NULL, 0, PeriodTwo, 0, MODE_SMMA, PRICE_CLOSE, 0);// Check if there has been a cross on this tick from the two SMAsint isCrossed = CheckForCross(shortSma, longSma);// Get the current total orderstotal = OrdersTotal();// Calculate Stop Loss and Take profitif(StopLoss > 0){ShortSL = Bid+(StopLoss*Point);LongSL = Ask-(StopLoss*Point);}if(TakeProfit > 0){ShortTP = Bid-(TakeProfit*Point);LongTP = Ask+(TakeProfit*Point);}// Only open one trade at a time..if(total < 1){// Buy - Long positionif(isCrossed == 1){ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),Ask,5, LongSL, LongTP, "Double SMA Crossover",MAGICNUM,0,Blue);if(ticket > 0){if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))Print("BUY Order Opened: ", OrderOpenPrice(), " SL:", LongSL, " TP: ", LongTP);}elsePrint("Error Opening BUY  Order: ", GetLastError());return(0);}// Sell - Short positionif(isCrossed == 2){ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),Bid,5, ShortSL, ShortTP, "Double SMA Crossover",MAGICNUM,0,Red);if(ticket > 0){if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))Print("SELL Order Opened: ", OrderOpenPrice(), " SL:", ShortSL, " TP: ", ShortTP);}elsePrint("Error Opening SELL Order: ", GetLastError());return(0);}}// Manage open orders for exit criteriafor(cnt = 0; cnt < total; cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()){// Look for long positionsif(OrderType() == OP_BUY){// Check for Exit criteria on buy - change of directionif(isCrossed == 2){OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // Close the positionreturn(0);}}else //Look for short positions - inverse of prior conditions{// Check for Exit criteria on sell - change of directionif(isCrossed == 1){OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // Close the positionreturn(0);}}// If we are in a loss - Try to BreakEvenPrint("Current Unrealized Profit on Order: ", OrderProfit());if(OrderProfit() < 0){BreakEven(MAGICNUM);}}}return(0);
}

测试出来


我们可以在MT4(Meta Trader 4)环境中轻松测试某金融工具的前几天,几个月甚至几年的市场数据。 然而,鼓励交易商不信任背单独测试,但用它作为指导来引导他们的交易策略,看看的想法是多么有效。

可以说,回溯测试使交易者可以检查自己的想法是否成立,可以说在投入更多精力并向前发展之前将更多的算法写入代码中。

专家文件在哪里放置?

如果您一直在使用外部文本编辑器来编写顾问,则需要将专家顾问加载到MT4交易平台中进行编译和错误检查。 只需将.mq4文件添加到Expert目录中的MetaTrader安装中,例如/MetaTrader4/MQL4/Experts

然后,可以在专家部分下方左侧的导航器菜单中的MT4软件内使用专家顾问。

注意:请确保您正在模拟帐户上进行测试。 真实账户将用真实货币进行交易,尽管利润将是真实的,但亏损也将是真实的。

回测


如果您在最后一年的电缆(GBP / USD)上测试了一项策略,发现利润率高于1(表示您已经赚了钱),那么您可能会感到很高兴。

这是否会在现实世界中解决还完全是另外一个问题,这就是为什么正向测试与Z分数测试同样重要的原因。 对于机器学习算法而言,这是一个非常高级的主题,这里不会讨论,但是会在以后的更高级指南中进行讨论。

如何开始回测

使用快捷键Control-R打开策略测试器,或从“ 查看”菜单中选择它。 测试器窗格将在窗口底部打开。

在这里,您可以在第一个下拉菜单中选择要运行的算法,因此请选择您在此处创建的Expert Advisor的文件名。 接下来,您可以选择交易品种(金融工具)。 我将测试英镑对美元的外汇GBPUSD符号。

我们还可以选择要运行的时间段解析度(15分钟,1小时,1天等等)。 我将使用30分钟设置。

最后,我们提供了一个仅对“ 每个 报价” ,“ 控制点 ”或“ 公开价格”进行建模的选项。 在编写脚本时,您只能选择“ 开放价格” ,因为它将Swift执行测试-尽管结果尚不值得您花大量的钱!

为此,当您在进行继续测试之前正在寻找真实的测试时,建议在Every Tick上运行。 这将需要更长的时间来处理! (您可以将其在线运行在MT4 VPN中,或者如果需要,当然也可以在本地计算机上运行一整夜。)

修改参数

我们为PeriodOne设置了两个参数( PeriodOnePeriodTwo ),以便可以修改两个移动平均线的时间段。

可以通过策略测试器通过单击专家属性按钮并查看输入选项卡来访问它们。

此处可以为每个参数提供一个数值-默认值为PeriodOne = 40PeriodTwo = 100

正向测试

对历史数据进行测试后,您就可以开始对实时市场进行测试,因为您已经看到您的想法是否从反向测试中渡过了难关,并且(希望)对您认为的成功战略充满信心!

在实时市场中,由于先前的反向测试中没有考虑因素,您可能会发现自己的策略平淡无奇。 记住市场永远是对的 。 您的代码永远不会比市场更聪明,并且交易没有运气。

前瞻测试确实是一种严峻的考验,以了解该策略是否对您有利可图。

通常,最好在适用于MT4 EA的专用VPN(专家顾问)上执行正向测试,大多数FX经纪人通常免费提供该VPN。 该脚本将在市场开放时以24/5运行,您将能够通过终端登录到帐户来实时监控交易,因为它将通过MT4应用程序在移动设备上运行,或者通过MT4应用程序在台式机上运行。 MT4软件。

高挥发性

对我们脚本而言,真正的杀手是市场的高波动性,这可能是由许多外部因素引起的。

例如,任何崩溃或突发崩溃,战争,选举,加息,债券收益率或重要的经济报告(例如CPI,GDP或税制的变化)都将在整个全球经济及其许多金融市场中引起重大变化。 因此,间接地,您在一种货币对或证券中的交易可能会受到另一个国家的事件的影响,而这在您最初可能没有预料到。

最近,英国脱欧以及后来的希拉里·克林顿(Hillary Clinton)在美国大选前夕对联邦调查局的调查,都是对任何有兴趣仔细观察的人来说,市场剧烈波动的例子。


让我们以英国脱欧为例。 英国公众似乎相信大多数人认为英国脱欧投票的可能性很小。 我并不那么乐观,全力以赴,由于汇率暴跌,节省了我在英国的很多股权。

至于其他人,我恐怕不能说他们不是那么幸运。 正如一些主要银行的顾问所指出的那样,对中止票进行套期保值当然会导致相反的结果,而在等待英镑恢复的时候,那些归属于英镑的人损失了大约15%。

此类情况非常适合关闭您的交易机器人,并且仅在高市场波动性之外进行交易。 自动在前导或滞后指标上编码此类结果将非常困难,并且在事件发生后或手动进行更好的交易。 在重大事件中,错误或矛盾信号的机会总是更高,而采用手动基本方法而不是技术方法可能更有利可图。

暂停机器人并没有错,因为您将要面临危机。 这可能会节省您的损失,但另一方面,它可能会让您错过巨大的胜利。 根据我的经验,由于巨大的不确定性和追加保证金的可能性,或者由于极端的瞬间峰值,在交易能够进行之前就击中止损,获胜的可能性要小得多。

结论

我们列出了编写交易算法的一些基础知识,并介绍了许多新的想法。 希望通过遍历代码,现在您希望了解MQL4中算法的内部工作原理,并了解如何使用技术指标(例如移动平均线)来生成进入和退出信号。

在资金管理方面,我们已经超过了包括收支平衡条件和动态手数大小以使用可用资产五分之一的可能性。 随意调整代码的这些部分,以适应您的冒险需求。 我们已经审阅过MT4的回测策略测试器,并为将来进行正向测试甚至Z分数测试的可能性打开了大门,所有这些在开始上线之前都是至关重要的。

通过更多的微调和研究,您可能很快就会在市场上获得非常有利可图的经验。 既然您已经拥有一个很好的基础专家顾问作为基础脚本,那么您就可以开始将自己的策略编写为MQL4语言-并测试它们是否真的如您认为的那样有效,或者像一些交易书籍和导师那样暗指!

展望未来,您肯定希望在投入大量金钱之前对其进行更多测试。 一旦您对自己的脚本有足够的信心,您可能还想加入一个社区,以进一步发展您的想法并进行头脑风暴,或者拆散其他算法以查看其工作原理以及如何将其纳入您的策略中。

与其他交易者共享专家顾问是一种很好的协作方式,可以看看其他人是如何为众多技术指标(例如MACD,RSI,CCI,ADX,布林频带和Ichimoku)编写算法的。等等。

也许将来,如果您有足够的信心,您可能希望将脚本出售给其他人,在这种情况下, MT4市场或您自己的站点可能是入门的理想之地!

为了进行更多测试,我真的建议您下载所有以前的市场数据并将其加载到MT4中,以便能够进行更彻底的回溯测试。 有关更多信息,请参考本指南 ,并祝您交易愉快!

免责声明 :本文并非旨在作为投资或财务建议,而仅是作为软件创建和研究的技术教程。 该代码仅用于教育目的,不作任何担保或保证。

翻译自: https://code.tutsplus.com/tutorials/create-a-algorithm-trading-robot-the-basics-of-writing-a-expert-advisor-in-mql4--cms-27984

创建算法交易机器人:用MQL4编写Expert Advisor的基础相关推荐

  1. Velox将在Pangolin上启动其算法交易机器人,并计划推出更多DeFi解决方案

    官方消息,Velox将在Pangolin上启动其算法交易机器人,并计划推出更多DeFi解决方案.Velox将其用于去中心化交易所的算法交易系统引入了Avalanche,进一步在其DeFi生态系统内扩展 ...

  2. 用最新技术优化深度学习BTC交易机器人

    本文翻译自Adam King的<Optimizing deep learning trading bots using state-of-the-art techniques>,英语好的建 ...

  3. 最新 | 用深度强化学习打造不亏钱的交易机器人(附代码)

    今天,你AI了没? 关注:决策智能与机器学习,每天学点AI干货 --本文由<量化投资与机器学习>授权转载 在本文中,我们将创建深度强化学习agents,学习如何通过比特币交易赚钱.在本文中 ...

  4. 一文看懂怎样用 Python 创建比特币交易

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 比特币价格的上上下下,始终撩动着每一个人无比关切的小心脏.从去年初的 800 美元左右,飞涨到去年底到 19783.21 ...

  5. 听说三年前那些月入30K的程序员都是这样开始轻松构建算法交易机器:一点python基础+一点运气

    全文共3071字,预计学习时长9分钟 图源:Unsplash 人工智能的新突破每天都成为头条新闻.在金融领域,因其具有深厚历史.清楚明了和结构化数据,机器学习广泛运用.最终,金融领域成为了" ...

  6. 如何在算法交易中使用AI?摩根大通发布新版指南

    https://blog.csdn.net/cf2SudS8x8F0v/article/details/84901318 来源 :efinancialcareers.com 作者 :Sarah But ...

  7. 如何用树莓派和PHP开发一个比特币和以太坊交易机器人

    我最近得到了Raspberry Pi Zero Wifi,我告诉你这个东西是改变游戏规则的.我之前使用过RasPis,但由于该设备的占地面积小得多,耗电少,价格便宜且无线上网,因此非常适合低端或物联网 ...

  8. ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真

    ROS探索总结(四)--简单的机器人仿真 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by ...

  9. 创建一个urdf机器人_Matlab官方机器人工具箱Robotics System Toolbox官网翻译教程2

    %lesson 2 rigidBodyTree % 刚体树是刚体与关节连接性的一种表示.使用这个类在MATLAB?中建立机器人机械手模型.如果您有一个使用统一机器人描述格式(URDF)指定的机器人模型 ...

最新文章

  1. idea 代码自动补全快捷键
  2. Nginx报错:nginx: [emerg] open() “/usr/local/nginx/../conf/nginx.conf“ failed (2: No such file or direc
  3. 【NLP】一行Python代码中自动化文本处理
  4. Windows 下音频数据采集和播放
  5. OpenCV计算机视觉编程攻略(第2版)代码
  6. 最容易月薪过万城市排名出炉!
  7. 一文搞懂由积分判断函数零点个数问题(积分证明题总结笔记2/3)
  8. Pega How To系列之一:如何在页面上动态显示/隐藏内容 ----CheneyWang
  9. IFR202型红外雨量传感器非接触式检测降雨量的传感器
  10. ACM2021辽宁省赛:CDEFGILM
  11. SGU 482 Impudent Thief dp
  12. h5+css3基础面试题
  13. 面试官:RecyclerView布局动画原理了解吗?
  14. 基于Tesseract-OCR的空调外包装表面的字符识别
  15. MyBatis中的日志(LOG4J)
  16. 外文网站对CMap用法的精辟解释
  17. 3d游戏场景建模设计师需要学哪些软件?
  18. 计算机毕业设计ssm金牛社区疫情防控系统73a5s系统+程序+源码+lw+远程部署
  19. 押对信息流,百度站上全新起点
  20. 如何利用淘宝快速推广新品牌

热门文章

  1. Python制作登陆界面(2)(中等级)
  2. 计算机数据结构论文800,数据结构论文
  3. 1110 区块反转 – PAT乙级真题
  4. 19年冬季第二题 PAT甲级 1165 Block Reversing (25分) 跟1133类似的题目
  5. 史蒂夫·乔布斯-读书笔记2
  6. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(2) - 识别当前i.MXRT型号
  7. python算生日_Python3计算今天是否生日以及距离生日还有多少天
  8. Java实现经典算法
  9. unix 修改文件类型
  10. mousemove事件,鼠标移动过快时,无法全部响应