[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 581

 
Vovo4ka:

为什么获得的利润,不是平仓时应该有的.....,而是在利润应该是30pp的时候,以完全不同的方式写出来的....。


这是什么乱七八糟的东西:"基本上是计算开仓和平仓之间的差异)和summaryise?????? ...

你不需要知道吗?一个点的价格将是不同的...

利润不是以点数计算,而是以货币计算,取决于交易头寸的数量

 
Vovo4ka:

由于某些原因,利润被拿走了,而不是平仓时应该有的.....,反之,当利润应该是30pp的时候,却写得完全不同....。


订单的利润不是以点数计算,而是以存款货币 计算。

 

正确 - 这里的总损失(亏损)是根据亏损时关闭的LOCAL订单的历史计算出来的。

这对你来说有点不同,但原则是一样的。

//---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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;
               }
            }
         }
      }
   }
 
PapaYozh:


订单的利润不是以点为单位,而是以存款的货币为单位。


我需要以点为单位,手数固定为1....,但盈利或亏损并不对应于真实的1.....,我想更容易地计算出盈利和缩减的点数,并将其相加,得到结果=)
 
Roman.:

正确 - 这里的总损失(亏损)是根据亏损时关闭的LOCAL订单的历史计算出来的。

这对你来说有点不同,但原则是一样的。


谢谢你,我现在就去处理它=)
 
Vovo4ka:

我需要以点为单位,手数固定为1....,但盈利或亏损与真实的1.....,我想更容易地计算出盈利和缩水的点数,并将其相加,得到结果=)


再一次。

订单的利润不是以点计算,而是以存款的货币 计算。

 
Vovo4ka:

所以我需要它的点数,手数是恒定的1....,但由于某些原因,利润或亏损并不对应于真正的1.....,对我来说,我想计算利润和缩减的点数,更容易总结和得到结果=)

那么,如果手数是恒定的,用测试者的利润除以 你会得到以点为单位的利润。
 

Kim最新发布的函数GetPotentialLossInCurrency(https://forum.mql4.com/ru/11287/page107)只计算未结订单。

if (OrderType()==OP_BUY) {
                pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
              }
if (OrderType()==OP_SELL) {
                pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
              }
我试图将它扩展一下,以包括挂单(通过简单地添加其他类型)。
if (OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP) {
                     pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
                     }
if (OrderType()==OP_SELL || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) {
                     pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
                  }
但未完成的订单不在考虑之列。他们的计算方式不同吗?文件中没有提到这个问题....。
 
artmedia70:
在图表上用Comment`显示所有旗帜,你会看到为什么交易会打开。

把它放进去,现在交易根本就打不开。
附加的文件:
1_1.mq4  21 kb
 
Ivn:

我把它放进去了,现在它完全不发出任何声音了。

你为什么要这样做?一次性输出一个评论 中的所有标志。

在这里。

int start()
  {
//----


 RefreshRates();                        // Обновление данных
 Symb=Symbol();
 int cnt, ticket, total;
 int ABuy=0;                               // флаг на покупку /продажу   
 int ASell=0;   
 
   Comment(".....Вот сюда и пишите вывод всех флагов......");

 if (NewBar() == true)
{        
     x=x0; //передаем данные 
    x1=x01;
    x2=x02;