每点的价格 - 页 3

 

嘿嘿,又是一个快乐的客户:)--既然如此,LEHayes能不能帮我计算一下资金管理的百分比,不要把点数四舍五入。这是我目前使用的方法,当我想投注我账户资产 的1%时

double Profit_F=0.00001,Lots=0.1;
Lots=NormalizeDouble((AccountEquity()*Profit_F),1)。
如果(Lots < 0.1) Lots=0.1。
如果(Lots > 1.0) Lots=1.0。

例如,当我有10,000美元时,这对我的100美元的止损很有效。因为$10,000 X 0.00001 = 0.1手。但是当我有15,000美元时,手数现在等于0.15,但它四舍五入为2.0,也许是因为我的经纪人不允许宏观手数。我怎样才能强迫它保持在0.1,直到股权达到20,000美元?我已经睡了很久了,在看完你的主题后,我太累了,无法搜索和学习。如果你有另一个计算毫米的方程式,请提供代替。

 
LEHayes:

这让我很抓狂,我已经找了好几个月了,我一直在寻找一个现有的算法,它只计算每点的价格,无论它是在哪个货币对上。我已经找到了两个非常好的资金管理策略,它们都依赖于这个值,作为预先计算交易规模和资金风险管理的一种方式,但我找不到一个处理每点价格的计算实例。

我愿意将我的资金管理系统提供给你,以换取这个功能。我将向你提供我的导师们所建议的两种技术。


首先我们要认识到有五种基本符号类型。当涉及到计算tick_value、杠杆等事项时,这很重要。

符号类型没有正式的定义,但对于一个以美元计价的账户,我是这样列举符号类型的。(这些是具体的例子,并不包括所有的类型)
            SymbolType 1:  Symbol() = USDJPY
                           
                           Base = USD
                           Counter = JPY
            
            SymbolType 2:  Symbol() = EURUSD
                           
                           Base = EUR
                           Counter = USD

            SymbolType 3:  Symbol() = CHFJPY
                           
                           Base = CHF
                           Counter = JPY
                           
                           USD is base to the base currency pair - USDCHF
                           
                           USD is base to the counter currency pair - USDJPY
            
            SymbolType 4:  Symbol() = AUDCAD
                           
                           Base = AUD
                           Counter = CAD
                           
                           USD is counter to the base currency pair - AUDUSD
                           
                           USD is base to the counter currency pair - USDCAD
            
            SymbolType 5:  Symbol() = EURGBP
                           
                           Base = EUR
                           Counter = GBP
                           
                           USD is counter to the base currency pair - EURUSD
                           
                           USD is counter to the counter currency pair - GBPUSD

相关性是指账户的计价方式与感兴趣的金融工具的基础货币和对应货币的关系。这对CFD以及货币对 都是一样的。

一旦你有了符号类型,你就可以计算每个金融工具的杠杆率--例如,这里是计算澳元的杠杆率所需的代码。

CalculatedLeverage=NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(CalculatedBasePairForCross,MODE_BID)+MarketInfo(CalculatedBasePairForCross,MODE_ASK))/(2*MarketInfo(Symbol(),MODE_MARGINREQUIRED)),2)
在这个例子中,我编码的调用函数已经确定了AUDCAD的CalculatedBasePairForCross是AUDUSD。
CalculatedBasePairForCross=StringConcatenate(SymbolBase,AccountCurrency(),postfix);
而SymbolBase(即金融工具Symbol()的基础货币)是。
SymbolBase=StringSubstr(Symbol(),0,3);
以此类推。

对于计算tick值,你需要考虑符号类型,因为当感兴趣的金融工具--Symbol()--以及导致回到账户面额的连接货币对的估值变化时,这很重要。继续上面的例子,我们讨论的是符号类型4 - AUDCAD,当账户是以美元计价时,Tick值明确定义为。

CalculatedTickValue=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_LOTSIZE)/MarketInfo(CalculatedCounterPairForCross,MODE_BID)
其中AUDCAD的CalculatedCounterPairForCross变量之前被确定为USDCAD。
CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);
而SymbolCounter是通过以下方式确定的。
SymbolCounter=StringSubstr(Symbol(),3,3);

通过这种方式对这些数值的计算进行编程,你可以做出与经纪人无关的市场信息判断。

请记住,这里的代码只对符号类型=4有用,在这种情况下,账户的计价货币与Symbol()的基础货币配对时是反货币,同样,账户的计价货币与构成Symbol()对的反货币配对时是基础货币。

(audcad -> audusd & usdcad)

事实证明,虽然有五种通用符号类型,但你只需要对其中四种进行分类,以计算杠杆率、保证金和tickvalue。而且,只有在处理相对于账户面额的交叉货币对时,数学才会成为一个具体的症结所在。

我制定了所有基础和计数器组合之间的具体关系,因为我的资金管理方法是明确定义每笔交易的损失风险值,这需要准确知道交易需要退出的价格值,以便损失符合先前定义的损失预算。对于交叉货币对来说,自然会发现风险值是基于两个货币对在任何特定时间的价格(除非你对冲其中一个)。

