Проверьте - что я не правильно сделала?

 

Пишу код

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;

как цена закрытия ордера может быть меньше нуля?

ордер BUY будет в плюсе, если цена закрытия больше цены открытия

вот условие плюса по покупке (без учета комиссий и свопа):

OrderClosePrice() > OrderOpenPrice()
если наоборот, то это минус
 
Renat Akhtyamov #:

пока не пойму логики

как так?

как цена закрытия ордера может быть меньше нуля?

ордер BUY будет в плюсе, если цена закрытия больше цены открытия

вот условие плюса по покупке (без учета комиссий и свопа):

если наоборот, то это минус

Так как я пишу для бинарных опционов я сделала чуть иначе:

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;
  }

бросилось в глаза. В связи с этим вопрос: разве не проще и более читабельно применить оператор-переключатель switch

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 #:

По всему алгоритму вам уже надавали советов, я не хочу встревать и даже не смотрел ваш код и так-же советы… А вот это

бросилось в глаза. В связи с этим вопрос: разве не проще и более читабельно применить оператор-переключатель switch

Мне кажется так читается и понимается легче. Возможно и работает чуток побыстрей.
Так как я не очень опытная для меня Ваше предложение обсолютно в новинку.
Я изначально сделала так как я нашла, оно работало, вот и не задумывалась над улучшением.
Знаете как говорят - Работает - не трогай.

Но теперь я конечно попробую применить данный метод. Так как необходимо учиться и развиваться.

Вот только сейчас со своей переменной n разберусь. Никак она не хочет считаться.
всегда n = 0 (пока)
Причина обращения: