I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
搜索 "计算手数": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
当然,您可以将 0.9 改为 (1 - maxRisk),并实现一个可由用户设置的 "最大风险百分比 "属性。
附注:您在论坛上使用的是名还是姓?感谢您提供信息。在交易机器人必须通过的检查 中,提到了 "CheckMoneyForTrade "方法,该方法用于检查用于交易的保证金是否大于自由保证金(ACCOUNT_FREE_MARGIN)。如果我没有理解错的话,你还应该检查使用的资金是否也超过了账户余额的某个百分比,即类似的百分比:
当然,您可以将 0.9 改为 (1 - maxRisk),并实现一个可由用户设置的 "最大风险百分比 "属性。
附注: 在论坛上,我们是以名字相称还是以名字相称?每个人都对手数大小耿耿于怀,这里有很多代码和评论!
我现在已经弄明白了 William Roeder 为 MT5 写的东西,那就是未经测试的(!!)函数:
(https://www.mql5.com/en/forum/133792/page3#comment_3405179&https://www.mql5.com/en/forum/390088#comment_28092477)
如果您发现错误,请告诉我!
由于这里大多数人的昵称或名字都是匿名的,以前更是如此,所以 "Du "已经成为一种习惯。
感谢您提供的代码。唯一缺少的就是适应有效的中间批量大小:
我还有一个问题:如果我用 TICK_VALUE 或上述的 deltaValue 计算止损交易的损失,结果总是与 MQL5 的内部计算略有不同:
这是否是因为欧元账户、市场价格 1.0 和市场价格 1.2 的每一个刻度点的损失/收益不同?例如,如果我在下面的代码中输入 "price + 0.1 "而不是 price,输入 "sl + 0.1 "而不是 sl,那么跳动距离 (diff) 是相同的,但OrderCalcProfit 输出的结果却不同。当我查看手动交易的利润/亏损时,后者似乎得到了证实。
如果我是对的,那么下面的代码会更准确:
附注:再次感谢您提供的基本思路:将风险系数不与余额挂钩,而是与自由保证金挂钩显然是有道理的。下面的代码是根据 mql 5 自带的抛物线萨专家创建的。我是否可以在这里反转买入信号和卖出信号的操作? 也就是说,当买入信号出现时,我想让它打开卖出而不是买入。有人能帮忙吗?
#property copyright "MetaQuotes有限公司版权所有2022"。
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| 包括 |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- 可用信号
#include <Expert\Signal\SignalSAR.mqh> //--- 可用的信号
//--- 可用的尾音
#include <Expert\Trailing\TrailingNone.mqh
//--- 可用的资金管理
#include <Expert\Money\MoneyFixedLot.mqh
//+------------------------------------------------------------------+
//| Inputs | //++
//+------------------------------------------------------------------+
//--- 专家输入
输入字符串 Expert_Title ="sar"; // 文档名称
ulong Expert_MagicNumber =13831; //
bool Expert_EveryTick =false; //
//--- 主信号输入
input int Signal_ThresholdOpen =10; // 打开的信号阈值 [0...100]
input int Signal_ThresholdClose=10; // 关闭信号的阈值 [0...100] 输入
输入 double Signal_PriceLevel =0.0; // 执行交易的价格水平
输入 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 =1.0; // 抛物线 SAR(0.02,0.2) 重量 [0....1.0]
//--- 资金输入
输入 double Money_FixLot_Percent =10.0; // 百分比
输入 double Money_FixLot_Lots =0.1; // 固定交易量
//+------------------------------------------------------------------+
//| 全局专家对象
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
// 专家的初始化函数
//+------------------------------------------------------------------+
int OnInit()
{
//--- 专家初始化
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//----- 失败
printf(__FUNCTION__+": error initialising expert");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- 创建信号
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//----- 失败
printf(__FUNCTION__+": error creating signal");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
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);
//--- 创建拖尾对象
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//----- 失败
printf(__FUNCTION__+": error creating trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- 向专家添加拖尾(将自动删除))
if(!ExtExpert.InitTrailing(trailing))
{
//----- 失败
printf(__FUNCTION__+": error initialising trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- 设置拖尾参数
//--- 创建货币对象
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);
}
//--- ok
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
// 专家的去初始化函数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick "事件处理函数
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| "交易 "事件处理函数
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "定时器 "事件处理函数
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
我现在有时间研究一下您的解决方案。它更准确(而另一种则更谨慎,因为要考虑到佣金?),而且出错率显然更低,在MQ模拟账户的黄金和白银交易中可以看到这一点--在Roboforex交易中,正如所料,它比您的方案更谨慎:
在MQ账户上,手数会过多。
这是我比较两种方法的脚本:
我将方向定为 in > sl(买入)或 in < sl(卖出)。这样挂单就没有问题了
感谢您的测试。是的,如果您将结果相互比较,一方面可以看到OrderCalcProfit 的一致性,另一方面,至少对 EURUSD 和 RoboForex 而言,结果大约相差 "手数 * 每手佣金"。这一点可以补充:
如果我正确使用论坛搜索,有没有办法使用 MQL5 直接查询 "CommissionPerLot "值?
如果我正确使用了论坛搜索,那么没有办法直接使用 MQL5 查询 "CommissionPerLot "值,对吗?是的,不能直接在终端中查询,但可以向经纪人或在交易历史中查询:DEAL_COMMISSION。