[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 351

 
Heroix:
Быстрый вы, однако. Удалил пост, т.к. сам нашел. Спасибо!

хорошо что отписались, а то я подумал что ответил на древний пост, которого найти не могу :)
 
tara:
А во вкладке "События" меню "Сервис - Настройки" все совсем плохо, однако. Попробуйте воспользоваться :( 

Согласен, всё плохо ... алерт не выключается по пробелу, только вручную ... изменения параметра алерта в "сервис-настройки-события" ничего не даёт ...
 

Ребята, подскажите пожалуйста. Я уже задавал этот вопрос, но до ума довести код так и не удалось.

Еще раз опишу суть идеи. По индикатору Awesom от низины (ниже 0) до вершины (выше 0) считается объем волны (индикатор Volumes).

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

У меня получилось вот, что:

рис4 

В чем ошибка?

 

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  SteelBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=3;
extern bool Show_Volume=true;
extern double coaf=0.5;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];


    double VLUP, AO_up,AO_dn;
    double prhgh_e=0, prhgh_s, prlw_e=0, prlw_s;
    datetime tmhgh, tmlw;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
  //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan + Volumes
     
AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;


double Vol_Arr[];
  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;
}
}

  //-- Поиск High & Time & Min_AO  
  if (AOBuffer3[i]>0)
  {
    
  AO_up = AOBuffer3[i]*0.1+AOBuffer3[i];
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}
  //SetText("Awesome_super_volumes"+Close[i], DoubleToStr(VLUP,0), tmhgh, AO_up, Black);
  }   
   
  //-- Поиск Low & Time & Max_AO 
  if (AOBuffer3[i]<0)
  {
  AO_dn = AOBuffer3[i]*0.1+AOBuffer3[i];
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  //SetText("Awesome_super_volumes"+Close[i], DoubleToStr(VLUP,0), tmlw, AO_dn, Black);
  } 
  
  // -- Пересчет баров от High до Low
  
  if(NewBar())
{ 
int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);     
int shift=iBarShift(NULL,0,tmhgh);
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
}


    
   Comment("Vol_",VLUP,prlw_e,prhgh_e); 
  for(i=0; i<limit; i++)
   {     
SetText("Awesome_super_volumes"+Close[i], DoubleToStr(VLUP,0), tmlw, AO_dn, Black);     
 }
        
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 10, "Times New Roman", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }
  
  bool NewBar()
{
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
    return(false);
   }}
 

 Эксперт кидает пачку ордеров на график.

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

 Через принт я вижу, что на определённом этапе времени, значения находит не те что нужно.

 Смысл в том, что если отложенные ордера уже закрыты, их нужно пропустить, а функция почему-то не пропускает их.  Вот функция:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders()
{
   int total = OrdersTotal() - 1;
   
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   amountOfCurrMarketOrders = 0;
   
   priceMinOfBuy = 0;
   priceMaxOfSell = 0;

   for (int i=total; i>=0; i--)
   {
     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
        if (OrderSymbol() != Symbol()) continue;
           if (OrderMagicNumber() != i_magic) continue;
           if (OrderCloseTime() != 0) continue;
           {
              if (OrderType() == OP_BUYSTOP)
              {
                 amountOfCurrPendingBuys++;

                 if (priceMaxOfBuy < OrderOpenPrice() || priceMaxOfBuy == 0)
                 {
                     priceMaxOfBuy = OrderOpenPrice();
                 }
                 if (priceMinOfBuy > OrderOpenPrice() || priceMinOfBuy == 0)
                 {
                     priceMinOfBuy = OrderOpenPrice();
                 }
              }
              if (OrderType() == OP_SELLSTOP)
              {
                 amountOfCurrPendingSells++;

                 if (priceMaxOfSell < OrderOpenPrice() || priceMaxOfSell == 0)
                 {
                     priceMaxOfSell = OrderOpenPrice();
                 }
                 if (priceMinOfSell > OrderOpenPrice() || priceMinOfSell == 0)
                 {
                     priceMinOfSell = OrderOpenPrice();
                 }
              }
              amountOfCurrMarketOrders++;
           }
   }
   Print("FindOrders() : priceMaxOfBuy ", priceMaxOfBuy);
   Print("FindOrders() : priceMinOfBuy ", priceMinOfBuy);
   Print("FindOrders() : priceMaxOfSell ", priceMaxOfSell);
   Print("FindOrders() : priceMinOfSell ", priceMinOfSell);
   
   Print("FindOrders() : amountOfCurrPendingBuys ", amountOfCurrPendingBuys);
   Print("FindOrders() : amountOfCurrPendingSells ", amountOfCurrPendingSells);
   Print("FindOrders() : amountOfCurrMarketOrders ", amountOfCurrMarketOrders);
}

 Условие то у меня прописано чётко:

