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

 
Vadim Novikov:

各位关心的朋友下午好!


我是一个高级用户,但我不经常写,这就是原因,我跟不上一些创新,而且有时我会忘记一些事情。


请帮助我解决一个问题,我记不住一件事。


情况是这样的,我定义了外部变量,我定义了很多的外部变量,有20个变量。当你把这个程序附加到图表上时,它们会显示在程序的输入菜单中。


问题来了,我不记得了,我怎么用注释把这些变量块分开? 在输入菜单中,比如说


这是一个关于改变MA变量的区块(评论)。

期间MA

设置方法MA

价格MA

这是一个关于改变MACD变量的区块 (评论)

..........................

...........................

...........................

这是一个关于改变BB变量的区块(注释)。

.........................

..............................

...........................


看来,以前我用代码评论功能输入这样的评论。也就是说,我写了//或/* */。

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

像这样

 
OrderStopLoss()输出小数点后两位数,我能否强制它输出小数点后三位数?
 
Alekseu Fedotov:

像这样。

谢谢,这提醒了我!!!。

 
Igor Golieniev:

像这样试试吧。

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

这是为了显示报价的所有有效数字。如果需要其他数量的数字,用特定的数字替换Digits()

 
晚上好,请提供任何提示。在OnInit函数中,创建了两条横线,在OnTick中,有两个函数,一个是在Bid>第一条线时发送推送和邮件通知,第二个是在Bid<第二条线时发送。Bid=line没有这样做,以避免出现缺口。当然,我也面临着这样一个事实:如果条件得到满足,每次打钩都会有通知,这很糟糕。如何解决这个问题?你可以在标准警报设置中设置超时或通知数量。
 
Ihor Herasko:

像这样试试吧。

这是为了显示报价的所有有效数字。如果你需要其他数量的数字,请用特定的数字替换Digits()。

现在它正确地打印出15,155,然而--OrderModify函数 的无效止损。

这个问题只出现在OrderModify的Silver上

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

现在在打印中正确打印出15,155,然而--OrderModify函数 的无效止损。

这个问题只出现在OrderModify的Silver上

这段代码中存在两个错误。

  1. 缺少对最小允许的止损尺寸的检查(这被称为止损水平)。
  2. 实数的比较不正确。

为了 解决第一个问题,我们需要得到当前的停止水平。

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

如果fStopLevel变成了0,而且账户类型不是ECN,那么fStopLevel应该被强制等于三个点差。

在设置止损(包括止损和止盈)之前,检查新的水平是否在订单收盘价的止损水平或以上。要检查买入订单的止损,其方法如下。

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

对于卖出订单的停止。

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


第二个问题的解决方案:以一定的精度比较实数值,因为实数的相等不可能总是和到处都实现。我已经在上面的停止水平验证代码中给出了一个比较的例子。

 
Ihor Herasko:

这段代码中有两个错误很醒目。

  1. 缺少对最小允许的止损尺寸(称为止损水平)的检查。
  2. 实数的比较不正确。

为了 解决第一个问题,我们需要得到当前的停止水平。

如果fStopLevel变成了0,而且账户类型不是ECN,那么fStopLevel应该被强制等于三个点差。

在设置止损(包括止损和止盈)之前,检查新的水平是否在订单收盘价的止损水平或以上。要检查买入订单的止损,可按以下方式进行。

对于卖出订单的停止。


第二个问题的解决方案:以一定的精度比较实数值,因为实数的相等不可能总是和到处都实现。我已经在上面的停止水平验证代码中给出了一个比较的例子。

谢谢你。

然而,这个问题还没有结束。当一个订单被打开时,OrderModify开始立即触发。错误在哪里?(我重复一遍--在所有货币/期货上都有效,在白银上则无效。

 
Igor Golieniev:

谢谢你。

然而,这个问题还没有结束。当一个订单被打开时,OrderModify开始立即触发。错误在哪里?(我重复一遍--在所有货币/期货上都有效,在白银上则无效。

1.指示性的

#property strict

你在使用什么?

2)这种情况是在卖出和买入时发生,还是只在卖出时发生?

3.止损是在开仓时 设置,还是在可能的情况下由交易员设置?

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Golieniev:

谢谢你。

然而,这个问题还没有结束。当一个订单被打开时,OrderModify立即开始工作。错误在哪里?(我重复一遍--它对所有(所有)货币/期货都有效,它对白银无效)

显示日志片段(如果在线,专家标签),你可以看到市场订单的开启和修改,并指出使用了哪些TrailingStop和TrailingStep值。

原因: