初学者的问题 MQL4 MT4 MetaTrader 4 - 页 71

 
Vitalie Postolache:

从什么时候起,句号成了双倍类型

这就是我所说的,字符串+int是一个错误。

但如果你按我上面写的方法做,就不会有错误。

 
Renat Akhtyamov:

这就是我所说的:字符串+int是一个错误。

但如果你按照我上面写的方法做,就不会有错误。


IntegerToString?没有,没有听说;)
 
Vitalie Postolache:

IntegerToString?没有,没有听说;)
无论哪种方式都很好,我不觉得有什么问题。
 

大家好

我是编程新手,但正在努力学习)

我在根据指标读数关闭订单时遇到了一个小问题

我应该直接告诉你开仓和平仓的条件:我按照指标读数开仓,按照指标读数平仓,但方向相反,没有任何止损和盈利。

如果(r > 50 && p > m)//买入订单 的开仓条件

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //开启买入订单

}

我写的订单关闭条件正确吗?

如果(r < 50 && p < m) --- 这是一个卖出条件和一个关闭条件

{

OrderClose(ticketB,0.1,Bid,5,Red)。

}

并打印出可能使用的未初始化变量'ticketB'和'OrderClose'的返回值,应该检查一下

你们能告诉我,我哪里写错了吗?



 
funnyrain8:

大家好

我是编程新手,但正在努力学习)

我在根据指标读数关闭订单时遇到了一个小问题

我可以通过指标读数直接判断出开仓和平仓的条件,并在没有任何止损和盈利的情况下以相反的方向关闭订单

如果(r > 50 && p > m)//买入订单 的开仓条件

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //开启买入订单

}

我写的订单关闭条件正确吗?

如果(r < 50 && p < m) --- 这是一个卖出条件和一个关闭条件

{

OrderClose(ticketB,0.1,Bid,5,Red)。

}

并打印出可能使用的未初始化变量'ticketB'和'OrderClose'的返回值,应该检查一下

你们能告诉我,我哪里写错了吗?



ticketB变量没有被初始化,也就是说,它的类型还不知道。在这种情况下,它是Int

第二个错误是,我们必须检查关闭订单的结果是否有错误。在论坛中搜索 "错误处理功能"。

 
Renat Akhtyamov:

ticketB变量没有被初始化,也就是不知道其类型。在这种情况下,它是Int。

第二个错误是关于检查订单关闭的结果是否有错误。在论坛中搜索 "错误处理功能"。

我不太明白其中的逻辑,或者说我很茫然),但我该怎么做呢? 起初我想用OrderSelect来做,但它是错误的)

我需要一些这方面的信息。

 
funnyrain8:

GetLastError 吗? 我不明白其中的逻辑,或者说我有点笨)但如何设置呢? 起初我试图用OrderSelect做所有的事情,但这是不一样的)

我需要一些这方面的信息。

是的。

查看代码库--大量的实施例子。

 
你好,我是一个信号卖家,我想知道你如何推广你的信号,让人们订阅它们?
 
Vitalie Postolache:


逻辑在哪里?你为第一笔订单设定最大允许手数,然后为以后的每笔订单增加。你不觉得这样做,说句不好听的,不是很明智吗?

此外,你用一些完全无法理解的方法减少循环中第一个订单的手数,而之前 "计算 "过的其他订单的手数保持不变,这些数值没有超出这个函数的极限。那么,他们是怎么做的呢?

更不用说增量循环不能是一个实数,它必须是一个计数器,一个整数。但你把批价设置为一个计数器,每次迭代时从里面减去一个。这是一个重大的错误,一个非常严重的错误。

首先在你的头脑中明确逻辑,然后尝试将其实现在你的代码中。

为了确定乘法后的最终手数而没有取出的数值,它应该是可能的最大开仓手数,事实上,这些手数的订单可能不会开仓,因为EA开仓的间隔很小,但概率是存在的,这就是为什么我想计算可能的最大初始手数。我听从了你的建议,这就是我的成果。你对这个功能有什么看法?我想我遗漏了什么,或者规定得不正确;测试器挂了一下,获得一个小的输出批次。
//Функция расчета торгового лота
double GetLots()
{
 double lots = 0.0;
 double L9 = MarketInfo(Symbol(),MODE_MAXLOT);
 double L8 = L9 / Multipler;
 double L7 = L8 / Multipler;
 double L6 = L7 / Multipler;
 double L5 = L6 / Multipler;
 double L4 = L5 / Multipler;
 double L3 = L4 / Multipler;
 double L2 = L3 / Multipler;
 double cl = L2 / Multipler;
 double balance = AccountFreeMarginCheck(Symbol(),OP_BUY,L9);
 
 if(balance <= AccountFreeMargin())
 {
  for(int risk = 100;balance > 0 && risk > 0;risk--)
  {
   if(!IsStopped())
   {
    if(risk >= 1)
    {
     lots = (cl/100)*risk;
    }
    if(risk < 1)
    {
     for(int risk2 = 100;balance > 0 && risk2 >= 1;risk2--)
     {
      lots = (cl/100)*(risk2*0.01);
     }
    }
   }
  }
 }
 double clots = NormalizeDouble(MathMax(lots,MarketInfo(Symbol(),MODE_MINLOT)),2);
 return(clots);
}
 
Arseniy Barudkin:

你怎么看这个问题?


我也要这么说。你不擅长逻辑。根据可用资金和风险值(我想写的是3%),立即计算出初始手数,有什么问题?为什么你必须在一个地方做所有事情?

取自由保证金的数值,乘以风险,再除以100,即为1手的保证金数值--这里是最简单的计算公式,即用自由保证金的指定百分比来计算手数。另外,你需要考虑到换手的步骤,防止超过经纪公司允许的最小/最大手数。

input double risk = 3; //процент свободной маржи для расчёта лота
double GetLots()
{
  double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
  double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
  double rsk = MathMin(100.0,risk);
  double lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
  double lotmin = MarketInfo(Symbol(), MODE_MINLOT);

  double clots = NormalizeDouble(lotstep*MathRound(AccountFreeMargin()*rsk/100/margin/lotstep),2);
  if(clots < lotmin) clots = lotmin;
  if(clots > lotmax) clots = lotmax;

return(clots);
}