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

 
Rustam Bikbulatov:
你好,我需要一些建议。为什么我的最后一条短信没有显示?这里有什么问题吗?你能告诉我如何修复它吗?

如果你在任何时候都只取一个对象的名字,你为什么需要一个循环?

for(int no1=0; no1<ObjectsTotal(OBJ_TEXT); no1++)
  {
   if(ObjectName(0)=="Profit1"+iBarShift(NULL,1440,0))
     {
      double name;
      name = ObjectDescription(0);;
      Comment(name);
     }
  }
 

Iurii Tokman:

no1<=ObjectsTotal(OBJ_TEXT);

你不能完全这样做--它将超出数组的范围。如果有10个对象,最后一个对象的索引将是9。因为它是从零开始计算的。

 
Artyom Trishkin:

如果你一次只取一个对象的名字,为什么要有一个循环?

告诉我到底如何确定这个对象的倒数第二个文本。

 
Rustam Bikbulatov:

告诉我到底如何确定这个对象的倒数第二个文本。

很难知道自己想要什么。

 
void Profit()
  {
   ObjectCreate("Profit"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.6);
   ObjectSetText("Profit"+iBarShift(NULL,1440,0),DoubleToStr(AccountProfit(),2),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit1()
  {
   double  Prof = ObjectDescription("Profit1"+iBarShift(NULL,1440,0));
   double  P = -Prof;
   ObjectCreate("Profit1"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.1);
   ObjectSetText("Profit1"+iBarShift(NULL,1440,0),DoubleToStr(MathMax(-AccountProfit(),-P),1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit1"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit2()
  {
   ObjectCreate("Profit2"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.4);
   ObjectSetText("Profit2"+iBarShift(NULL,1440,0),iBarShift(NULL,1440,0)-1000,11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit2"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit3()
  {
   for(int no1=0; no1<=ObjectsTotal(OBJ_TEXT); no1++)
     {
      if(ObjectFind(1,"Profit2"+iBarShift(NULL,1440,0))!=0)
        {

         string   obj_name;
         obj_name = ObjectName(3);
         string   name;
         name = ObjectDescription(obj_name);
         Comment(obj_name);
        }
     }

   ObjectCreate("Profit3"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.9);
   ObjectSetText("Profit3"+iBarShift(NULL,1440,0),DoubleToStr(name,1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit3"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }

Provit - 显示白天测试期间的总利润

Provit1 - 显示当天的最大缩减量

Provit2 - 从1开始的正常数字行

普罗维特3--目标!将Provit1相加,除以Provit2。我想知道测试总时间内的平均每日缩减量。 帮助理解Provit3

 

同事们--这个接近的错误可能是什么,如何处理?以下是代码,当利润被超过时--关闭所有单向头寸。 谢谢你。

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if(takeprofit < ProfitB)    
      {   
        Print(" ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = ", ProfitB," мин общий takeprofit buys positions = ", takeprofit);   
        for (i=OrdersTotal()-1; i>=0; i--)         
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if(OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray))  
                   Print(" закрытие бай, тикет = ", OrderTicket());
               else  Print(" ошибка закрытия бай, Error = ", GetLastError());          
            }
       }     
      
       if(takeprofit < ProfitS)     
        { 
         Print(" ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = ", ProfitS," мин общий takeprofit СЕЛЛов = ", takeprofit);   
 
         for (i=OrdersTotal()-1; i>=0; i--)      
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if(OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray)) 
                   Print(" закрытие SELL,  тикет = ", OrderTicket());
               else   Print(" ошибка закрытия sell, Error = ", GetLastError());     
            }       
         }    
           
 
Roman Shiredchenko:

同事们--这可能是一个关闭的错误,如何处理?如果我想使用下面的代码,我需要在盈利的时候关闭所有的单向订单。谢谢你。

错误是什么? 错误的屏幕

理论上,它应该工作,但我还没有看到如此复杂的平仓,考虑到点差并将其作为滑点加入 - 我认为,如果你决定平仓,那么滑点不是最重要的事情,平仓错误更重要,然后重新报价,然后完全失去连接


把OrderClose(....)拿走,用Kim的ClosePosBySelect()https://www.mql5.com/ru/forum/131859/page2#comment_3359664,取代它。

使用它,那么你将清楚地看到它在哪里被破坏了--要么是在你的关闭条件中,要么是服务器有一个错误。

 
Igor Makanu:

错误是什么? 错误的屏幕

理论上它应该工作,但我还没有看到如此复杂的收盘,考虑到点差并将其作为滑点加入 - 我认为,如果你已经决定收盘,那么滑点不是最需要注意的,收盘错误更重要,然后是重新报价,然后完全失去联系


移除OrderClose(....)并将票据传递给Kim的ClosePosBySelect(),然后就会清楚它在哪里不起作用--要么是在你的关闭条件中,要么是服务器有一个错误。

他在那里有一个零价格接近。因此,我们需要控制MarketInfo-function所返回的内容,但没有控制。然而,像往常一样,有些人习惯于写--收到的东西,什么--没有检查,而是发送一个参数。

 
Artyom Trishkin:

他在那里有一个零价格接近。因此,我们需要控制MarketInfo-function所返回的内容,但没有控制。然而,像往常一样在四上有些人习惯于写--收到的东西,什么--没有检查,但发送的说法。

我已经看到了,我怀疑他是否能够自己取消所有的设置,这就是为什么我建议使用选中的ClosePosBySelect()来通过OrderSelect()关闭选定的订单--他可以做到这一点,至少我看到他用构造器组装代码。)

SZY: 我还有一个怀疑,就是它把一个订单关闭了两次,但是Kim的f函数打印到了日志中, 似乎没有单独的循环被第二个条件关闭。

 
Igor Makanu:

我已经看到了,我怀疑它是否能够自己解除所有的prime,这就是为什么我建议通过OrderSelect()使用被证明的高亮订单的闭合。

当然,伊戈尔的函数将为用户做一切事情(甚至有些用户设法用它们来犯错)。但在这种情况下,他永远不会学会自己做什么。虽然,当然--他们的选择。