Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 123

 
nick_travel:

Доброго дня!

Помогите пожалуйста и обьясните почему не работает-торгует советник?

Мож кушать хочет? Иль зарплату ждёт...
 
hoz:


Да, кстати, такой расклад грамотнее в реализации. Тока в старте больше стало занимать места сопутствующая функция. Вышло так:

Оптимизировать вроде как нечего нельзя, верно?

Я имею ввиду то, что гораздо удобнее, когда в старте вообще мало что есть. А всё вызывается сугубо функциями. А последний раз вышло так, что в старте много всяких наростов на основные функции и переборов дополнительных...

А зачем массив по ссылке передаём, если в функции используете имя массива, объявленного глобально? Мож так надыть:

void FindOrders(int &massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

Да и чуть сократить мона:

void FindOrders(int &massive[])
{
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      massive[OrderType()] = massive[OrderType()] + 1;
   }
}

А насчёт вызова из старта и вывода сообщений. Мне кажется чего-то там намудрили. Не видно функции pr(), посему и подсказать-то нечего...

У себя, для проверки количества ордеров в тестере, по-быстренькому так сделал, особо не замудряясь:

   FindOrders(mn0, OrdersMassive);

   Comment ("\n"+"Всего ордеров = "+OrdersTotal()+
            "\n"+"Количество "+GetNameOP(0)+" = "+OrdersMassive[0]+
            "\n"+"Количество "+GetNameOP(1)+" = "+OrdersMassive[1]+
            "\n"+"Количество "+GetNameOP(2)+" = "+OrdersMassive[2]+
            "\n"+"Количество "+GetNameOP(3)+" = "+OrdersMassive[3]+
            "\n"+"Количество "+GetNameOP(4)+" = "+OrdersMassive[4]+
            "\n"+"Количество "+GetNameOP(5)+" = "+OrdersMassive[5]
            );

Можно весь вывод завернуть в функцию, которая будет считывать данные из массива и по-человечески объектами выводить информацию.

 
nick_travel:

Доброго дня!

Помогите пожалуйста и обьясните почему не работает-торгует советник?


Потому что здесь не все телепаты и не все провидцы!
 

Понятно!

я про то что может какие настройки или еще чего надо?

 
artmedia70:

А зачем массив по ссылке передаём, если в функции используете имя массива, объявленного глобально? Мож так надыть:

void FindOrders(int &massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

Вообще то да, логично. Тока у Вас тут тоже по ссылке передаётся..:)) У меня это было осталось после прошлого раза, когда параметры были не глобальны.

А по поводу функции pr. Вот она:

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
   string info [];
   ArrayResize(info, 20);
   string h, m, s, cm; int i;
   
   h = DoubleToStr(Hour(), 0);    if (StringLen(h) < 2) h = "0" + h;
   m = DoubleToStr(Minute(), 0);  if (StringLen(m) < 2) m = "0" + m;
   s = DoubleToStr(Seconds(), 0); if (StringLen(s) < 2) s = "0" + s;
   txt = h + ":" + m + ":" + s + " - " + txt;
   
   for (i=20-1; i>=1; i--)
   info[i] = info[i-1];
   info[0] = txt;
   
   for (i=20-1; i>=0; i--)
   if (info[i] != "")
   {
      cm = info[i];
      ObjectCreate ("txtw"+i, OBJ_LABEL, 0, 0, 0);
      ObjectSet    ("txtw"+i, OBJPROP_CORNER, 1);
      ObjectSet    ("txtw"+i, OBJPROP_XDISTANCE, 10);
      ObjectSet    ("txtw"+i, OBJPROP_YDISTANCE, 30+15*i);
      ObjectSetText("txtw"+i, cm, 10, "Times New Roman", Green);
   }
}
 
nick_travel:

Понятно!

я про то что может какие настройки или еще чего надо?


А я про то что тут навряд ли есть телепаты, а если и есть, то попробуй их заинтересуй на такие подвиги.. Угадать и Помочь...

 
hoz:


А я про то что тут навряд ли есть телепаты, а если и есть, то попробуй их заинтересуй на такие подвиги.. Угадать и Помочь...

А может, очень хорошая система, непозволяющая неверного входа в рынок! Мне бы такую!
 

У меня тут продолжается стопор с закрытием требуемых позиций. Суть такая:

1. Отслеживается закрытие позиций.

2. Как только закрылась последняя позиция по тейку... требуется закрыть все открытые и отложенные позиции сразу. Закрывается всё отсортировано по лотам т.е. сразу большие лоты, а дальше меньшие. Ситуация сугубо для набраться опыта работы с ордерами.

Реализация такая:

в start() на каждом тике:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

На интересует закрытие рыночных ордеров, т.к. отложенный удаляется как требуется. Вот что имеем:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   pr ("Запустилась функция isCloseByTakeLastOpenPos");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}

//+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][2];
   int p = 0;
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() < 2)
      {
         p++;
         ArrayResize(a, p);
         a[p-1][0] = OrderLots();
         a[p-1][1] = OrderTicket();
      }
   }
   pr ("ClosePosBySortLots(): " + "p = " + p);
   if (p > 0)
   {
      ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
      for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool   fc;
   color  clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int    err, it, NumberOfTry = 3;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it=1; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep(5000);
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
           if (fc)
           {
              break;
           }
           else
           {
               err = GetLastError();
           }
       }
   }
   else Print("Некорректная торговая операция. Close ");
}

Почему-то не закрывается часть ордеров. Принтую некоторые сегменты когда, не чего не понятно. Вот например:

В коменте видно, что lastOOTHist = 01:30:00, хотя, на самом деле, это не есть верно. Ведь последние закрытые ордера, если прогортать в окне результы увидим вот что:

их время закрытия другие...

Что здесь не так?

 
hoz:

Вообще то да, логично. Тока у Вас тут тоже по ссылке передаётся..:)) У меня это было осталось после прошлого раза, когда параметры были не глобальны.

Я утверждал, что массив сюда нужно передать по ссылке. Иначе функция обречена работать только с одним, жестко заданным массивом. Пусть он у вас и задан глобально.
 

Жаль, что понадобилось в конце недели, но спрошу.

Есть у кого опыт кодом прочесть сообщение на почтовом ящике от известного отправителя?

Причина обращения: