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

 
skyjet:

Здравствуйте! Ищу ошибки в этой ф-ии.

По идее не открывшиеся отложенные ордера должны удаляться через два дня после их выставления.

min=1440;

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
         {  if(TimeCurrent()-OrderOpenTime()>=min)
            {  OrderDelete(OrderTicket());
               return;
         }  }
}  }  }
 
skyjet:

Здравствуйте! Ищу ошибки в этой ф-ии.

По идее не открывшиеся отложенные ордера должны удаляться через два дня после их выставления.

min=1440;


А зачем отслеживать и удалять отложенные ордера? Поставьте им datetime expiration=TimeCurrent()+min*60+sec; Они сами и удалятся через min*60+sec после выставления.
 
Sepulca:

А зачем отслеживать и удалять отложенные ордера? Поставьте им datetime expiration=TimeCurrent()+min*60+sec; Они сами и удалятся через min*60+sec после выставления.
Возможно у него закрытие отложенного ордера подчиненно какому-то алгоритму и при одном условии закрытие через 1 день, при ином напр. 2 дня.
 
Sepulca paladin80 Спасибо! datetime expiration это то, что нужно :)
 

paladin80:

OrderOpenTime() возвращает время открытия ордера.

Для отложенного ордера эта функция возвращает ноль.

 
PapaYozh:

OrderOpenTime() возвращает время открытия ордера.

Для отложенного ордера эта функция возвращает ноль.

Хмм, я быстро подправил код, не проверяя сами функции. Точно, OrderOpenTime() показывает время открытия брокером позиции, а не время принятия брокером отложенного ордера. Т.е. наверно лучше сразу в ордере указывать время закрытия, либо время выслания ордера записать в магик-номер (если и так не используется) и TimeCurrent() сравнивать с OrderMagicNumber( ).
 

Добрый день. Помогите разобраться с кастомным индикатором.

Решаю проблему определения расстояния до трендовой линии. Необходимо получить расстояние до трендовой конкретно на том тайме, где она нанесена (независимо от тайма, который открыт в терминале). Текущее значение трендовой получаю функцией ObjectGetValueByShift. Поскольку расчеты можно вести только по открытому тайму, написал маленький индикатор. Привлекло то, что в функции iCustom есть параметр timeframe, но вот насколько этот параметр учитывается при вызове индикатора - это вопрос.

Вот индикатор:


#property indicator_chart_window
#property indicator_buffers 1
//--------------------------------------------------------------------   
extern string TL_name = "TL_1";
//--------------------------------------------------------------------   
double valueBuf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   //---- indicators
   SetIndexBuffer(0,valueBuf);
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, White);
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   //----
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int i;
   int    counted_bars = IndicatorCounted();
   //----
   i = Bars - counted_bars - 1;           // Индекс первого непосчитанного
   
   // Цикл по непосчитанным барам
   while(i>=0) {
      valueBuf[i] = NormalizeDouble(ObjectGetValueByShift(TL_name,i), Digits);
      i--;
   }     
   //----
   return(0);
}

Индикатор считает текущее значение трендовой.
Сам индикатор вызываю так:

TL_price_now = iCustom(NULL,PERIOD_D1,"TL_value",TL_name,0,0);

Здесь для примера в индикатор как параметр передается тайм PERIOD_D1, на котором нанесена трендовая, и на котором надо вести расчет расстояния.

Расстояние до трендовой рассчитываю просто:

dist = NormalizeDouble(TL_price_now - Bid, Digits);
Вроде все так, да не так: при переключении на другие таймы (отличные от Д1), индикатор возвращает другие значения (правильные для тех таймов, на которые переключаюсь).
Вот тут возникает вопрос: насколько вообще учитывается период при вызове функции iCustom?
Или может я в индикаторе что перемудрил?
 
pako:


t = OrdersTotal();

зачем считать???? посчитанное???


Так я ж чтоб передать значение по ссылке так сделал. Логика проста!
 
artmedia70:

В моём варианте ф-ция покороче будет ... :)



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

void FindOrders(int& massive[])
{
   int oType;
   ArrayInitialize(massiveOfOrders, 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();
      massiveOfOrders[oType] = massiveOfOrders[oType] + 1;
   }
}

int start()
{
   int i, oTotal = 0, oPending = 0;
   
   FindOrders(massiveOfOrders);
   
   for (i=0; i<=7; i++)
   {
       if (i > 1 && i < 6)
       {
           oPending += massiveOfOrders[i];
       }
       if (i < 6)
       {
          oTotal += massiveOfOrders[i];
       }
   }
   pr ("FindOrders(): " + "oTotal = " + oTotal);
   pr ("FindOrders(): " + "oPending = " + oPending);

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

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

 

Доброго дня!

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

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