新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 565

 
PolarSeaman:

你在代码中替换了

但这并没有什么帮助)。

我很抱歉,你只注意到这一点)

 
Alekseu Fedotov:

带有SEEK_END标志的FileSeek()将帮助你。

<

谢谢你!我将试一试。

 
YanSay:

晚上好!

我在思考如何添加一个通用的(针对不同的工具)代码来计算基于存款百分比的交易手数。

我是这样做的。

价格(开盘价)和SL(止损)是分开计算的。

对于报价货币为美元的货币对(如EURUSD),SPX500指数和黄金--都能正确计算,但对于报价货币为美元的货币对(如USDJPY),则无法工作。

请告知我错过了什么?

注意规范化

_Digits变量存储小数点后的小数点数目,它决定了当前图表符号的价格精度。

 
Alekseu Fedotov:

注意规范化

_Digits变量存储了小数点后的小数位数,这决定了当前图表符号价格的准确性。

谢谢你!下面是它被重新做的过程。

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

在第一种变体中:EURUSD和XAUUSD - 一切正常;USDJPY - 不是2%的存款,而是0.2%的存款风险;在SPX500和BRN的情况下,产生OrderSend 错误131(手数计算错误)。

在第二种情况下:EURUSD、XAUUSD和USDJPY--一切正常;SPX500的风险是存款的20%而不是2%;对于BRN,它产生OrderSend错误131(手数计算错误)。

在其他地方有一个错误,我不明白在什么地方,请告知。

 
YanSay:

谢谢你!下面是它的重做方式。

第一个版本:EURUSD和XAUUSD - 一切正常;USDJPY - 它的风险是0.2%的存款,而不是2%的存款;另外在SPX500和BRN的情况下,它产生OrderSend错误131(手数计算错误)。

在第二种情况下:EURUSD、XAUUSD和USDJPY--一切正常;SPX500的风险是存款的20%,而不是2%;对于BRN,它产生了OrderSend错误131(手数计算错误)。

在其他地方有一个错误,我不知道在什么地方,请告知。

MarketInfo(Symbol(),MODE_POINT) 替换Point

 
Vitaly Muzichenko:

MarketInfo(Symbol(),MODE_POINT) 替换Point

这有什么意义呢?如果一切按图表符号计算。如果有一个多变量和与当前图表不同的Symbol 被计算出来,这是有意义的。

 
Vitaly Muzichenko:

MarketInfo(Symbol(),MODE_POINT) 替换Point

不幸的是,这并没有帮助(

MODE_POINT信息说:"报价货币中的点尺寸。它被储存在当前符号的预定义变量 Point中"。

从描述上看,使用哪种变体并不重要。但我试了一下,并没有什么帮助。


 

你能告诉我是否有可能把图形工具的"选择 "放在专家顾问的按钮上,这样通过点击按钮,工具图标就会出现在光标下,并有可能伸展它?

而且该通道应该已经有了指定的属性

 
Roman Sharanov:

你能告诉我,是否有可能将图形工具的"选择 "放在专家顾问的按钮上,这样,一个工具图标就会出现在光标下,并可以通过点击按钮来拉伸?

此外,该通道已经可以有指定的属性。

也许

 
YanSay:

不幸的是,这并没有帮助(

而在MODE_POINT信息中,写着 "以报价货币为单位的点尺寸。对于当前的符号被存储在预定义的变量 Point"。

从描述上看,使用哪种变体并不重要。但我试了一下,并没有什么帮助。

试试这个功能。

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }
原因: