[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 190

 

Sergey Dubakin ha gentilmente offerto la funzione CloseBy, ma purtroppo non soddisfa la condizione importante per me di chiudere una posizione con una perdita massima con la posizione opposta con un profitto massimo:


avatar
19
Diubakin 25.02.2013 23:26
borilunad:
Uv. pro! Dove posso trovare la funzione СloseBy() che funziona in modalità manuale? Voglio inserirlo nel mio gufo per essere in grado non manualmente, ma automaticamente secondo le condizioni di chiudere la posizione con un massimo meno il contrario con un massimo più. Non sono riuscito a trovarlo nel codebase. Non l'ho trovato in codebay, grazie!

Prova questa variante:

bool LockOFF(int posit, int oppos, color arrow_color) {
double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }

Ho creato delle funzioni che definiscono maxloss GetMaxLoss() e maxprofit GetMaxProfit(), ma non riesco a far sì che LockOFF() selezioni una coppia che ho specificato al posto di una qualsiasi di esse. Per favore, mostratemi in quale posto mettere i miei massimi, e forse ho bisogno di più funzioni per determinare il biglietto o l'indice di quelle posizioni, allora non è un problema per me, ma dove mettere tutto questo in questa LockOFF()? Grazie!

 
borilunad:

Sergey Dubakin ha gentilmente offerto la funzione CloseBy, ma purtroppo non soddisfa una condizione importante per me, cioè chiudere una posizione con una perdita massima con una posizione opposta con un profitto massimo.

Salve, questa funzione chiude una posizione con una perdita massima con la posizione opposta con un profitto massimo. Ecco un test EA per il tester:

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

Apre posizioni di acquisto e vendita alternativamente quando appare una nuova barra di 4 ore e fa una chiusura opposta quando si apre un nuovo giorno.

 
Diubakin:

Ciao, la funzione chiude la posizione con la massima perdita con la posizione opposta con il massimo profitto. Ecco un test EA per il tester:

Apre posizioni di acquisto e vendita alternativamente quando appare una nuova barra di 4 ore e fa una chiusura opposta quando si apre un nuovo giorno.

Ciao Sergey, ho un algoritmo diverso! Il fatto è che questa funzione chiude quello che ha, e io ho bisogno che chiuda il massimo, non nessuno! Beh, niente, lo finirò da solo se nessuno mi aiuta! La tua versione è buona solo per il tester, quindi aggiunta all'intestazione secondo le regole. Funziona bene senza errori, ma non seleziona il massimo! In ogni caso, grazie per il vostro aiuto!
 
alsu:

Ok, ora ho capito. Se il prezzo sulla barra corrente raggiunge Open[0] + 30, allora apriamo. Se la barra è finita, Open[0] è cambiato e il livello di apertura è spostato di conseguenza. Ci dovrebbe essere solo un commercio nel mercato, giusto?

Allora è così:

Non c'è bisogno di tracciare la nuova barra, perché quando si forma, il sistema aggiungerà automaticamente un nuovo valore a Open[0] e questo significa che il nuovo livello sarà calcolato correttamente. Si prega di notare che l'operazione BUY viene aperta al prezzo Ask corrente, mentre viene chiusa (TP e SL) al prezzo Bid. Inoltre, i valori dei prezzi dovrebbero essere normalizzati.


Grazie mille per il vostro aiuto.

Ma apre le transazioni nel tester su ogni candela minuto. Le informazioni sono in questo link http://clip2net.com/s/2T98Y

Voglio che apra un ordine su una candela a cinque minuti, ma non su ogni candela.

Ma solo se l'attuale candela a cinque minuti è > o = 30 pip (dal prezzo aperto al suo massimo).

Cioè, aprire un ordine a mercato sul trentesimo punto dal prezzo di apertura della candela zero=corrente a cinque minuti.

E se l'attuale periodo di cinque minuti dal prezzo aperto al suo massimo è inferiore a 30 punti, non dovremmo aprire un ordine di mercato.

Cioè gli ordini saranno un po', ho contato in Excel, dal 1999 - un po' più di 3000 su euro-dollaro in entrambe le direzioni.

Passiamo al prossimo periodo di cinque minuti e se esso, cioè l'attuale periodo di cinque minuti > o = 30 pips, allora apriamo al trentesimo pips, se meno, passiamo al prossimo periodo di cinque minuti ... e così via fino alla fine del grafico.

Ma il fatto è che, secondo una stima approssimativa, la maggior parte dei pentamini che > o = 30 pip volano oltre i 15 pip più spesso che vengono chiusi da uno stop di 30 pip.

La tua condizione è "nessun ordine aperto".

Ma nel mio sistema, due periodi di cinque minuti con i parametri descritti sopra possono essere formati in una fila e se l'ordine del precedente periodo di cinque minuti non è chiuso, allora nessun ordine sarà aperto nel secondo periodo di cinque minuti.

Ho bisogno che un ordine venga aperto ad ogni periodo di cinque minuti con i parametri descritti sopra, indipendentemente dal fatto che ci siano ordini nel commercio o meno.

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

Ecco, ora ho capito. Se il prezzo sulla barra corrente raggiunge Open[0] + 30, allora apriamo. Se la barra è finita, Open[0] è cambiato e il livello di apertura è spostato di conseguenza. Ci dovrebbe essere solo un commercio nel mercato, giusto?

Allora è così:

Non c'è bisogno di tracciare la nuova barra, perché quando si forma, il sistema aggiungerà automaticamente un nuovo valore a Open[0] e questo significa che il nuovo livello sarà calcolato correttamente. Si prega di notare che l'operazione BUY viene aperta al prezzo Ask corrente, mentre viene chiusa (TP e SL) al prezzo Bid. Inoltre, i valori dei prezzi dovrebbero essere normalizzati.


E hai anche una seconda condizione - se il prezzo di chiusura dei cinque minuti correnti >= prezzo aperto dell'ordine.

Ma nella mia idea il prezzo di chiusura del periodo corrente di 5 minuti può essere qualsiasi prezzo, purché il suo High sia > o = 30 pips.


Close[0]>=Price

 
borilunad:
Ciao Sergei, ho un algoritmo diverso! Questo è il punto, questa funzione chiude quello che ha e voglio che chiuda i massimi, non tutti! Beh, niente, lo finirò da solo se nessuno mi aiuta! La tua versione è buona solo per il tester, quindi aggiunta all'intestazione secondo le regole. Funziona bene senza errori, ma non seleziona il massimo! In ogni caso, grazie per il vostro aiuto!

Come lo vuoi? Quello che ho postato determina la posizione più non redditizia nella valuta di deposito(in denaro), poi determina la posizione opposta più redditizia sempre nella valuta di deposito e fa una contro-chiusura.

borilunad:

Ho implementato delle funzioni che determinano il maxloss GetMaxLoss() e il maxprofit GetMaxProfit() ma non riesco a far sì che la funzione LockOFF() selezioni una coppia specificata da me e non una qualsiasi di esse. Per favore, mostratemi in quale posto mettere i miei massimi, e forse ho bisogno di più funzioni per determinare il biglietto o l'indice di quelle posizioni, allora non è un problema per me, ma dove mettere tutto questo in questa LockOFF()? Grazie!

La funzione ha tutto - definendo la perdita massima, il profitto massimo, il biglietto è anche definito.

 
Diubakin:

Come lo vuoi? Quello che ho postato, determina la posizione più non redditizia nella valuta di deposito (in denaro), poi determina la posizione opposta più redditizia sempre nella valuta di deposito e fa una contro-chiusura.

La funzione ha tutto - definire la perdita massima, il profitto massimo, il biglietto è anche definito.

Ti sbagli! Probabilmente tu hai l'unica coppia di posizioni opposte, mentre io potrei averne di più. Ecco perché metto tutti i dati nei commenti e vedo che non chiude maxiLoss maxiProfit, ma uno qualsiasi dei primi che incontro. E le mie funzioni mostrano chiaramente gli indici di posizione con perdite e profitti massimi. Non resta che aggiungere questi controlli a LockOFF()!
 
borilunad:
Ti sbagli! Probabilmente hai l'unica coppia di posizioni opposte, mentre io potrei averne di più, perché ho visualizzato tutti i dati nei commenti e vedo che si chiude non maxiLoss maxiProfit, ma uno qualsiasi dei primi che vengono fuori nella ricerca. E le mie funzioni mostrano chiaramente gli indici di posizione con perdite e profitti massimi. Devo solo aggiungere questi controlli a LockOFF()!
Avete visto il test EA per questa funzione nel tester? Chiude esattamente la perdita massima con il profitto massimo, non importa quanti ordini ci siano - due o venti.
 
Vinin:

https://www.mql5.com/ru/code/7835 Solo questo è un indicatore. Devi usare gli oggetti in un EA.
È l'Expert Advisor che mi interessa, gli oggetti - devo disegnare io stesso una candela?
 
Diubakin:
Hai guardato il test EA per la funzione nel tester? Chiude esattamente la massima perdita con il massimo profitto, non importa quanti ordini ci siano - due o venti.
Certo, l'ho fatto! È vero, non ne ho più di tre. Ho cercato ovunque, nel tester nei risultati e nel diario, sulla demo e anche sul grafico! Quando lo farò, ve lo mostrerò!