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

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

artmedia70

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

if(Volume[0]>1) return;

Прочитал в учебнике, что можно не считать тики, а сделать открытие (закрытие) сделки через время появления баров. Возможно ли это? Если да, то можно кинуть подсказку как запрограммировать применительно к моей ситуации.

 
alexey1979621:

artmedia70

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

if(Volume[0]>1) return;

Прочитал в учебнике, что можно не считать тики, а сделать открытие (закрытие) сделки через время появления баров. Возможно ли это? Если да, то можно кинуть подсказку как запрограммировать применительно к моей ситуации.

Может это пригодится:

Функция возвращает истину при появлении нового бара на М15

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

Подскажите пожалуйста!!

Пишу открытие двух ордеров в определенное время отложенниками

{

Определение время открытия

}

if ((условие)==true)//
{
OrderSend ( OP_BUYSTOPP, параметры);// открываем отложенный ордер байстоп
OrderSend ( OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

Время вроде как написал правильно, оно его определяет, а вот только открывает почему-то по своему выбору или селлстоп, или байстоп, две сразу не открывает.. но если и открывает, то например БАЙСТОПП в двух-трех-четырех или пяти экзеплярах. А я пытаюсь добится чтобы открывало два отложенника разных типов (байстоп, и селлстоп) в одно время, и по одному. Вопрос вроде примитивный, помогите чайнику) Спасибо!)

Чтобы тут вставить правильно код нажмине сперва на SRC, а потом скопируйте туда код.

Если я правильно вас понял в определённый момент времени надо открыть один OP_BUYSTOP и один OP_SELLSTOP ? Допустимо ли в этот момент наличие каких-либо других отложенных ордеров? Напр. есть отложенники, но перед тем как открыть новые надо удалить старые?

 
artmedia70:
Эта ошибка относится к графическим объектам, а не к ордерам

Вот именно! Ошибка касается объектов, но у меня объектов в этом советнике нет...


borilunad:
Добрый вечер, Виктор! Странно, отложенный ордер не объект! Может, у тебя не удалён какой-то из объектов, который уже должен был удалён, но не удалён!

Добрый день, Борис! Объектов эксперт не создаёт. А ошибка эта идёт из функции выставляющей отложенный ордер. Вот версия функции (для тестера):

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

Если ордер не поставлен, значит срабатывает блок:

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

Он ошибку и сообщает.


Логику кто-нибудь понял?

 
artmedia70:

Раз нет ответа на вопрос, то вот функция, которая вернёт тикет последнего установленного ордера:



спасибо!! то что надо

 
hoz:
Вот именно! Ошибка касается объектов, но у меня объектов в этом советнике нет...

Добрый день, Борис! Объектов эксперт не создаёт. А ошибка эта идёт из функции выставляющей отложенный ордер. Вот версия функции (для тестера):

Если ордер не поставлен, значит срабатывает блок:

Он ошибку и сообщает.

Логику кто-нибудь понял?

Значит, проверь, что у тебя в проверке ошибок? Наверно, там что-то глючит!
 
borilunad:
Значит, проверь, что у тебя в проверке ошибок? Наверно, там что-то глючит!

Хех)) А чему там глючить Борис? Всё прозрачно...

pr - функция печати. А ошибка, это уже стандартная константа. По логике вообще не приемлимо быть такому раскладу. Если всё-таки есть подозрение у Вас на функцию 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);}}
 

  • Логику кто-нибудь понял?


Лот нормализован? Ну и цену проверить.

i_magic, pt, i_distanceFromLastPos глобальны?

 
splxgf:

i_magic, pt, i_distanceFromLastPos глобальны?


Да. Переменные с i_ то вводные переменные (от слова инпут, которые можно менять пользователю..), а pt - это глобальная переменная тоже, которая видна везде..
splxgf:


  • Логику кто-нибудь понял?


Лот нормализован? Ну и цену проверить.


Нет, лот не нормализовывал. В тестере никогда с этим не сталкивался.. И причём тут лот, к объекту (ошибка 4200)?
 
hoz:

У меня периодически, но не постоянно функция установки отложенного ордера выдаёт ошибку 4200. Согласно документации эта ошибка означает, что объект уже существует:

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

Получается, что ордер данного типа уже в рынке в момент посылка отложенного ордера?

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