Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 153

 

Ho un codice con classi con pannello informativo!!!
MA ho un problema!
houn'etichetta su di essa e posso reagire attraverso le impostazioni remote.... quindi quando si cambiano le impostazioni 2-3 volte, il pannello stesso si muove in direzioni diverse!!! e quando si cambia il timeframe 2-3 volte!!! come posso sbarazzarmi di questo??


un po' più di informazioni:
Ho trovato che se nel file Dialog.mqh nella funzione CAppDialog::Destroy(const int reason) per commentare le linee
if(m_deinit_reason!=WRONG_VALUE)
ritorno;
allora il pannello sarà normalmente distrutto e riavviato quando si passa da un periodo all'altro.

File:
TradePanel.mq4  15 kb
 

Salve. Sto scrivendo un indicatore MT4 che lavora solo con oggetti grafici e traccia anche la posizione degli oggetti grafici creati dallo stesso indicatore lavorando su un periodo diverso. Quando sposto manualmente la linea verticale del periodo maggiore, le linee di tendenza dalla nuova posizione della linea verticale del periodo maggiore vengono ridisegnate, e anche la linea verticale del periodo minore viene ridisegnata. Tutto questo è gestito nell'evento OnChartEvent. Il problema è che quando sposto la linea verticale di un periodo alto a volte gli oggetti di un periodo basso non vengono ridisegnati subito, ma solo quando faccio doppio clic sulla linea verticale di un indicatore, lavorando su un periodo alto, vengono ridisegnati. E su un altro PC più potente questo succede meno spesso. Applico la funzione ChartRedraw() nel codice dopo aver ridisegnato gli oggetti.

Può accadere a causa della mancanza di risorse del PC?

Voglio provare a eseguire gli indicatori su diversi grafici e utilizzare EventChartCustom per generare un evento personalizzato dall'indicatore che lavora su un periodo superiore al secondo indicatore. Forse questo accelererà il funzionamento del programma?

 

Come posso azzerare (cancellare) rapidamente tutti gli elementi di una struttura?


La struttura è globale. In certi momenti deve essere cancellato per essere riempito più tardi con nuovi dati.

Capisco che si possa elemento per elemento equiparare tutto a zero. C'è un altro modo?


struttura ABC{

int a1;

int a2;

int a3;

};

ABC a;

Abbiamo bisogno di qualcosa come questo

a = 0; // tutti gli elementi della struttura in acciaio sono zero

 
Sergey Likho:

Come posso azzerare (cancellare) rapidamente tutti gli elementi di una struttura?


La struttura è globale. In certi momenti deve essere cancellato per essere riempito più tardi con nuovi dati.

Capisco che si possa elemento per elemento equiparare tutto a zero. C'è un altro modo?


struttura ABC{

int a1;

int a2;

int a3;

};

ABC a;

Abbiamo bisogno di qualcosa come questo

a = 0; // tutti gli elementi della struttura in acciaio sono zero

ZeroMemory(a);
 
qualcuno ha un trade trailing che scatta dopo N pip e poi va dietro al prezzo?
Ne ho uno, ma si attiva dopo N pips e si ferma a breakeven....
correggetelo per favore, sono fuori di testa!!!
void TrailingSL()
{
int    er;
if(shagtrala==0) return;
for(int i = 0; i < OrdersTotal(); i++)
  {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY && NormalizeDouble(Ask-OrderOpenPrice(), Digits) >= NormalizeDouble(shagtrala, Digits) &&
         NormalizeDouble(Ask-OrderStopLoss(), Digits) > NormalizeDouble(lTrailingDistance, Digits))
           {
            er = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss() + (lTrailingDistance * _Point), OrderTakeProfit(),OrderExpiration(),0);
           }
         if(OrderType()==OP_SELL && NormalizeDouble(OrderOpenPrice()-Bid,Digits) >= NormalizeDouble(shagtrala, Digits) &&
         NormalizeDouble(OrderStopLoss()-Bid, Digits) > NormalizeDouble(lTrailingDistance, Digits))
           {
            er = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss() - (lTrailingDistance * _Point), OrderTakeProfit(),OrderExpiration(),0);
           }
        }
     }
  }
return;
}
 
