[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 351

 
Heroix:
Però sei veloce. Cancellato il post come l'ho trovato io stesso. Grazie mille!

Mi fa piacere sentirti, pensavo di rispondere a un vecchio post che non riesco a trovare :)
 
tara:
E nella scheda "Eventi" del menu "Strumenti - Impostazioni", le cose vanno abbastanza male, però. Prova ad usarlo :(

Sono d'accordo, è brutto ... L'allarme non viene spento dalla barra spaziatrice, solo manualmente ... cambiare il parametro di allarme in "service-settings-events" non fa nulla ...
 

Ragazzi, per favore, datemi un suggerimento. Ho già fatto questa domanda, ma non sono riuscito a trovare il codice giusto.

Ancora una volta vi dirò il succo dell'idea. Con l'indicatore Awesom, dal basso (sotto 0) all'alto (sopra 0), viene calcolato il volume dell'onda (indicatore Volumi).

L'etichetta di testo con la somma del volume dell'onda, dovrebbe essere stampata sul grafico dell'indicatore e calcolata su tutta la storia.

Ho preso questo:

fig4

Qual è l'errore?

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

L'EA lancia una pila di ordini sul grafico.

La mia funzione trova il numero di ordini di mercato aperti, le offerte pendenti e le liquidazioni. Ho aggiunto un'altra funzione incorporata che trova i valori dei prezzi massimi e minimi degli ordini pendenti per controllare un'altra cosa più velocemente.

Posso vedere attraverso l'impronta che in qualche momento, trova dei valori che non sono quelli che voglio.

L'idea è che se gli ordini pendenti sono già chiusi, devono essere saltati ma questa funzione non li salta per qualche motivo. Ecco la funzione:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}

Ho una condizione chiara:

if (OrderCloseTime() != 0) continue;

Significa che se il tempo di chiusura di un ordine non è zero, è chiuso e dovremmo saltarlo.

Sull'uscita, vedo che non li salta. Ecco il grafico:

Perché il prezzo della pausa è sbagliato? Perché il codice è corretto, per come lo vedo io.

 
hoz:

La condizione che ho è chiaramente indicata:

if (OrderCloseTime() != 0) continue;


Cosa c'è per gli attaccanti?
 
Vinin:

Cos'è per gli ordini in sospeso?


Quindi per gli ordini attivi il prezzo di chiusura è logicamente zero (dato che non è chiuso), ma per gli ordini che hanno già chiuso il prezzo di chiusura non è zero (il prezzo di chiusura sarà quello al momento in cui è stato cancellato). Logicamente, questa è l'ora di chiusura?

Capisco che gli ordini in sospeso non vengono chiusi ma cancellati, ma come dovremmo implementarlo?

 
Puoi scrivere ciò di cui hai bisogno dalla funzione - trovare i pendenti più esterni?
 
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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:
Puoi scrivere cosa ti serve dalla funzione - trovare gli ordini pendenti più esterni?

Per trovare i prezzi degli ordini pendenti più esterni. Sono quelli attivi, non quelli cancellati. Cioè, voglio saltare gli ordini pendenti cancellati nella nostra ricerca... Spero di essere stato chiaro?