Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 135
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Mettete i prezzi tutti insieme o li prendete e poi li mettete nel calcolo?
Imposta i prezzi in una volta sola, o li ottiene e poi li incolla nel calcolo?
for(int i=1; i<=periodo; i++)
{
H1_Close[i]=Close[k];
k--;
}
Prendo un pezzo di timesession uguale al periodo che parte dall'ultima barra chiusa e lo capovolgo nell'array, perché 1 è la penultima barra in timesession e il calcolo deve partire dall'i-esimo
cioè la mia funzione dovrebbe restituire il valore SMMA dell'ultima barra chiusa.
Il codice qui sotto codifica una semplice idea.
Se l'ultimo ordine chiuso era su SEL
Se l'ultimo ordine chiuso era sulla NEL
Aprire un ordine NEL
if ( OrderType ()==OP_SELL)
X = OrderProfit( );
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))
if ( OrderType ()==OP_BUY)
if(X < 0)
OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );
DOMANDA
Quale costrutto di linguaggio può essere usato per aggiungere altre due condizioni a questo codice (cerchiato in rosso)
Se l'ultimo ordine chiuso è NEL
Se l'ultimo ordine CEL ha chiuso
Se l'ultimo ordine chiuso ha chiuso sulla NEL
Se l'ultimo ordine chiuso è stato chiuso su unSL
Grazie per il vostro aiuto.
Vi sarei molto grato se poteste scrivere il codice e non solo spiegare cosa deve essere fatto.
Salve. Sto scrivendo uno script per cancellare tutti gli ordini pendenti. Tuttavia, cancella solo un ordine. Ho sempre due ordini in sospeso o uno solo. In entrambi i casi cancella solo un Buy Stop. Per eliminare il Sell Stop è necessario eseguire nuovamente lo script, a condizione che non ci siano altri ordini Buy Stop. Si prega di avvisare dove si trova l'errore.
cambiare la direzione della ricerca for(i=totale-1;i>=0;i--)
Grazie, ora funziona. Ho capito bene che quando un ordine con indice 0 viene cancellato, un ordine con indice 1 viene assegnato all'indice 0, e alla prossima iterazione i == 1, e non appare nessun ordine del genere. Puoi dire se questo è il caso?
C'è una funzione frattale personalizzabile, beh, cavolo, è terribilmente pesante. Ho lasciato il disegno degli oggetti solo per mostrare visivamente se i frattali si stanno formando correttamente - non ci sarà.
Domanda: come possiamo renderlo più facile, perché il test visivo è stupido:
extern int FrRight=5; // Баров справа
//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow = Low [nFrDn]; // Цена нижнего фрактала
SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);
// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}
//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);
for(pos=nRight+1; pos<bars; pos++) {
r=nRight;
if(mode==MODE_UPPER) {
CopyHigh(symb,tf,0,pos+equals+1,_high);
for(i=1; i<=r; i++) {
if(_high[pos]<=_high[pos-i]) break;
}}
if(mode==MODE_LOWER) {
CopyLow(symb,tf,0,pos+equals+1,_low);
for(i=1; i<=r; i++) {
if(_low[pos]>=_low[pos-i]) break;
}}
//--
if(i==r+1) {
l=nLeft;
e=equals;
for(int j=1; j<=l+equals; j++) {
if(mode==MODE_UPPER) {
if(_high[pos]<_high[pos+j]) break;
if(_high[pos]>_high[pos+j]) l--;
if(_high[pos]==_high[pos+j]) e--;
}
if(mode==MODE_LOWER) {
if(_low[pos]>_low[pos+j]) break;
if(_low[pos]<_low[pos+j]) l--;
if(_low[pos]==_low[pos+j]) e--;
}
if(l==0) {
cn++;
if(cn>numFr) return(pos);
}
//--
if(e<0) break;
}}
}
Print(__FUNCTION__": Фрактал не найден");
return(0);
}
//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
}
}
Grazie!
C'è una funzione frattale personalizzabile, beh, cavolo, è terribilmente pesante. Ho lasciato il disegno degli oggetti solo per mostrare visivamente se i frattali si stanno formando correttamente - non succederà.
Domanda: come posso renderlo più facile, perché è stupido testarlo visivamente:
Grazie!
Salve. Potrebbe consigliare un nuovo arrivato?
Ecco un esempio:
se(Condizione1)
se(Condizione2)
{
}
else
{
}
Secondo il codice, Else dovrebbe riferirsi a if(condition1) e sarà eseguito se la condizione1 non è soddisfatta
Ma in realtà sarà eseguito anche se la condizione2 non è soddisfatta.
Salve. Potrebbe consigliare un nuovo arrivato?
Ecco un esempio:
se(Condizione1)
se(Condizione2)
{
}
else
{
}
Secondo il codice, Else dovrebbe riferirsi a if(condition1) e sarà eseguito se la condizione1 non è soddisfatta
Ma in realtà sarà eseguito se la condizione2 non è soddisfatta.
Prendi l'abitudine di mettere subito le bretelle ricce con la condizione
se(Condizione)
{
}
A secondo la sua domanda
{
if(Условие2)
{
}
}
else
{
}