指标中的警报。如何在指标中插入 “警报 ”和 “箭头”?
市场 MQL5。安装 EA 时出现的问题和错误以及解决方案
描述
在本文中,我将解释我基于不同货币对和各种类型的存款的自由保证金的百分比(风险 %)计算手数的方法。自动手数或来自余额的动态手数。风险管理器。我将向您展示我的自动手数代码。
在动态地段进行交易时,了解这些方法尤为重要。让我们开始吧:
基本概念:
首先,让我们强调一下在此计算中使用的一些概念:
自由保证金( AccountFreeMargin() )——未用于开仓保证金的资金。自由保证金的计算公式为:自由保证金 = 当前存款余额 – 开仓所需保证金。该指标决定了当前时刻可以开仓的交易数量。
卖价是您从经纪商那里购买一定数量金融工具的价格。经纪商以这个价格卖给您。在外汇市场交易时,您会在各处遇到这种类型的价格:从交易终端到股票报告以及金融市场的分析文章。
买价是您以某个价格向经纪商出售一定数量金融工具的价格。经纪商以这个价格从您那里购买。当在外汇市场交易时,您会在有关国际外汇市场的讨论中遇到这种类型的价格:从交易终端和经纪商网站上的汇率到国际金融市场的股票报告和分析文章。
杠杆是抵押金额与借款金额的比率。在最初选择杠杆时,您选择杠杆大小,这表明客户的存款将被增加的倍数,以在外汇市场进行交易操作。客户可以选择从1:1到1:500的杠杆,这意味着客户可以仅使用自己的资金进行交易,或者要求将存款增加最多500倍,以此金额进入市场。杠杆作为交易者进入市场的金额与其存款规模的比率,在交易过程中起着关键作用,因为它允许交易者显著增加其资本。
货币对是两个货币的指定名称,共同形成汇率。货币对作为金融交易的对象。货币对由组成该对的两种货币的连续指定表示,书写时可以连在一起或用斜杠分隔,形式如下:基准货币 / 报价货币。基准货币是首先买入和卖出的第一种货币,报价货币用于表示基准货币的价格。货币对是外汇市场的基本概念,涉及到该市场的各个方面:从市场报告到交易终端。
手数 – 合约规格中指定的基准货币、商品或股票的数量。手数取决于合约中指定的货币数量,是确定交易合约规模的计量单位。手数有一个特定的大小,用于确定在外汇市场进行金融交易所使用的货币金额。要执行交易,客户确定交易规模,以手数表示。交易量指示了交易将包含多少货币。手数是合约的大小,是外汇交易中使用的固定货币数量。
两种货币之间的汇率是由特定时刻的供求关系相互作用决定的。
这个过程被称为货币报价,报价可以是直接报价或反向报价。
直接报价反映了以本国货币单位表示的外币价格。
大多数汇率以美元对各种国家货币的直接报价形式表示。
例如,USD/UAH—30.70 意味着1美元值30.70乌克兰格里夫纳,
而USD/CHF—1.0850 表示1美元等于1.0850瑞士法郎。
反向报价以本国货币表示外币的价值。
历史上,像英镑、欧元、澳大利亚元和新西兰元等货币都是以这种方式报价的。
例如,EUR/USD—1.3374 表示1欧元值1.3374美元,
而GBP/USD—1.5970 意味着1英镑等于1.5970美元。
还有交叉汇率的概念,其中美元既不是基准货币也不是报价货币。
例如,EUR/JPY、GBP/CHF 和 EUR/GBP。
技术方面
- NormalizeDouble – 将浮点数四舍五入到指定的精度。
- MODE_LOTSIZE – 基准货币中的合约大小。
- MODE_LOTSTEP – 更改手数的步长。
- AccountCurrency – 返回当前账户的货币名称。
- MathFloor – 函数返回小于或等于x的最大整数。
重要提示:为了确保所有计算的准确性,请在“市场观察”面板中激活所有符号 :
我的账户货币计算公式
我的计算公式如下:
美元存款
美元存款直接报价 ()
手数 = 自由保证金 * 风险 * 杠杆 / 100 / 合约大小
美元存款反向报价()
手数 = 自由保证金 * 风险 * 杠杆 / 卖价 / 100 / 合约大小
美元存款交叉汇率:
选项 1:如果存在基准货币 + 美元的当前价格(例如,如果结算货币对是 AUDCAD,那么基准货币的当前价格 = AUDUSD)
手数 = 自由保证金 * 风险 * 杠杆 / (基准货币当前价格 + 美元) / 100 / 合约大小
选项 2:如果不存在基准货币 + 美元的当前价格(例如,CADJPY)
手数 = 自由保证金 * 风险 * 杠杆 / 100 / 合约大小
欧元存款
欧元存款直接报价
手数 = 自由保证金 * 风险 * 杠杆 / 100 / 合约大小
欧元存款交叉汇率:
当前价格 = EUR + 报价货币(例如,如果结算货币对是 AUDCAD,那么当前价格是报价货币 = EURAUD)
手数 = 自由保证金 * 风险 * 杠杆 / (当前价格 EUR + 报价货币) / 100 / 合约大小
格里夫纳存款及其他
格里夫纳存款反向报价(例如,USDUAH)
手数 = MathFloor(自由保证金 * 风险 * 杠杆 / 100 / 当前价格 / 合约大小 / 手数步长 / 20) * 手数步长
格里夫纳存款交叉(例如,EURGBP)
当前价格 = MarketInfo(StringSubstr(Symbol(), 0, 3) + UAH + StringSubstr(Symbol(), 6), MODE_BID);
if(pr != 0) 手数2 = MathFloor(自由保证金 * 风险 * 杠杆 / 当前价格 / 100 / 合约大小 / 手数步长) * 手数步长;
else 手数 = MathFloor(自由保证金 * 风险 * 杠杆 / 100 / 合约大小 / 手数步长) * 手数步长;
这些函数的顺序是通过在不同存款上计算参数确定的。
如果您对这些计算有建议,请在订购编程时分享您的自动手数功能。
或者 自由职业:MetaTrader和MQL的自定义编程! 完成?
外部变量 自动手数计算函数:
手数 | 开仓的固定手数。 |
RiskLotType TypeAutolot | 自动手数计算类型: BALANCE(来自余额的风险) – 自动手数是从当前余额计算的。手数计算基于账户余额。如果账户上有未平仓头寸,下一个手数将大致相同,因为余额不会因当前未平仓头寸的数量而减少! FREEMARGIN(来自自由保证金的风险) – 从当前自由保证金计算标准手数是账户上的未平仓头寸越多,下一个头寸计算的手数越小。这是因为开仓时,自由保证金减少,因此每个新开仓的手数在计算自动手数时会更小。 RiskLot 选项的风险计算类型: 可用模式: RiskLotType = 0, // 来自自由保证金的风险 RiskLotType = 1, // 来自余额的风险 |
DynamicLot | 动态手数,自动手数,用于开仓。 您可以将动态手数计算设置为自由保证金的百分比和其他因素。 我们的自动手数计算: 公式和代码: https://expforex.com/zh/my-autolot-secrets-dynamiclot-autolot/#eb-table-content-4 |
DynamicLotStopLoss | 来自止损的风险 – 在考虑止损的情况下计算自动手数。 在止损时以余额的百分比作为最大损失。 在计算手数时,我们的专家顾问会考虑开仓时的止损。 如果交易在止损时关闭,此交易的损失将等于开仓时余额的百分比。 重要!如果您在交易开启后更改了止损,交易的手数大小将无法更改。交易关闭时,损失可能会多也可能会少。 重要!如果您使用跟踪止损,交易的止损会随着每个报价变化,但手数大小无法更改。 公式和代码: https://expforex.com/zh/my-autolot-secrets-dynamiclot-autolot/#eb-table-content-5 |
LotBalancePcnt RiskLot LotBalancePercent | 自动手数的百分比。 动态手数(自动手数)函数的百分比。 如果 RiskLot = 0,则交易手数(交易量)将根据参数 手数 计算。 如果 RiskLot 不等于 0,则客户端终端上的交易将以客户的自由保证金百分比(自动手数)的手数开仓。 |
RiskRate | 您的货币对美元(或您的账户货币)的汇率。 默认情况下,RiskRate = 0,这意味着专家顾问将尝试在市场回顾中找到正确的汇率。 为了让自动手数在所有货币对中正常工作,您需要在市场观察中打开“显示所有货币对”。 |
MaxLot | 专家顾问在计算自动手数和马丁格尔的第一个主要头寸时可以开的最大手数。 |
Martin | 马丁格尔。在亏损时,最后一个平仓头寸的手数的标准倍增。 如果 Martin = 1,则不激活马丁格尔(固定手数)。 如果 Martin = 0,则专家顾问无法开下一个头寸。 如果 Martin = 2,则第一个手数 = 0.1,第二个手数 = 0.2,依此类推:0.4 – 0.8 – 1.6 – 3.2 – 6.4….. 如果 Martin = 0.5,则第一个手数 = 1,第二个手数 = 0.5,依此类推:0.25 – 0.125。 |
您需要代码吗?
自动手数计算 代码函数:
input double Lots=0.01; //手数 --> 固定手数的开仓和订单
input bool DynamicLot=false; //动态手数 --> 从自由保证金计算手数
input bool DynamicLotStopLoss=false; //动态手数止损 --> 从止损和自由保证金计算手数
input double LotBalancePercent=1; //手数余额百分比 --> 手数计算的百分比
extern double RiskRate=0; //风险汇率 --> 用于手数计算的存款货币的符号汇率
input double MaxLot=999; //最大手数 --> 开仓时的最大手数
double GetSizeLot(double ll=1) // 函数返回手数大小
{
string Author = "函数模板作者:www.expforex.com";
string lotcalc;
double pr;
string Valdepo = AccountCurrency();
// 如果启用了MM,则确定手数大小
double Lot2, MinLots, MaxLots;
int lotdig;
if (MarketInfo(Symbol(), MODE_LOTSTEP) == 0.01) lotdig = 2; else lotdig = 1;
if (Valdepo == "USD")
{
if (StringSubstr(Symbol(), 0, 3) == "USD")
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else if (StringSubstr(Symbol(), 3, 3) == "USD")
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() / Ask / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else
{
pr = MarketInfo(StringSubstr(Symbol(), 0, 3) + "USD", MODE_ASK);
if (pr != 0)
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() / pr / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
}
}
if (Valdepo == "EUR")
{
if (StringSubstr(Symbol(), 0, 3) == "EUR")
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else
{
pr = MarketInfo("EUR" + StringSubstr(Symbol(), 0, 3), MODE_BID);
if (pr != 0)
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() * pr / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else
Lot2 = NormalizeDouble(AccountFreeMargin() * LotBalancePcnt * AccountLeverage() / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
}
}
if (Valdepo == "UAH")
{
if (StringSubstr(Symbol(), 0, 3) == "USD")
Lot2 = NormalizeDouble(AccountFreeMargin() / 40 * LotBalancePcnt * AccountLeverage() / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else if (StringSubstr(Symbol(), 3, 3) == "USD")
Lot2 = NormalizeDouble(AccountFreeMargin() / 40 * LotBalancePcnt * AccountLeverage() / Ask / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else
{
pr = MarketInfo(StringSubstr(Symbol(), 0, 3) + "USD", MODE_ASK);
if (pr != 0)
Lot2 = NormalizeDouble(AccountFreeMargin() / 40 * LotBalancePcnt * AccountLeverage() / pr / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
else
Lot2 = NormalizeDouble(AccountFreeMargin() / 40 * LotBalancePcnt * AccountLeverage() / 100 / MarketInfo(Symbol(), MODE_LOTSIZE), lotdig);
}
}
MinLots = MarketInfo(Symbol(), MODE_MINLOT);
MaxLots = MaxLot;
lotcalc = "自动手数=" + Lot2;
if (!DynamicLot) Lot2 = Lots;
if (Lot2 < MinLots) Lot2 = MinLots;
if (Lot2 > MaxLots) Lot2 = MaxLots;
lotcalc = lotcalc + " 最小手数=" + MinLots + " 手数=" + NormalizeDouble(Lot2, lotdig);
Print(lotcalc);
return (NormalizeDouble(Lot2, lotdig));
}
止损 自动手数 计算函数:
如果您想在EA中添加止损 自动手数 功能,您可以下载我们的代码:
StopLosssd = 点数中的止损
外部变量:
手数 = 0.1; // 固定手数
DynamicLotStopLoss = // true/false
LotBalancePcnt (RiskLot) = 20; // 自由保证金的百分比
函数:
double GetSizeLotStopLoss(double StopLosssd=1) // 函数返回手数大小 { string Author = "函数模板作者:www.expforex.com"; string Valdepo = AccountCurrency(); // 如果启用了MM,则确定手数大小 double MinLots; int lotdig; if (MarketInfo(Symbol(), MODE_LOTSTEP) == 0.01) lotdig = 2; else lotdig = 1; double Free = AccountFreeMargin(); double LotVal = MarketInfo(Symbol(), MODE_TICKVALUE); // 1手1点的成本 double Min_Lot = MarketInfo(Symbol(), MODE_MINLOT); double Max_Lot = MarketInfo(Symbol(), MODE_MAXLOT); double Step = MarketInfo(Symbol(), MODE_LOTSTEP); double Lot = MathFloor((Free * LotBalancePcnt / 100) / (StopLosssd * LotVal) / Step) * Step; MinLots = MarketInfo(Symbol(), MODE_MINLOT); if (Lot < MinLots) Lot = MinLots; return (NormalizeDouble(Lot, lotdig)); }
有问题吗?
如果您有任何问题,请随时提出。我们不会卖猪肉看包。
我们每个产品在购买前都可以进行测试。
我们感谢您对我们产品的关注和支持,并努力保持高质量标准。
感谢您与我们同行!
您有问题吗?
3 responses to “我的自动投注秘诀。动态地段或 Autolot。”
-
I want to be able to double whatever lot size that is being copied from the master onto the client.. How do I do that with settings… so no matter what every new position the client with be 2x that.. master opens a trade of .03, then it will be copied to client as .06.
-
I want to be able to double whatever lot size that is being copied from the master onto the client.. How do I do that with settings… so no matter what every new position the client with be 2x that.. master opens a trade of .03, then it will be copied to client as .06.
This post is also available in: English Українська Portuguese Español Deutsch Chinese Русский Français Italiano Türkçe 日本語 한국어
Leave a Reply