这些信息有什么帮助吗?

 
cloudbreaker:

TICKVALUE,当单独使用时,可能是不可靠的。

我想知道这适用于哪个经纪商,或者是否有其他考虑,比如在市场开盘/收盘前后。我从来没有能够复制你的这些发现。

 
哈哈。我意识到,jjc。但使用比例也无妨。大多数情况下,我们会除以1,安全而不是遗憾,嗯?CB
 
1005phillip:

这些信息是否有任何帮助?

我从来没有注意到你在符号类型3-5之间所作的区分(或者也许我只是没有在这种情况下考虑过)。总之,这是很好的思考资料...感谢你的精彩总结!
 

我从来没有意识到计算一个点的价值有这么多,在我的EA中,如果是买入,我让EA用第一个开仓的订单来计算,当前买入价-订单开仓价/订单利润=当前基础货币 的点值,或者如果是卖出,当前ask+openprice/订单利润=点值,这是不是不能正确工作?

编辑:我意识到我写反了,我的意思是订单利润/(当前买入价-开盘价)=点值

 
SDC:

我从来没有意识到计算一个点的价值有这么多,在我的EA中,我通过让EA使用第一个开放的订单来计算它,如果它是一个买入,当前买入价-订单开放价/订单利润=当前基础货币的点值,或者如果它是一个卖出,当前ask+openprice/订单利润=点值,这是不是将无法正常工作?


这种计算方法是有效的,即无论当前买入或卖出价格如何,每个点都有相同的估值。

这对于我上面定义的符号类型=2的货币对 来说是严格正确的,即欧元兑美元,等等(任何货币对,其中账户的面额是货币对中的对应货币)。

对于大多数人来说,这些差异可能并不重要,由此产生的误差很小。在我的案例中,我想用正确的分析表达式稳健地计算这些数值。

例如,如果我对即将进行的交易的最大可能损失预算为200美元,而我的止损点设置为200点,那么我想知道我的订单的手数,这样我的损失就不会超过200美元......要做到这一点,我必须在止损价格的位置正确计算点值。对我和我的客户来说,冒险 不是一个可以接受的选择;)
 

我很高兴LEHayes解决了这一切。菲利普,你已经完全消除了TickValue和布局对-合成非常好,让所有人受益。真不错

我只想补充一点:合成操作......

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

......需要注意的是,在一些小批量的经纪商中,像USDJPYm这样的额外附加年龄。我不知道经纪人是否可能/曾经通过在基数和计数器前面或中间添加一个字母来改变符号的前六个字母,如果你在寻找稳健性,IMO从.set文件或.sel文件读取是一个更安全的选择。

 
cameofx:

我很高兴LEHayes解决了这一切。菲利普,你已经完全消除了TickValue和布局对-合成非常好,让所有人受益。真不错

我只想补充一点:合成操作......

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

......需要注意的是,在一些小批量的经纪商中,像USDJPYm这样的额外附加年龄。我不知道经纪人是否可能/曾经通过在基数和计数器前面或中间添加一个字母来改变符号的前六个字母,如果你在寻找稳健性,IMO从.set文件或.sel文件读取是一个更安全的选择。


说得好!然而,当我谈到稳健的计算时,我不是在寻找这种 稳健性。

经纪商可以随心所欲地命名他们的货币对,人们希望我在尝试与一个使用货币符号lovelyUSDmoonCADcheese的新经纪商进行实时交易之前,能够注意到这种情况并相应地修改我的代码! :P

这段代码只是处理了我迄今为止遇到的100%的情况(Alpari、CitiFX、CMS forex、forex.com、FXCM、FXDD、IBFX、MIG和ODL)......我并不担心让它成为未来的证明,只是现在的证明。 现在,如果你有什么想法,使它成为未来的证据......那么现在是说出你想法的好时机 :)

 

lovelyUSDmoonCADcheese! ...

笑死我了!我看到经纪人在符号的属性中错误地输入了符号描述(不是符号()参数,但他们在某些时候也必须输入这个参数!)。谁知道呢!:))

我不知道这是否能做到100%的万无一失(什么是万无一失?)但我在想这样的事情。

  • 创建一个可能的3个字母大写的基础/计数器名称的列表/目录。
  • 从.set或.sel读取配对字符串。
  • 扫描一个可能的匹配,一次转移一个字母。忽略 接受可能的大/小写组合(ASCII值会有x个整数的差异,需要检查),我们可以用一个循环来把所有的字母变成大写,例如。
  • 如果找到一个匹配的名字,把它保存为 "经纪人"/"别名",而不是我们的 "库存 "名称。继续寻找配对的第二部分,做同样的事情。
  • 我们还需要检查一个基数/计数器的名称是否在整个Symbol()中是一致的。并将其'别名'也保存下来。
  • 使用这些别名来合成这一对。
  • 如果一个新的基数/计数器名称被改变或添加。把它添加到别名中。

前段时间,戈登向我提出了他的观点,即在EA中自动进行万无一失的检查有什么好处。考虑到这一点(并尊重这一点),我仍然认为这可能是值得的事情,即使只是为了它的地狱!:)