ponochka:
qualcuno ha un trawl che si attiva dopo N pips e poi va dietro al prezzo?
Ne ho uno, ma funziona dopo N pips e si ferma a breakeven....
correggetelo per favore, sono fuori di testa!!!

qui il mio trawl funziona, funziona:

//____________________________________________________________________________________
bool trailingpos(int magic_,int trail_p){
   string sym=Symbol(); bool res = true; double sl,slnew,tpips = trail_p*Point; int i,k=OrdersTotal();
   for(i=0;i<k;i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==sym && OrderMagicNumber()==magic_){
            switch(OrderType()){
               case OP_BUY:
                           slnew = NormalizeDouble(Ask - tpips,Digits);
                           sl = OrderStopLoss();
                           if(OrderOpenPrice() <slnew)
                              if((sl < slnew) || (sl == 0.0)){
                                    if(!OrderModify(OrderTicket(),OrderOpenPrice(),slnew,OrderTakeProfit(),OrderExpiration(),clrNONE))
                                                   {res = false; Print(__FUNCTION__,"OrderModify завершилась с ошибкой № ",GetLastError());}
                           }
                           break;
               case OP_SELL:
                           slnew = NormalizeDouble(Bid + tpips,Digits);
                           sl = OrderStopLoss();
                           if(OrderOpenPrice()> slnew)
                              if((sl > slnew) || sl ==0.0){
                                    if(!OrderModify(OrderTicket(),OrderOpenPrice(),slnew,OrderTakeProfit(),OrderExpiration(),clrNONE))
                                                   {res = false; Print(__FUNCTION__,"OrderModify завершилась с ошибкой № ",GetLastError());}
                           }
                           break;
              }
           }
        }
     }
return(res);}
//____________________________________________________________________________________

chiamare la funzione 2 parametri numero magico e trawl np

 
Sergey Likho:

Come posso azzerare (cancellare) rapidamente tutti gli elementi di una struttura?


La struttura è globale. In certi momenti deve essere cancellato per essere riempito più tardi con nuovi dati.

Capisco che si possa elemento per elemento equiparare tutto a zero. C'è un altro modo?

// Обнуляет любую простую структуру
template <typename T>
void SetNull( T &Value )
{
  static T NullValue = {0};
  
  Value = NullValue;
}
 

Ciao, c'è un codice per i guadagni totali su tutti gli ordini in un giorno?

Ne ho uno:

double getProfitFromTime(datetime time)
  {
   double profit = 0;
   
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
         if(OrderCloseTime() < time)
            break;
         
         profit += OrderProfit() + OrderCommission() + OrderSwap();
        }
   
   return(profit);
  }

Ci si riferisce a questo:

getProfitFromTime(iTime(NULL, PERIOD_D1, 0);

Posso modificarlo in qualche modo, in modo che io possa vedere il profitto per una coppia di valute in un giorno e il profitto totale per tutte le coppie di valute?

 
ponochka:

e totale per tutte le coppie di valute?

RimuovereOrderSymbol() == Symbol() dalla condizione:

if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
allora questa parte del codice conterà tutti gli ordini nella cronologia del terminale per numero magico solo se il numero magico per le diverse valute è lo stesso; se si toglieOrderMagicNumber() == magic allora tutti gli ordini saranno contati senza considerare il numero magico
 

Ciao a tutti. Un consiglio per un nuovo arrivato. Voglio fare una piccola ricerca sul comportamento di diffusione. Ho del codice che calcola lo spread totale. Tutto è scritto, tutto funziona bene.

void ModifySpread()
{
  int Spread = (Ask - Bid) / Point;
  
    
  Sumsp = SumSp + Spread;
  Vol++;
  
  PrevTime = Time[0];
  
  return;
}

Voglio rimuovere i momenti in cui lo spread non esegue alcun movimento, cioè bid e ask non cambiano.
Io faccio questo:

void ModifySpread()
{
  int Spread = (Ask - Bid) / Point;
  if ((prevsbid == Bid)) && (prevsask == Ask))return;
   
  SumSp = SumSp + Spread;
  Vol++;
  
  

  prevsask = Ask;
  prevsbid = Bid;
  PrevTime = Time[0];
  return;
}

Ma non cambia nulla. Dove sto andando piano?

Motivazione: