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

 
hoz:


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

我已经追踪到它了。当当前未结订单的利润率为负数时,该标志不会改变其值。下面是重写的函数,它应该将空头多头 标志设置为,也就是说,如果有减去的订单,就禁止开仓。

调用函数是这样的。

也许贝氏的条件更适合?诚然,由于欧元下跌非常疲软,我今天只开出了卖盘,但仍旧是有总比没有好!"。
 
borilunad:
也许条件更适合白族人?的确,今天只有卖盘被打开,因为欧元下跌非常疲软,但还是有总比没有好!"。


没有。信号写在int函数GetGeneralSignal() 中,它的工作原理很清楚。信号很原始,我只是为了测试而采取的。如果PCI已经越过上界--买入,如果越过下界--卖出。我自己不使用指数,但我决定检查一下,这只是一个实验。

所以,你去那里。没有旗帜,一切工作都很完美。但旗帜却不是这样。当int FindOrders(bool&long,bool&short) 函数包含一个给定类型的订单且其利润低于零时,我的函数根据对函数GetGeneralSignal() 的引用,必须向某个标志传递假值,但事实上标志总是显示为真

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

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

我可以在打印机中看到它,但不清楚为什么旗帜没有变化。

顺便说一下,我在印刷品中显示了订单的盈利能力。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

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

而在打印标志的值时,这就是所显示的。

也就是说,很明显,当利润率低于零时,相应的标志应该被设置为假,但这并没有发生......。一切似乎都是基本的,但有些事情却没有发生。

 
hoz:


不,在intGetGeneralSignal() 函数中有一个信号,效果很好。信号很原始,我只是为了测试而采取的。如果PCI已经越过上界--买入,如果越过下界--卖出。我自己不使用指数,但我决定检查一下,这只是一个实验。

所以,你去那里。没有旗帜,一切工作都很完美。但旗帜却不是这样。当int FindOrders(bool&long,bool&short) 函数包含一个给定类型的订单且其利润低于零时,我的函数根据对函数GetGeneralSignal() 的引用,必须向某个标志传递假值,但标志总是包含

我在印刷品中看到了它,但我不明白为什么旗帜没有变化。
看,你在两种情况下都写了long=false,那么它将如何打开?
 
hoz:



我在印刷品中可以看到,但为什么旗帜没有变化,这一点并不清楚。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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;
                 }

                 else 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 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
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

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

这里有一张截图。

你可以看到,在图表上,白氏是微不足道的,旗帜=TRU都是如此。

 
晚上好,请你告诉我如何使警报 表格只在条件发生时出现一次,而不是每次条件满足时都出现?
 

我为你感到难过!我将给你写下它如何在没有循环的情况下工作,因为循环会被函数拖慢!这就是我的想法。这是你的代码,但我该把它改成什么呢!?

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
这个方案没有抽筋,而且立即见效!这是个很好的方案。摒弃不必要的功能!你可以在Dear Kim的实用函数中找到ExistPositions()函数。
 
borilunad:

我为你感到难过!我将给你写下它如何在没有循环的情况下工作,因为循环会被函数拖慢!这就是我的想法。这是你的代码,但我该把它改成什么呢!?

这个计划很简单,而且立即见效!摒弃不必要的功能!你可以在Kim的有用函数中找到ExistPositions()函数


Boris,ExistPositions 函数也有同样的循环,只是它有更多不必要的检查,所以它不会一路疲软你的逻辑我很清楚,但以前的版本无法操作的原因并没有披露,这很奇怪:)

你也使用这些旗帜。

 if(profitL > 0 && long == true && short == false)

而我正在示范,他们没有正确地返回。

因此,同样地,如果profitL和profitS变量将出现在这个函数中,那么就不需要这些标志了。

结果就是这样。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   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 (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

还是那句话,它不是在信号上打开,而是在任何情况下打开。

 
大家好!
我正在做一个虚拟跟踪,遇到了一个问题,closelevel=profitpips-TrailingStop,也就是说,跟踪和GlobalVariableSet("tral",0)都打开了,因为它们应该是这样,但是变量
closelevel 变量被指定为profitpips 的值(它是以点为单位的当前利润),而不是 profitpips-TrailingStop 的值,以及所有随之而来的后果o_o。



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

我想明白了,那条线
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


改为...
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



现在,当利润增加时,关闭级别不被修改......。

我已经想好了。



 
hoz:


Boris,ExistPositions 函数也有同样的循环,但有更多不必要的检查,所以它不会一路上都很迟钝你的逻辑我很清楚,但以前的版本无法操作的原因并没有披露,这很奇怪:)

你还在使用这些旗帜。

而且我已经证明它们没有被正确送回。

因此,同样,如果profitL和profitS变量将出现在这个函数中,那么就不需要这些标志了。

这就是它的结果。

同样,它不是通过信号打开,而是通过任何东西打开。

然后在你自己的地方做一些挖掘工作!你的代码的每一个字都有一个函数,你需要用变量来做。这就是使代码变得沉重的原因。当你不能不使用函数时,你应该使用它们!我在Kim的代码中评论了所有我不需要的东西,而且所有的工作都非常快!这就是为什么我们要使用函数。记住,我问大家如何使程序在许多条件下运行得更快。现在,在5分钟内对所有蜱虫进行了一年的测试!我梳理了所有的条件和功能,扔掉了所有不必要的东西。