Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
大家好、
我目前在一个模拟账户上运行 Samuel 的 EA,我非常满意。编程不错!
它不时显示出良好的交易效果,但有一个弱点:
卖出期权会在图表谷底的转折点堆积,买入期权也会在相应的峰值堆积,然后这些期权会首先作为负值大量入账。我想重新编制程序,即在白天买入,在高峰卖出,但迄今为止我的尝试都失败了。我对 MQL5 也只是略知一二。
谁能帮帮我?
SG,非常感谢!
这通常行不通,因为 EA 采取盈利头寸的其他点也会随之反转 ....
但请阅读以下内容:
EA-freelancer 规格 :https://www.mql5.com/zh/articles/4368
Indi :https://www.mql5.com/zh/articles/4304
如何在 MQL5 和 MQL4 中订购交易机器人 :https://www.mql5.com/zh/articles/117
有了这些提示,您就可以更准确地说明您的想法,不管是为了自己看看是否可行,还是为了请人代劳,有偿 或无偿。
大家好(尤其是亲爱的作者)
我跟着这篇文章编码。我非常喜欢这篇文章,也从中学到了很多东西。
感谢您撰写了内容如此丰富的文章。
不过,我遇到了一个问题。我的 EA 没有下任何订单。我下载了作者的代码,但它也没有下任何订单。
由于这篇文章已经发表了 13 年,我认为代码现在已经过时了。谁能帮帮我?
我的代码在下面的文件中。谢谢大家。
您好,我想提醒您,我是一名初学者,所以请不要说脏话。)
我想通过生成器创建一个智能交易系统(一切似乎都很好,但有一个问题)
我希望不是在前一个交易结束后立即打开一个交易,而是例如在一根蜡烛之后、
我试着写了一些东西,但最后还是出错了。
有谁能帮我解决这个问题,或者告诉我是什么错误以及如何解决?
以下是实际代码:
//+------------------------------------------------------------------+
//| ParExpert.mq5 | //| Copyright 2022, Meta Notes.
//| 版权所有 2022 年,MetaQuotes 有限公司
//https://www.mql5.com |//
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd." #property链接 ""
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| 包括 |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- 可用信号
#include <Expert\Signal\SignalSAR.mqh> //--- 可用的信号
//--- 可用的尾音
#include <Expert\Trailing\TrailingFixedPips.mqh
//--- 可用资金管理
#include <Expert\Money\MoneyFixedLot.mqh> //--- 可用资金管理
//+------------------------------------------------------------------+
//| 输入
//+------------------------------------------------------------------+
//--- 专家输入
输入字符串 Expert_Title = "ParExpert"; // 文档名称
ulong Expert_MagicNumber = 24195; //
bool Expert_EveryTick = false; //
//--- 主信号输入
input int Signal_ThresholdOpen = 10; // 打开的信号阈值 [0...100]
input int Signal_ThresholdClose = 0; // 关闭信号的阈值 [0...100]....
输入 double Signal_PriceLevel = 0.0; // 执行交易的价格水平
输入 double Signal_StopLevel = 500; // 止损水平(以点为单位)
输入 double Signal_TakeLevel = 70; // 获利水平(以点为单位)
输入 int Signal_Expiration = 4; // 挂单有效期(以条为单位)
输入 double Signal_SAR_Step = 0.02; // 抛物线 SAR(0.02,0.2) 速度增量
输入 double Signal_SAR_Maximum = 0.2; // 抛物线 SAR(0.02,0.2) 最大速度
输入 double Signal_SAR_Weight = 0.6; // 抛物线 SAR(0.02,0.2) 重量 [0...1.0]
//--- 拖曳输入
input int Trailing_FixedPips_StopLevel = 0; // 止损追踪水平(点数)
input int Trailing_FixedPips_ProfitLevel= 10; //追踪获利水平(以点为单位)
//--- 资金输入
输入 double Money_FixLot_Percent = 10.0; // 百分比
输入 double Money_FixLot_Lots = 0.1; // 固定交易量
//--- 输入交易冷却时间
input int Expert_TradeCooldown = 1; // 交易之间的冷却时间(以条为单位)
//+------------------------------------------------------------------+
//| 全局专家对象
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
// 专家的初始化函数
//+------------------------------------------------------------------+
int OnInit()
{
//--- 专家初始化
if (!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))
{
//--- 失败
printf(__FUNCTION__ + ": error initializing expert");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 创建信号
CExpertSignal *signal = new CExpertSignal;
if (signal == NULL)
{
//--- 失败
printf(__FUNCTION__ + ": 错误创建信号");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- 创建过滤器 CSignalSAR
CSignalSAR *filter0 = new CSignalSAR;
if (filter0 == NULL)
{
//--- 失败
printf(__FUNCTION__ + ": error creating filter0");
ExtExpert.Deinit();
return (INIT_FAILED);
}
signal.AddFilter(filter0);
//--- 设置过滤器参数
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Weight(Signal_SAR_Weight);
//--- 创建追踪对象
CTrailingFixedPips *trailing = new CTrailingFixedPips;
if (trailing == NULL)
{
//--- 失败
printf(__FUNCTION__ + ": error creating trailing");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 向专家添加拖尾(将自动删除))
如果 (!ExtExpert.InitTrailing(trailing))
{
//--- 失败
printf(__FUNCTION__ + ": error initialising trailing");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 设置拖尾参数
trailing.StopLevel(Trailing_FixedPips_StopLevel);
trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- 创建资金对象
CMoneyFixedLot *money = new CMoneyFixedLot;
if (money == NULL)
{
//--- 失败
printf(__FUNCTION__ + ": error creating money");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 向专家添加资金(将自动删除))
if (!ExtExpert.InitMoney(money))
{
//--- 失败
printf(__FUNCTION__ + ": error initialising money");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 设置货币参数
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- 检查所有交易对象参数
if (!ExtExpert.ValidationSettings())
{
//--- 失败
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 调整所有必要的指标
if (!ExtExpert.InitIndicators())
{
//--- 失败
printf(__FUNCTION__ + ": error initialising indicators");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- 初始化最后交易时间变量
datetime lastTradeTime = 0;
ExtExpert.SetVariable("LastTradeTime", lastTradeTime);
//--- 确定
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
// 专家的去初始化函数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick "事件处理函数
//+------------------------------------------------------------------+
void OnTick()
{
//--- 检查上次交易的时间
datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime");
int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime);
如果 (cooldownBars < Expert_TradeCooldown)
{
//--- 交易冷却期未结束,跳过开立新交易
返回;
}
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "交易 "事件处理函数
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "定时器 "事件处理函数
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
大家 好😊
@Mario31415927
这只是因为在 ticker 中,每当出现一个新的周期或新的条形图(不管是什么),就会出现变量:
都会重置,无论是否已经开仓。
这一点在代码中很快就能找到。
但问题是,这是否是有意为之,如果是,如何重新关闭所有仓位?
也许在这种情况下我不理解 TRADE_ACTION_DEAL 订单类型?
交易订单过程也可以简单地调整为交易类 Trade。例如
致以最诚挚的问候:-)阅读: https://www.mql5.com/zh/articles/232
这解释了订单、头寸和交易之间的区别和关系。后者反映了经纪商方面的预订流程。
阅读:https://www.mql5.com/zh/articles/232
这解释了订单、头寸和交易之间的区别和关系。后者反映了经纪人方面的预订流程。
你好,卡尔、
感谢您的提示!
不过,我必须更正一下。
确实,变量在每个新的时间段都会重置:
但是,如果有相应的头寸,它们就会被重新设置。
但是,我遇到的现象是,买入(POSITION_TYPE_BUY)可以正确查询,但卖出(POSITION_TYPE_SELL)却不行。该变量是否已不再被设置?
我必须一步一步地调试代码。这只能是逻辑错误😉。
Sell_opened =true;// 这是一个卖点
哦,天哪,我今天可真走运。
只查询了一次。这就是错误所在)
所有仓位应按如下方式搜索;
的确是错误的,好像是一个网页文件。
我自己根据内容重新写了一遍上传了。因为是新手所以不知道有没有细节问题。希望有所帮助。
测试仪 - "不支持填充模式"
在 3 个不同的经纪商上都试过了。问题出在哪里?