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

 
Rustam Bikbulatov:
Ciao, ho bisogno di un consiglio. Perché il mio ultimo testo non viene visualizzato? Cosa c'è di sbagliato qui? Potete per favore dirmi come risolvere il problema!

Perché avete bisogno di un ciclo se prendete sempre e solo il nome di un oggetto?

for(int no1=0; no1<ObjectsTotal(OBJ_TEXT); no1++)
  {
   if(ObjectName(0)=="Profit1"+iBarShift(NULL,1440,0))
     {
      double name;
      name = ObjectDescription(0);;
      Comment(name);
     }
  }
 

Iurii Tokman:

no1<=ObjectsTotal(OBJ_TEXT);

Non si può fare esattamente così - sarà fuori dai limiti dell'array. Se ci sono 10 oggetti, l'indice dell'ultimo sarà 9. Perché conta da zero.

 
Artyom Trishkin:

Perché un ciclo se si prende solo il nome di un oggetto alla volta?

ditemi esattamente come determinare il penultimo testo di questo oggetto.

 
Rustam Bikbulatov:

ditemi esattamente come determinare il penultimo testo di questo oggetto.

È difficile sapere cosa si vuole.

 
void Profit()
  {
   ObjectCreate("Profit"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.6);
   ObjectSetText("Profit"+iBarShift(NULL,1440,0),DoubleToStr(AccountProfit(),2),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit1()
  {
   double  Prof = ObjectDescription("Profit1"+iBarShift(NULL,1440,0));
   double  P = -Prof;
   ObjectCreate("Profit1"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.1);
   ObjectSetText("Profit1"+iBarShift(NULL,1440,0),DoubleToStr(MathMax(-AccountProfit(),-P),1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit1"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit2()
  {
   ObjectCreate("Profit2"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.4);
   ObjectSetText("Profit2"+iBarShift(NULL,1440,0),iBarShift(NULL,1440,0)-1000,11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit2"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit3()
  {
   for(int no1=0; no1<=ObjectsTotal(OBJ_TEXT); no1++)
     {
      if(ObjectFind(1,"Profit2"+iBarShift(NULL,1440,0))!=0)
        {

         string   obj_name;
         obj_name = ObjectName(3);
         string   name;
         name = ObjectDescription(obj_name);
         Comment(obj_name);
        }
     }

   ObjectCreate("Profit3"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.9);
   ObjectSetText("Profit3"+iBarShift(NULL,1440,0),DoubleToStr(name,1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit3"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }

Provit - mostra i profitti totali durante il test durante il giorno

Provit1 - mostra il massimo prelievo per il giorno

Provit2 - riga numerica normale a partire da uno

Provit3 - Obiettivo! Sommare Provit1 e dividere per Provit2. Voglio sapere il drawdown medio giornaliero per il tempo totale del test. Aiuto per capire Provit3

 

Colleghi - cosa potrebbe essere questo errore di chiusura e come affrontarlo? Ecco il codice qui sotto, quando il profitto è superato - chiudi tutte le posizioni unidirezionali. Grazie.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if(takeprofit < ProfitB)    
      {   
        Print(" ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = ", ProfitB," мин общий takeprofit buys positions = ", takeprofit);   
        for (i=OrdersTotal()-1; i>=0; i--)         
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if(OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray))  
                   Print(" закрытие бай, тикет = ", OrderTicket());
               else  Print(" ошибка закрытия бай, Error = ", GetLastError());          
            }
       }     
      
       if(takeprofit < ProfitS)     
        { 
         Print(" ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = ", ProfitS," мин общий takeprofit СЕЛЛов = ", takeprofit);   
 
         for (i=OrdersTotal()-1; i>=0; i--)      
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if(OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray)) 
                   Print(" закрытие SELL,  тикет = ", OrderTicket());
               else   Print(" ошибка закрытия sell, Error = ", GetLastError());     
            }       
         }    
           
 
Roman Shiredchenko:

Colleghi, cosa può essere questo errore di chiusura e come affrontarlo? Se voglio usare il codice qui sotto, ho bisogno di chiudere tutti gli ordini unidirezionali quando sono redditizi. Grazie.

Qual è l'errore? schermo sbagliato

in teoria dovrebbe funzionare, ma non ho visto una chiusura così sofisticata che tenga conto dello spread e lo aggiunga come slippage - imho, se si decide di chiudere, allora lo slippage non è la cosa più importante da controllare, gli errori di chiusura sono più importanti, poi le requote, poi la connessione viene persa completamente


Togliete OrderClose(....) e sostituitelo con ClosePosBySelect() di Kimhttps://www.mql5.com/ru/forum/131859/page2#comment_3359664

usarlo, allora vedrete chiaramente dove si sta rompendo - o nelle vostre condizioni di chiusura o nel server che ha un bug

 
Igor Makanu:

Qual è l'errore? schermo sbagliato

in teoria dovrebbe funzionare, ma non ho visto una chiusura così sofisticata che tenga conto dello spread e lo aggiunga come slippage - imho, se si decide di chiudere, allora lo slippage non è la cosa più importante a cui fare attenzione, gli errori di chiusura sono più importanti, poi le requote, poi la connessione si perde completamente


rimuovere OrderClose(....) e passare invece il ticket a ClosePosBySelect() di Kim, allora sarà chiaro dove non funziona - o nelle vostre condizioni di chiusura o il server ha un bug

Lì ha un prezzo zero vicino. Di conseguenza, abbiamo bisogno di controllare ciò che è stato restituito da MarketInfo-function, ma non c'è controllo. Tuttavia, come al solito su quattro, alcune persone sono abituate a scrivere - qualcosa ricevuto, cosa - non ha controllato, ma ha inviato un argomento.

 
Artyom Trishkin:

Lì ha un prezzo zero vicino. Di conseguenza, abbiamo bisogno di controllare ciò che è stato restituito da MarketInfo-function, ma non c'è controllo. Tuttavia, come al solito sul quattro alcune persone sono abituate a scrivere - qualcosa ricevuto, cosa - non ha controllato, ma ha inviato l'argomento.

L'ho visto, dubito che sarà in grado di disimpostare tutto da solo, ecco perché ho suggerito di usare ClosePosBySelect() per chiudere l'ordine selezionato tramiteOrderSelect( ) - lui può farlo, almeno l'ho visto assemblare i codici con il costruttore )))

SZY: ho un altro sospetto che chiude un ordine due volte, ma la funzione di Kim stampa nel log, sembra che non ci siano cicli separati da chiudere per la 2a condizione

 
Igor Makanu:

L'ho visto, dubito che sarà in grado di disimpegnare tutto da solo, ecco perché ho suggerito di usare la chiusura provata di un ordine evidenziato tramite OrderSelect()

Certo, le funzioni di Igor faranno tutto per l'utente (e anche alcuni utenti riescono a fare un errore con esse). Ma in questo caso, non imparerà mai a fare qualcosa da solo. Anche se, naturalmente, è una loro scelta.

Motivazione: