[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 241

 
VOLDEMAR:

问题 如何计算一系列的亏损订单 ????

我想知道有多少个订单在停止时关闭,以检查战术......特别是最后一个

伙计们,我真的需要它 .....


这是我对自己的计算方法。

迭代=连续多少次订单在止损点平仓,如果在你的意义上,止损点是一个亏损的平仓。

 //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }
 
谢谢! 但根据我的理解,这个代码可以找到历史上的整个系列,无论它是100个交易之前还是5个....。
 
VOLDEMAR:
谢谢! 但根据我的理解,这段代码可以在历史中找到整个系列,无论它是100个交易之前还是5个.....。

不,从最接近的平仓中选择,深入到历史中,当平仓变成盈利时,系列就会被打断,输出连续亏损交易的数量=迭代。
 

下午好。

这将是正确的组合吗?

  // заполним значениями сигнальные массивы и посчитаем их количество
  for(i=DisplayBars;i>=0;i--) 
  {

    
if (Prz0 == 0) 
       {
           f= GetBarNumWithZerroDist(i);// на этом баре пересечение
        if (f!=-1)
          {
           Price01 = iClose(Symbol_1,0,f);
           Price02 = iClose(Symbol_2,0,f);
           Prz0 = 1;
           i=f;
           }
       } 
   }
int GetBarNumWithZerroDist(int i)
{
double Smb1Cl0 = NormalizeDouble(iClose(Symbol_1,0,0),Digits);
double Smb2Cl0 = NormalizeDouble(iClose(Symbol_2,0,0),Digits2);
double Smb1Pnt = MarketInfo(Symbol_1, MODE_POINT);
double Smb2Pnt = MarketInfo(Symbol_2, MODE_POINT);
int    mBars   = MathMin(iBars(Symbol_1,0), iBars(Symbol_2,0));

    for (int f=i;f>=0;f--) 
    {
        Price1 =   NormalizeDouble(Lot*(Smb1Cl0 - iClose(Symbol_1,0,f)) / Smb1Pnt,0);
        Price2 = NormalizeDouble(K*Lot2*H*(Smb2Cl0 - iClose(Symbol_2,0,f)) / Smb2Pnt,0);
        Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)== 0) return(f);
    }
    return(-1);
}
 

我喜欢这个人:)

if(MathAbs(Spread)== 0) return(f);
 
Roger:

我喜欢这个人:)


这里有一个错误吗?

我需要返回Spread==0的那一栏的值。

如果没有找到这样的值,返回-1。

 

你好。

问题:OrderSend()执行后能否返回一个 "0 "的值,或小于"-1"?有人遇到过这样的事情吗?或者说,"文件 "中给出的信息是否正确。

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
用于开立头寸或设置挂单的基本功能。
返回交易服务器分配给订单的票据号码,如果失败,则返回-1
P.S.: 作为心灵感应者工作,在别人的代码中寻找一个错误...
 
我做了一个带水平线 的虚拟拖网,在测试器中工作正常,但在优化过程中,测试器显然不能使用这些线,为什么?
 
DimaMA:
我做了一个带水平线的虚拟拖网,在测试器中运行良好,但在优化过程中,测试器可能无法使用这些线,为什么?如何解决?

为什么你需要一条横线?将该行的值存储在一个变量中,你就会很高兴了!!!而且,专家顾问会 "思考 "得更快!而且你可以留下水平线,只是为了视觉效果。

原因如下:测试员只在视觉模式下与图形对象一起工作!这就是为什么测试员要在视觉模式下工作。在优化时,根本没有视觉模式...虽然,你可以尝试在图表中的TF和货币对名称后面的括号中留下 "视觉"。但我不知道这是否会有帮助。我没有检查过。我想这是有帮助的,因为我们可以看到订单在这个图表上出现和消失(之前用于可视化测试)(尽管图表还没有被激活)。也许有人会告诉我们!

我给你的建议是--不要使用从图形对象中提取参数的方法。让这些参数存储在变量中...不要让图形对象成为一个变量!:))))

 
MaxZ:

你好。

问题:OrderSend()执行后能否返回一个 "0 "的值,或小于"-1"?有人遇到过这样的事情吗?或者说,"文件 "中给出的信息是否正确。

P.S.:作为心灵感应者工作,寻找别人代码中的错误...

海!

为什么不呢?如果一个订单由于重新报价 而未被打开,例如:。

对于这一点,有一个真实开单的循环,例如,这样的--尝试开单的次数与错误处理。

int NumberOfTry = 25;
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+

void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0)
{
   color clr;
   datetime opentime;
   int ticket;
   int error;
  
   comment = WindowExpertName() + " " + GetNameTF(Period()) + " " + comment;
   int msl = MarketInfo(symbol, MODE_STOPLEVEL);
   clr = CLR_NONE;
   if (cmd == OP_BUY)  clr = ColorBuy;
   else if (cmd == OP_SELL)  clr = ColorSell;   
   if ((expiration > 0) && (expiration < TimeCurrent()))   expiration = 0;
  
   for (int try = 1; try <= NumberOfTry; try++)
   {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped()))      break;   
      while (!IsTradeAllowed())      Sleep(5000);
    
      RefreshRates();
      opentime = TimeCurrent();
      ticket = OrderSend(symbol, cmd, volume, price, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr);
      if (ticket > 0)
         if (UseSound)      {PlaySound("ok.wav"); break;}      
      else
      {
         error = GetLastError();
         if (error == ERR_TRADE_TIMEOUT)
         {
            Sleep(1000*66);
            if (ExistOrders(symbol, cmd, magic, opentime))
            {
               if (UseSound) {PlaySound("ok.wav"); break;}
            }
         }
        
         Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
         continue;
      }
      
      Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
      Print("Ask=", Ask, "  Bid=", Bid, "  symbol=", symbol, "  volume=", volume, "  cmd=", GetNameOP(cmd), "  price=", price, "  stoploss=", stoploss, "  takeprofit=", stoploss, "  magic=", magic);
      if ((error == ERR_COMMON_ERROR) || (error == ERR_ACCOUNT_DISABLED) || (error == ERR_INVALID_ACCOUNT) || (error == ERR_TRADE_DISABLED))
        {
         IsExpertFailed = true;
         break;
        }      
      if ((error == ERR_SERVER_BUSY) || (ERR_INVALID_TRADE_VOLUME) || (error == ERR_MARKET_CLOSED))
        {
         Sleep(1000*300); 
         break;
        }      
      if ((error == ERR_TOO_FREQUENT_REQUESTS) || (error == ERR_TOO_MANY_REQUESTS))    Sleep(1000*100);      
      if ((error == ERR_ORDER_LOCKED) || (error == ERR_LONG_POSITIONS_ONLY_ALLOWED) || (error == ERR_TRADE_TOO_MANY_ORDERS))      break;      
      if (error == ERR_TRADE_CONTEXT_BUSY) while (IsTradeContextBusy()) Sleep(1000*11);
      
      if (error == ERR_TRADE_EXPIRATION_DENIED )  {expiration = 0; continue;}      
      if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE))  Sleep(1000*7.7);
   }      
}