Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1952

 
Vitaly Muzichenko #:

Intervengo :)

C'è un indice DAX30 = quotato da 9 a 22

Qual è il modo per scoprire quante barre in una sessione su Timeframe M15, H1 ecc.

Maxim Kuznetsov #:

(22*3600-9*3600)/PeriodSeconds(M15)

ma questo è idealmente "questo numero di barre dovrebbe essere tra le 9:00 e le 22:00".

Più piccolo è il lasso di tempo, maggiore è l'errore, in realtà è quasi sempre minore. Non puoi usare la cronologia per calcolare "la prossima sessione ogni N barre".

È molto più semplice...

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Buon pomeriggio a tutti.

Ho bisogno del vostro aiuto.

L'EA ha una funzione di conteggio incorporata per il profitto corrente:

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTick è fatto come sopra.

Come fare in modo che il contatore dei profitti si azzeri a 0.0 quando si verificano le condizioni:

if(CountOrders()==0) && (GetProfitFromStart()>0

cioè tutti gli ordini sono chiusi e il profitto totale quando l'ultimo ordine è chiuso era >0?

 

Installato MT4. Non salva le citazioni dopo la chiusura del terminale - ne carica una nuova ogni volta.

 
Maxim Kuznetsov #:

anche in 4, è meglio"aprire prima, modificare dopo".

Non tutti ti permettono di aprire sul mercato con uno Stop Loss allo stesso tempo.

A proposito, lo stop loss non avviene ovunque. Se vuoi fare trading con un ordine stop-loss devi controllarlo sul server del broker, è il suo servizio personale (credito, rischio, guadagno), non dove pensi che sia, non esiste un canale di trading di ordini stop-loss.

Grazie, sì, anche la demo su diversi broker mostra condizioni troppo diverse.

 
законопослушный гражданин #:

Buon pomeriggio a tutti.

Ho bisogno del vostro aiuto.

L'EA ha una funzione di conteggio integrata per il profitto corrente:

void OnTick è fatto come sopra.

Come fare in modo che il contatore dei profitti si azzeri a 0,0 quando si verificano le condizioni:

if(CountOrders()==0) && (GetProfitFromStart()>0

Cioè, tutti gli ordini sono chiusi e il profitto totale quando l'ultimo ordine è chiuso era >0?

Questo compito non è del tutto chiaro. Ogni volta la funzione di calcolo inizia a passare attraverso gli ordini/posizioni e riassume i profitti da zero.

 double lp=0,cp=0;

Cosa vuoi azzerare? Se non avete posizioni aperte/ordini di mercato, la funzione di conteggio restituirà zero. Si azzererà da solo)))

 
законопослушный гражданин #:

Buon pomeriggio a tutti.

Ho bisogno del vostro aiuto.

Come fare in modo che il contatore dei profitti si azzeri a 0.0 quando si verificano le condizioni:

cioè tutti gli ordini chiusi e il profitto totale quando l'ultimo ordine chiuso era >0??

Che cosa esattamente non funziona?

 

Buon pomeriggio. Per favore, aiutatemi.

Cercare ordini chiusi con rendimenti negativi.
Per i totali manca, non ottengo il risultato di tutti gli ordini negativi.

Sto imparando a scrivere.

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

Buon pomeriggio. Per favore, aiutatemi.

Cercando ordini chiusi con rendimenti negativi.
Per i totali manca, non ottengo il risultato di tutti gli ordini negativi.

Sto cercando di imparare a scrivere.

Ad una rapida occhiata, vedo che stai guardando le posizioni dalla fine e allo stesso tempo, scrivi il tempo di chiusura nella variabile. Potrebbe risultare che avete catturato il tempo dell'ultima posizione chiusa e la condizione successiva non sarà più vera:

OrderCloseTime()>=time

mentre altre posizioni hanno tempi di chiusura inferiori. Tutto ciò dipende dall'ordinamento, ma nell'ordinamento standard questo è il problema.


Risolvi anche questa condizione

(OrderType() == OP_BUY || OP_SELL)

a

(OrderType() == OP_BUY || OrderType() == OP_SELL)

Se prendiamo una posizione dalla storia, OrderProfit() memorizza già il risultato finale con swap e commissioni. Nelle posizioni aperte - no, tutto deve essere riassunto. Ma questo non è certo, controllate.

 
Nikita Chernyshov #:

Ad una rapida occhiata, vedo che stai guardando le posizioni dalla fine e stai scrivendo il tempo di chiusura nella variabile. Potrebbe risultare che avete catturato il tempo dell'ultima posizione chiusa e la condizione successiva non sarà più vera:

mentre altre posizioni hanno tempi di chiusura inferiori. Tutto ciò dipende dall'ordinamento, ma nell'ordinamento standard questo è il problema.


Risolvi anche questa condizione

a

Se prendiamo una posizione dalla storia, OrderProfit() memorizza già il risultato finale con swap e commissioni. Nelle posizioni aperte - no, tutto deve essere riassunto. Ma questo non è accurato, per favore controllate.

Grazie, funziona bene.

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

Inoltre, quando incontriamo un ordine con un profitto positivo, dovremmo azzerare il risultato e cercare quelli negativi.

 
Alexander Avksentyev #:

Buon pomeriggio. Per favore, aiutatemi.

Cercare ordini chiusi con rendimenti negativi.
Per i totali manca, non ottengo il risultato di tutti gli ordini negativi.

Sto imparando a scrivere.

Raccomando di usare un debugger per questa e altre situazioni simili.