[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 333

 
亲爱的程序员们,你们好!

有必要进行以下分析--程序应分析给它的参数,并在一个单独的窗口中以一组日期的表格形式输出结果。这意味着该程序应分析历史并显示必要的日期。

是否可以在MQL4中做到这一点,或者最好是导出历史记录,用另一种语言编写的程序来分析数据?

提前感谢您!
 
GygaByte:


正确,但正如实践所表明的--并非总是如此。

如果第五个小数点=5(1.xxxx5),数值仍然是扭曲的。

这个问题仍然有效...

P.S. 一般来说,我需要给MagicNumber分配一个价格值...并在这里输入MagicNumber - int,并尝试通过以下方式进行转换

还有谁能给我建议?

谢谢你。

你用不同的四舍五入进行输出--所以你没有看到完整的数字--你认为有些东西是扭曲的。默认情况下,当输出实数时,输出 被四舍五入到第四位。对于5位数的数字,你必须明确地将输出四舍五入。

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

看看你自己的图片--在没有DoubleToStr()和有DoubleToStr()的情况下输出标书。

 
hoz:

Artyom和Boris,感谢你们 "嚼碎 "了我的问题。我有一段时间会在相当简单的事情上卡住,就像这次的情况一样......。

现在有一个新的问题。

我在计算未平仓订单量t 的函数中加入了,搜索具有指定利润的指定类型的订单,并将其利润与某个指定值(目前为0) 进行比较。此外,如果没有未结订单,则用函数FindOrders()参数返回2个值为True的标志,这意味着你可以发送订单,但如果有订单,则检查利润以确保它高于设定值,如果它低于设定值,则用函数FindOrders()参数返回2个值为False的标志,因此当某个方向有亏损订单时,没有投资到亏损方向。

之后,我在信号函数中调用FindOrders()函数。

订单已经完全移动开来。这个逻辑似乎是正确的。也许,你能看出我哪里犯错了吗?

我明白,所有的事情都可以用一个单独的函数更容易地完成,我可以做到。但我想了解为什么它在这个版本中不起作用。

维克多,我不能完全理解你的算法,但我可以给你一些建议!我也遇到过这种情况,当逻辑上有错误时。如果在你的条件中发现模棱两可或相互排斥,程序就会停滞。也许你知道你想要什么,但不能正确建立代码的逻辑。寻找这些故障,并在一张纸上写下你想要执行的条件的整个顺序,一个一个地用箭头标出,以示清楚好运!
 
borilunad:
维克多,我不能完全理解你的算法,但我可以给你一些建议!当逻辑上有错误时,我也会发生这种情况。如果在你的条件中发现模棱两可或相互排斥,程序就会停滞。也许你知道你想要什么,但不能正确建立代码的逻辑。寻找这些故障,并在一张纸上写下你想要执行的条件的整个顺序,一个一个地用箭头标出,以示清楚好运!


所以那里有一个简单的逻辑。如果没有打开的订单,订单将被信号打开。

而如果有订单打开,那么订单应该由一个特定的信号打开,如果在特定方向(买入或卖出)的订单的利润高于某个值,即至少不在负值。(我在那里设置了0,用于测试)。

我发现了一个逻辑上的错误。以下是已经出来的内容。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

现在,卖单在坐席上正确打开,但多头却根本没有打开。虽然该标志的两个变量的值都是1,即

 

我在mt4上有这个问题。

随着mt4经纪商软件(即我上周使用的3个)在我的电脑上启动,我的电脑上出现了 "以用户身份运行 "的窗口(与使用 "以用户身份运行 "相同)。在任何行动选择下,MT4正常打开。

我怎样才能让mt4.eh恢复到没有这个窗口的运行状态?也许谁知道或了解什么是错的......

 

下午好,遇到了需要快速取消所有待处理订单 的情况。 OrderClose 忽略了挂单。哪种操作员使用起来更方便,是否有这种选择?

 
Notter:

下午好,遇到了需要快速取消所有待处理订单的情况。 OrderClose 忽略了挂单。哪种操作员使用起来更方便,是否有这种选择?


你只能关闭市场订单,你需要OrderDelete 操作符来删除挂单。
 

ǞǞǞ

谢谢你!

 
hoz:


所以,一切的逻辑都很简单。我们需要,如果没有订单,订单将被信号打开。

而如果有订单打开,那么订单应该由一个特定的信号打开,如果在特定方向(买入或卖出)的订单的利润高于某个值,即至少不在负值。(我在那里设置了0,用于测试)。

我发现了一个逻辑上的错误。以下是已经出来的内容。

现在,卖单在坐席上正确打开,但多头却根本没有打开。虽然该标志的两个变量的值都是1,即为真

维克多,做一些检查!通过注释多头买入,在日志中看看空头卖出是如何进行的!反之亦然,然后看看有什么区别,并找出它不工作的原因!
 
borilunad:
维克多,让我们检查一下!通过注释长边,检查短边在日志中是如何工作的!反之亦然,然后看看有什么区别,并找到它不工作的原因!


Boris,如果你把intGetGeneralSignal() 中的一个条件注释掉,开口就清楚了。

我已经跟踪了。当当前未结订单的利润率为负数时,该标志不会改变其值。这里是重写的函数,它应该将标志短线长线 的值设置为,即禁止我们在有负数订单时开仓

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

这里是调用函数。

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}