if (OrderCloseTime() != 0) continue;

 Это значит, что если время закрытия оредра не ноль, то он заккрыт, и, значит, пропустим его.

 На выходе, я вижу, что их не пропускает. Вот график:

 

Почему получается не верная цена отложки? Ведь код верный, как я вижу. 

 
hoz:

 Условие то у меня прописано чётко:

if (OrderCloseTime() != 0) continue;


А зачем оно для отложенников?
 
Vinin:

А зачем оно для отложенников?


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

 Я то понимаю, что отложки не закрываются, а удаляются, но как это тогда иначе реализовать то? 

 
Вы можете написать что вам надо от функции - найти крайние отложенники ?
 
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders()
{
   int total = OrdersTotal() - 1;
   
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   amountOfCurrMarketOrders = 0;
   
   priceMinOfBuy = 0;
   priceMaxOfSell = 0;

   for (int i=total; i>=0; i--)
   {
     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
        if (OrderSymbol() != Symbol()) continue;
           if (OrderMagicNumber() != i_magic) continue;
           if (OrderCloseTime() != 0) continue;
           {// к чему относятся эти скобки ??? уберите их и if (OrderCloseTime() != 0) continue; наконец то заработает
              if (OrderType() == OP_BUYSTOP)
              {
                 amountOfCurrPendingBuys++;

                 if (priceMaxOfBuy < OrderOpenPrice() || priceMaxOfBuy == 0)
                 {
                     priceMaxOfBuy = OrderOpenPrice();
                 }
                 if (priceMinOfBuy > OrderOpenPrice() || priceMinOfBuy == 0)
                 {
                     priceMinOfBuy = OrderOpenPrice();
                 }
              }
              if (OrderType() == OP_SELLSTOP)
              {
                 amountOfCurrPendingSells++;

                 if (priceMaxOfSell < OrderOpenPrice() || priceMaxOfSell == 0)
                 {
                     priceMaxOfSell = OrderOpenPrice();
                 }
                 if (priceMinOfSell > OrderOpenPrice() || priceMinOfSell == 0)
                 {
                     priceMinOfSell = OrderOpenPrice();
                 }
              }
              amountOfCurrMarketOrders++;
           }
   }
   Print("FindOrders() : priceMaxOfBuy ", priceMaxOfBuy);
   Print("FindOrders() : priceMinOfBuy ", priceMinOfBuy);
   Print("FindOrders() : priceMaxOfSell ", priceMaxOfSell);
   Print("FindOrders() : priceMinOfSell ", priceMinOfSell);
   
   Print("FindOrders() : amountOfCurrPendingBuys ", amountOfCurrPendingBuys);
   Print("FindOrders() : amountOfCurrPendingSells ", amountOfCurrPendingSells);
   Print("FindOrders() : amountOfCurrMarketOrders ", amountOfCurrMarketOrders);
}
 
int i, buy_ticket,sell_ticket;
double min = Close[0];
double max = Close[0];
for(i = OrdersHistoryTotal()-1;i>=0;i--){
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()!=Symbol()){continue;}
      if(OrderMagicNumber()!=Magic){continue;}
      if(OrderType()==OP_BUYSTOP){
         if(OrderOpenPrice()>max){
            max = OrderOpenPrice();
            buy_ticket = OrderTicket();
         }
      }
      if(OrderType()==OP_SELLSTOP){
         if(OrderOpenPrice()<min){
            min = OrderOpenPrice();
            sell_ticket = OrderTicket();
         }
      }
   }
}
if(OrderSelect(buy_ticket,SELECT_BY_TICKET){
   if(OrderCloseTime()==0){OrderDelete(OrderTicket());}
}
if(OrderSelect(sell_ticket,SELECT_BY_TICKET){
   if(OrderCloseTime()==0){OrderDelete(OrderTicket());}
}
 
FAQ:
Вы можете написать что вам надо от функции - найти крайние отложенники ?

 Найти цены крайних отложек. Именно активных, а не удалённых. Т.е. я хочу, чтоб те отложки которые удалены - пропускались при выборке.. Я доходчиво объяснил надеюсь?
Причина обращения: