Domanda per gli intenditori - pagina 12

 
rid писал(а) >>

Non sono un esperto in materia.

Ma il presupposto è che se dopo il 1° segnale si "appende" la bandiera, allora la si lascia appesa.

Anche se il 1° segnale è già esaurito!

Poi il 2° segnale darà un segnale di apertura senza problemi.

Se ho capito bene la domanda...

Ma la bandiera è una variabile, come ho capito, e con un nuovo tick il programma vedrà il valore iniziale o appena calcolato della bandiera. Forse ho capito male cos'è una bandiera?

 
MQLBankir >> :

Ma una bandiera è una variabile, come ho capito, e con un nuovo tick il programma vedrà il valore iniziale o calcolato della bandiera dai nuovi dati. Forse ho capito male cos'è una bandiera?

Un flag è una costante booleana che ha un valore vero o falso, con una rappresentazione numerica di 1 o 0 rispettivamente.

Se il segnale della condizione 1 (come l'attraversamento di 2 ruote) allora il flag è impostato su true, se l'attraversamento non è ancora avvenuto il flag rimarrà falso! Per il tuo compito... sarebbe qualcosa di simile a questo:

bool signal1=true;

int start()

if (signal1==false) {return();}

signal1 ......... tra la get signal

if (signal1 ==true) //il primo segnale appare

{

signal2 .............. tra la ricezione del segnale

signal1=falso;

}

qualcosa del genere dovrebbe accadere )))

oh, mentre scrivevo, era già definito sotto)

 
MQLBankir >> :

Ma una bandiera è una variabile, come ho capito, e con un nuovo tick il programma vedrà il valore iniziale o calcolato della bandiera dai nuovi dati. Forse ho capito male cos'è una bandiera?

Posso aggiungere che le variabili dichiarate globalmente salvano i loro valori.

>> finché non vengono cambiati forzatamente o il programma viene chiuso.

 

La protezione della bandiera è fatta come segue:

int flag;
int start()
{
 // функция принятия решения и установки флага
 if( flag==1)
  { flag=0;
   // код защищенный от запуска флагом   
  } 
return(0);
}
A proposito
// функция принятия решения и установки флага

può essere ovunque, a seconda dell'idea dell'autore, la sequenza delle azioni cambia.

 
Urain писал(а) >>

La protezione della bandiera è fatta come segue:

a proposito

può essere ovunque, a seconda dell'idea dell'autore, e cambia la sequenza delle azioni.

>>Grazie a tutti, sembra aver capito tutto))

 

Buona sera. I problemi sono scesi da qualche parte.

Un consigliere con una martingala.

10 passi. Ad ogni passo la posizione ha un mago diverso.

All'inizio tutto funzionava bene. Per diversi giorni.

Tuttavia, all'improvviso non ha funzionato affatto!

La primissima posizione si apre e subito, sulla barra successiva, si chiude!

Non è chiaro perché.


E va avanti così. Apre e chiude.

È iniziato solo oggi. All'improvviso!

Ecco il blocco di chiusura:

 //жжжжжжжжжжжж  Закрытие позиций жжжжжжжжжжжжжжжжжжжжжжж
 //(используются ф-и И.Кима
if ( NumberOfPositions(NULL,OP_BUY, -1)>0) {//если есть открытые позиции
// если цена открытия первой позиции меньше текущей цены на тейкпрофит - закрываем её 
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic  )+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic  )>0)  ClosePositions(NULL, OP_BUY, Magic );

// если цена открытия второй  позиции меньше текущей цены на тейкпрофит - закрываем её 
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_2)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_2)>0) ClosePositions(NULL, OP_BUY, Magic_2);

 // если цена открытия след.  позиции меньше текущей цены на тейкпрофит - закрываем всё открытые позиции  
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_3)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_3)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_4)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_4)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);    
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_5)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_5)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);   
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_6)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_6)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);    
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_7)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_7)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);   
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_8)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_8)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);    
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_9)+ TakeProfit_Buy*Point)<=Bid  && PriceOpenLastPos(NULL, OP_BUY, Magic_9)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);
if ( ( PriceOpenLastPos(NULL, OP_BUY, Magic_10)+ TakeProfit_Buy*Point)<=Bid&& PriceOpenLastPos(NULL, OP_BUY, Magic_10)>0) ClosePosFirstProfit(NULL, OP_BUY, -1);  

 } 

Forse qualcuno vedrà l'imprecisione o l'errore? (per prezzi delle posizioni aperte)

 

rid писал(а) >>

Non è chiaro perché.

Qualcuno vedrà improvvisamente un'imprecisione o un errore?

Il problema probabilmente non è con questo codice, ma con l'apertura delle posizioni o il calcolo di TakeProfit_Buy. È più probabile che sia la seconda.

Se suona nel tester, Print dovrebbe aiutare.

 

Non calcolo TakeProfit_Buy - lo imposto solo nei parametri esterni.

extern int       TakeProfit_Buy=21;

Nel tester - la stessa merda, ma in alcuni punti. All'inizio, tutto è normale.

E poi appare questa merda. E non sempre.

Dovrò inserire un commento o una stampa...

Inoltre. Non ho mai provato ad usare questo tipo di magia quando ero un novellino, ma non l'ho mai dimenticato.

 

Credo di essermi sbagliato. E, naturalmente, non è affatto dove stavo cercando inizialmente.

Oltre alla chiusura di cui sopra, ho anche questo:

//----------------------- Закрытие позиций по текй профиту ----------------------------------

if ( NumberOfPositions(NULL,OP_BUY, -1)>0) {// если есть открытые позиции
// если очередная  позиция закрылась по тейкпрофиту , то закрываем
// все остальные позиции  
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_3 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_4 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}    
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_5 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}   
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_6 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}    
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_7 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}   
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_8 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}    
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_9 ))  { ClosePosFirstProfit(NULL, OP_BUY, -1);}
if ( isCloseLastPosByTake(NULL, OP_BUY, Magic_10))  { ClosePosFirstProfit(NULL, OP_BUY, -1);} 
                                           }

Si scopre che il flag della funzione
isCloseLastPosByTake( )//если поза закрылась по тейку - возвращает единицу
dopo la sua esecuzione è uguale a 1, ma dopo che tutte le altre posizioni sono state chiuse è ancora uguale a 1! E naturalmente, quando la prossima prima posizione con numero magico = numero magico è aperta - è immediatamente chiusa!

Non è chiaro perché questo errore non si è presentato per due giorni?

//--------------------------------------------------------------

Anche. Potete consigliarmi, - Come posso far funzionare correttamente questo blocco dopo tutto?

In altre parole, come resettare la funzione isCloseLastPosByTake() dopo aver chiuso tutte le posizioni?

 
rid >> :

In altre parole, come faccio a resettare la funzione isCloseLastPosByTake() dopo che tutte le posizioni sono state chiuse?

Per quanto ho capito, il tempo di apertura di una posizione chiusa in profitto dovrebbe essere più lungo di quello dei piccoli ordini rimanenti, aggiungete questa condizione e tutto sarà a posto.

Motivazione: