[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 317

 
enya:

.

in inserito. problemi con il ciclo e il ripristino dei valori iniziali dopo l'uscita dal ciclo

Ecco la funzione che risponderà se l'ultimo trade è stato redditizio o meno:

 double LastOrderProfit()
 {
   double Profit=0;
   int ticket; 
   for(int i=0; i<OrdersHistoryTotal(); i++){
     if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderSymbol()!=Symbol())continue;
     if(OrderMagicNumber()!=Magic)continue;
     if(OrderType()>1)continue;
     if(ticket<OrderTicket()){
        ticket=OrderTicket();
        Profit=OrderProfit()+OrderSwap()+OrderCommission();
     } 
   }     
 return(Profit);
 } 

Poi, confrontando la sua risposta con lo zero, si decide se lasciare TP/SL uguali o cambiarli.

 if(LastOrderProfit()>0) newTPSL=false; else  newTPSL=true;
if(newTPSL)OrderModify(.......newSL,newTP...);
 

Ciao a tutti. Sono interessato all'indicatore IN10TION NewsReader. Voglio allegarlo al mio EA.

Se appare una linea rossa (Market.TdOpen) e Market.Price.DOWN(red) allora vendi

Se appare una linea rossa (Market.TdOpen) e Market.Price.UP(verde) allora compra

Ho provato con iCustom ma non funziona!


extern bool Market.TdOpen = TRUE;
extern color Market.TdOpen.Color = Red;
extern bool Market.TdFibo = TRUE;
extern color Market.TdFibo.Color = C'0x00,0x32,0x00';
extern color Market.Price.UP = Lime;
extern color Market.Price.DOWN = Red;
extern bool Market.Price.Guide = TRUE;

File allegati:
_yIN10TIONfNewsReaderov09.99kblite.ex4 (115,59 KB) cancellare

 

Mi scuso con gli amministratori per essermi ripetuto, ma nessuno mi ha ancora detto mezza parola. L'idea è quella di emettere messaggi memorizzati nei log, cioè quelli che non possono essere risolti correttamente dalla funzione IsConnected() - fallimenti di connessione, richieste. Altrimenti non è chiaro perché l'EA non stia facendo nulla al momento.


Si prega di suggerire il codice qui sotto per leggere il file di log. Legge automaticamente il file di registro corrente per data e lo invia alla stampante.

Dove:

while (result>0) {

Un file viene assemblato da parti. Ma non ho bisogno di tutto il file, solo dell'ultima riga. Aiutatemi a correggerlo, per favore.

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 

Ho bisogno di aiuto per cambiare un EA

L'Expert Advisor dovrebbe fare trading al contrario.

Invece degli ordini limite di vendita comprate

e gli ordini limite di acquisto vendono

File:
tke.mq4  18 kb
 
mersi:

Ecco la funzione che risponderà se l'ultimo commercio era redditizio o non redditizio:

Poi, confrontando la sua risposta con lo zero, si decide se lasciare TP/SL uguali o cambiarli.

La vostra funzione è sicura di restituire l'ultimo ordine? O restituirà il primo ordine che non stava perdendo? Perché c'è un controllo sul biglietto?

Io lo farei in questo modo:

//+----------------------------------------------------------------------------+
double LastOrderProfit() {
   double Profit=0;
   datetime t;
   int i, j;
   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderMagicNumber()!=Magic)                  continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderType()>1)                              continue;
      if (t<OrderCloseTime()) {
         t=OrderCloseTime();
         j=i;
         }
      }
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
   return(Profit);
} 
//+----------------------------------------------------------------------------+

Questa è una riprogettazione della tua funzione per trovare esattamente l'ultimo ordine chiuso.

Ha lo svantaggio che se non ci sono ordini chiusi, restituisce zero. Così, usandolo, è impossibile sapere con certezza se ci sono o non ci sono ordini chiusi nella storia. Dopo tutto, lo zero restituito non indica che non c'è nessun ordine, ma che è chiuso a zero.

 

Si prega di avvisare:

è interessato a rendere il valore dell'indicatore solo per ultimo (corrente) bar. Tuttavia, quando si apre una nuova barra, i vecchi valori rimangono sul grafico.... Come posso rimuovere con forza questa spazzatura? È possibile specificare la condizione che per la barra [0] i valori dell'indicatore sono calcolati e mostrati, e per le barre da [1] a [Bar-1] questi valori sono azzerati?

double Buffer [1];            

int init()
  {

   IndicatorBuffers(1);
  
   SetIndexStyle(0,DRAW_ARROW);
   .........
 
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) counted_bars=0;
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
       for(int i=limit;i>=0;i--) 
     {
         Buffer [0] = ............;
     }
   return(0);
  }        
 

artmedia70:

Ha lo svantaggio che se nessun ordine è stato chiuso, restituisce zero. Così, usandolo, è impossibile sapere con certezza se ci sono o non ci sono ordini chiusi nella storia. Dopo tutto, il null restituito non significa che l'ordine non esiste affatto, ma che è chiuso a zero.

Grazie! Anche se non mi hai risposto, hai risposto alla mia domanda precedente sul calcolo corretto del profitto:

Profit=OrderProfit()+OrderSwap()+OrderCommission();
 
Azerus:

Si prega di avvisare:

è interessato a rendere il valore dell'indicatore solo per ultimo (corrente) bar. Tuttavia, quando si apre una nuova barra, i vecchi valori rimangono sul grafico.... Come posso rimuovere con forza questa spazzatura? È possibile specificare la condizione che per la barra [0] i valori dell'indicatore sono calcolati e mostrati, e per le barre da [1] a [Bar-1] questi valori sono azzerati?

All'inizio di Start(), inizializzate il buffer con il valore EMPTY_VALUE. Cioè, fallo con l'apparizione di una nuova barra, controlla il tempo di apertura della barra zero e fai la tua logica di pulizia della spazzatura.

 
artmedia70:

La vostra funzione è sicura di restituire l'ultimo ordine? O il primo incontrato non è poco redditizio? Perché c'è un controllo sul biglietto?

Io lo farei in questo modo:

Questa è una conversione della vostra funzione per trovare esattamente l'ultimo ordine chiuso.

Ha uno svantaggio: se non ci sono ordini chiusi, restituisce zero. Così, quando lo si usa, non si può sapere con certezza se ci sono ordini chiusi o meno nella storia. Il null restituito non indica affatto l'assenza dell'ordine, ma indica che è stato chiuso a zero.

1. La funzione trova l'ordine con il ticker più grande nella storia, il che significa l'ultimo ordine chiuso (a meno che, naturalmente, non prendiamo qualche caso eccezionale, per il quale la tua variante con il tempo massimo di chiusura è preferibile).

2. Secondo le condizioni , il primo ordine viene aperto con il TP/SL specificato e solo il secondo ordine può essere aperto con il nuovo TP/SL, il che significa che la funzione può restituire zero solo se il primo trade era zero, ma non se non ci sono ordini chiusi nella storia.

Un'ultima cosa. Nella tua variante l'uso di j e di un altro SELECT nella funzione è ridondante.

è sufficiente:

 if (t<OrderCloseTime()) {
         t=OrderCloseTime();
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
  }
   return(Profit);
 
snail09:
All'inizio di Start() inizializzare il buffer con il valore EMPTY_VALUE.


Come è possibile? Ho questo nelle impostazioni della linea dell'indicatore dopo int init()

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,165);                     
   SetIndexBuffer(0,Buffer);
   SetIndexEmptyValue(0,0.0);