检查--我做错了什么?

 

编写代码

int GetN()
{
   int n = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
      {
         bool profit = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         bool loss = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         bool neutral = OrderClosePrice() == OrderOpenPrice();

            SumPosOrder = OrderLots();
            Tiket2 = OrderTicket();
           }


         if(loss)
           {
            n++;
            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
           }

         if(n >= MartinSteps)
           {
            n = 0;
            break;
           }

         if(profit)
           {
            ObchPlus = ObchPlus + (SumPosOrder * 0.8); // Расчет для Бинарных опционов поэтому умножаю на 0,8
           }

         if(profit && ObchPlus < ObchMin)
           {
            n++;
            Pobeda++;
            Sdelok++;
           }



         if(profit && ObchPlus > ObchMin)
           {
            ObchPlus = 0;
            ObchMin = 0;
            Pobeda++;
            Sdelok++;
            n = 0;
            break;
           }
        }
     
   return n;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+

任务原本是:
找到最后一个关闭的订单。
检查它是否关闭在正负位置。
计算交易的数量
计算正负交易的数量。

计算赌注的金额。


如果交易是盈利的(并且总的负数=0),那么第1个赌注
如果交易是负数,那么计算负数,第2个赌注
如果是正数,但是负数>0,那么下一个赌注。
但由于某些原因,它不能正确计算投注次数和投注金额...

 

例如:字符串

bool neutral = OrderClosePrice() == OrderOpenPrice();

我们也许应该这样塑造算法条件的运作。

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

和其他两个条件是一样的

 

顺便说一下,历史上的最后一笔交易并不总是时间上的最后一笔交易。

 
Nikita Chernyshov #:

顺便说一下,历史上的最后一笔交易并不总是时间上的最后一笔交易。

是的,我去掉了时间取样,但它仍然还不能工作......
Renat Akhtyamov#:

如:线

也许我们应该像这样形成算法条件的工作。

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

和其他两个条件是一样的

我以前只是在其他系统中使用过这个区块,在这部分中工作得很好。
,但还是要检查并重写。我会让你知道结果的。
 
Natalya Smirnova #:
是的,我已经删除了时间采样,但它仍然没有工作......我以前只是在其他系统中使用过这个区块,在这部分中工作得很好。 ,但还是要检查并重写。我会让你知道结果的。

这些变量是否在某处被重置?

            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
 
Renat Akhtyamov #:

这些变量是否在某处被重置?

是的,在启动时,它们的值为0
,在完成之前。
 
Renat Akhtyamov #:

这些变量是否在某个地方被清零了?

也许从映射的那个地方开始。
我将暂时从这个函数中删除收集的统计数据,并在另一个函数中进行一般的减法和统计(单独的函数将产生)。

分块写作。

收集统计数据并计算减去和加上(减去和加上是全局变量)。

if(OrderSelect((OrdersHistoryTotal() - 1), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
              {
               if(OrderTicket() != Tiket2)
                 {
                  bool profit1 = false;
                  if(OrderClosePrice() > 0)
                    {
                     profit1 = true;
                    }
                  bool loss1 = false;
                  if(OrderClosePrice() < 0)
                    {
                     loss1 = true;
                    }


                  SumPosOrder = OrderLots();
                  Tiket2 = OrderTicket();
                  Print(OrderCloseTime());
                 


               if(loss1)
                 {
                  ObchMin = ObchMin + SumPosOrder;
                  Minus++;
                  Sdelok++;
                 }



               if(profit1)
                 {
                  ObchPlus = ObchPlus + (SumPosOrder * 0.8);
                 }

               if(profit1 && ObchPlus < ObchMin)
                 {

                  Pobeda++;
                  Sdelok++;
                 }




               if(profit1 && ObchPlus > ObchMin)
                 {
                  ObchPlus = 0;
                  ObchMin = 0;
                  Pobeda++;
                  Sdelok++;

                 }
}


第2块--选择用于计算(或者说选择)比率的变量n

int GetN()
  {
   int n = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;


        }


      if(loss)
        {
         n++;
        }

      if(n >= MartinSteps)
        {
         n = 0;
         break;
        }

      

      if(profit && ObchPlus < ObchMin)
        {
         n++;
        }



      if(profit && ObchPlus > ObchMin)
        {
         n = 0;
         break;
        }
     }

   Print(n);

   return n;
  }


double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+


这可能是正确的...

 

我还是不明白这个逻辑。

怎么说呢?

bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;

订单的收盘价 怎么可能低于零?

如果收盘价高于开盘价,"买入 "订单就处于盈利状态。

这里是买入加码的条件(不包括佣金和互换)。

OrderClosePrice() > OrderOpenPrice()
如果是相反的情况,那就是减分。
 
Renat Akhtyamov 收盘价 怎么可能低于零?

如果收盘价高于开盘价,"买入 "订单就处于盈利状态。

这里是买入加码的条件(不包括佣金和互换)。

如果是相反的情况,那就是减分。

由于我是为二元期权写的,所以我做的事情有点不同。

if(OrderProfit() > 0)


这可能是正确的?

 
Natalya Smirnova #:

也许从映射的那个地方开始。
我将暂时从这个函数中删除统计的集合,而在另一个(我将制作的独立函数)中删除总减和统计。

以块为单位的写作

累计减去和加上(减去和加上是全局变量)。


第2块--选择用于计算(或者说选择)比率的变量n


这可能是正确的...

我不想干涉,甚至还没有看完你的代码和提示......

double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }

引起了我的注意。在这方面,有一个问题:使用开关运算符不是更容易和更易读吗?

double SelectVolume(int n)
  {
   double Volume = 0.0;
    switch(n)
    {
     case 1  :  Volume = Volume2;     break;
     case 2  :  Volume = Volume3;     break;
     case 3  :  Volume = Volume4;     break;
     case 4  :  Volume = Volume5;     break;
     case 5  :  Volume = Volume6;     break;
     case 6  :  Volume = Volume7;     break;
     case 7  :  Volume = Volume8;     break;
     case 8  :  Volume = Volume9;     break;
     case 9  :  Volume = Volume10;    break;
     default :  Volume = Volume1;     break;
    }
   return(Volume);
  }
我认为这更容易阅读和理解。也许它的工作速度也会快一点。
 
Alexey Viktorov #:

你已经得到了关于整个算法的建议,我不想干涉,甚至没有看你的代码和同样的建议......但是这个

引起了我的注意。在这方面,有一个问题:使用开关运算符不是更容易和更易读吗?

我认为这更容易阅读和理解。也许它的工作速度也更快一点。
由于我不是很有经验,你的建议对我来说是完全陌生的。
我最初是按我发现的方式做的,它很有效,所以我没有想过要改进它。
你知道他们是怎么说的--它有效--不要碰它。

但现在我一定会尝试应用这种方法。因为这是学习和发展的需要。

但我现在只处理我的变量n。它不想被计算。
总是n = 0(到目前为止)。