[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 347
Per favore aiutatemi a migliorare questo codice per ottenere un semplice Expert Advisor. L'essenza è semplice: apriamo 2 posizioni Sell e Bui con stop specificati al prezzo corrente. Poi, quando uno o entrambi scattano, apriamo nuove posizioni. L'essenza sembra semplice ma ancora non funziona Grazie mille!
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ extern double lots=0.01; extern int SL_in_pips; extern int TP_in_pips; int x2; int init() { if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0) { SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt."); } if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0) { TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt."); } x2=1; while(x2!=0) { if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1) { Alert("Ордер типа BUY успешно открыт"); OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0); x2=GetLastError(); if(x2==0) Alert("Ордер типа SELL успешно открыт"); if(x2!=0) Alert("Ордер типа SELL не открыт. Ошибка №: ",x2); }else { x2=GetLastError(); if(x2!=0) Alert("Ордер типа BUY не открыт. Ошибка №: ",x2); } } //---- return(0);
Ma non è ancora chiaro come sia possibile, sembra essere una semplice divisione. E se si divide 0,5 o 0,9 o anche 0,31 per 0,1, va bene.
e qui è 2,9, non è chiaro... la calcolatrice è più precisa :-)
Le calcolatrici hanno funzioni di arrotondamento integrate. E risolvono allo stesso modo perché usano lo stesso coprocessore matematico per calcolare i numeri in virgola mobile.
Per favore aiutatemi a migliorare questo codice per ottenere un semplice Expert Advisor. L'essenza è semplice: apriamo 2 posizioni Sell e Bui con stop specificati al prezzo corrente. Poi, quando uno o entrambi scattano, apriamo nuove posizioni. L'essenza sembra semplice ma ancora non funziona Grazie mille!
Beh, per il lavoro di un esperto, la "carne" del consulente dovrebbe essere messa nella funzione di avvio lo stesso...
Per favore aiutatemi a migliorare questo codice per ottenere un semplice Expert Advisor. L'essenza è semplice: apriamo 2 posizioni Sell e Bui con stop specificati al prezzo corrente. Poi, quando uno o entrambi scattano, apriamo nuove posizioni. L'essenza sembra semplice ma ancora non funziona Grazie mille!
//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);
Questo solo sembra essere esattamente giusto, ma nella vista della macchina l'ultimo bit può assumere valori diversi. Cioè 2,9999, 3 o 3,00000001
Per sbarazzarsi di questi malintesi c'è la funzione NormalizeDouble() in MQL.
Sì, NormalizeDouble() aiuta, grazie.
Ma non è ancora chiaro come questo sia possibile, sembra essere una semplice divisione, e se si divide 0,5 o 0,9 o anche 0,31 per 0,1, tutto va bene.
e qui ha chiaramente 2,9, non è chiaro... la calcolatrice è più precisa :-)
Grazie a Reshetov e splxgf per il loro aiuto.
Ma non è ancora chiaro come sia possibile, sembra essere una semplice divisione. E se si divide 0,5 o 0,9 o anche 0,31 per 0,1, va bene.
e qui è 2,9, non è chiaro... la calcolatrice è più precisa :-)
Le calcolatrici hanno funzioni di arrotondamento integrate. E risolvono allo stesso modo perché usano lo stesso coprocessore matematico per calcolare i numeri in virgola mobile.
Ciao!
Per favore, potete darmi un indizio!!!
Non capisco come farlo da solo.
Compito:
EA mette 1-2 ordini una volta al giorno.
Il valore iniziale della variabile è impostato manualmente e può assumere un valore da 1 a 10.
Dovete cambiare la variabile precedentemente impostata con incrementi di 1 ad un valore di - 10
in ogni giorno lavorativo dell'EA, solo di 1, se in quel giorno il TP non viene eseguito.
Quando TP viene eseguito, la variabile restituisce il valore - 1.
Contare SL non è adatto, perché può essere uno o due, e il valore può essere cambiato solo una volta al giorno.
Cioè
Variabile = 1
Giorno 1 SL - variabile =2
Giorno 2 SL - variabile =3
Giorno 3 SL - variabile =4
Giorno 4 TP - variabile =1
Giorno 5 SL - variabile =2
... E così via.
Aiuto!
Grazie.
Per favore aiutatemi a migliorare questo codice per ottenere un semplice Expert Advisor. L'essenza è semplice: apriamo 2 posizioni Sell e Bui con stop specificati al prezzo corrente. Poi, quando uno o entrambi scattano, apriamo nuove posizioni. L'essenza sembra semplice ma ancora non funziona Grazie mille!
Conoscitori, per favore aiutatemi.
C'è un codice che calcola il momentum di un singolo periodo e lo integra con un grande periodo, poi lo emette come indicatore.
Ho bisogno di scrivere un indicatore con un dato periodo che trovi la media della curva risultante e la emetta come indicatore.
Il codice è allegato:
#proprietà indicator_separate_window
#proprietà indicator_buffers 1
#property indicator_color1 DodgerBlue
#proprietà indicator_width1 2
//------- Parametri dell'indicatore esterno ----------------------------------------+
extern int MTM_Period = 1;
//extern int MTM_Integr_Period = 1000;
//extern int Applied_Price = 0; // Prezzo usato:
// 0 - PREZZO_CHIUSO
// 1 - PREZZO_APERTO
// 2 - PREZZO_ALTO
// 3 - PREZZO_BASSO
// 4 - PREZZO_MEDIO
// 5 - PREZZO_TIPICO
// 6 - PREZZO_PONDERATO
extern NumberOfBars = 1000; // Numero di barre (0-tutti)
//------- Buffer indicatori ---------------------------------------------------+
doppio buf0[];
//+----------------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore personalizzato
//+----------------------------------------------------------------------------+
void init() {
SetIndexBuffer (0, buf0);
SetIndexEmptyValue(0, 0);
SetIndexLabel (0, "i-mtm_integr");
SetIndexStyle (0, DRAW_LINE);
}
//+----------------------------------------------------------------------------+
//| funzione di deinizializzazione dell'indicatore personalizzata
//+----------------------------------------------------------------------------+
void deinit() {
Commento(");
}
//+----------------------------------------------------------------------------+
//| funzione di iterazione dell'indicatore personalizzata
//+----------------------------------------------------------------------------+
void start() {
int LoopBegin, i,j, per=3;
doppio mtm, mtmsum;
if (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=NumberOfBars;
LoopBegin=MathMin(LoopBegin, Bars-1);
per (i=LoopBegin; i>=0; i--) {
mtm=Close[i]-Close[MTM_Period+i];
mtmsum=mtmsum+mtm;
buf0[i]=mtmsum;
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Close[i]-Close[MTM_Period+i];
mtmsum[i]=0+mtm;
per (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per;
buf0[i]=mtmsum[i];
}
}*/
}
//+----------------------------------------------------------------------------+
Conoscitori, per favore aiutatemi.
C'è un codice che calcola il momentum di un singolo periodo e lo integra con un grande periodo, poi lo emette come indicatore.
Ho bisogno di scrivere un indicatore con un dato periodo che trovi la media della curva risultante e la emetta come indicatore.
Questo solo sembra essere esattamente giusto, ma nella vista della macchina l'ultimo bit può assumere valori diversi. Cioè 2,9999, 3 o 3,00000001
Per sbarazzarsi di questi malintesi, MQL ha la funzione NormalizeDouble()
Perché la funzione NormalizeDouble() non viene eseguita di default per tutti i valori di Ask, Bid, Low, ecc.
Tutti ci sono cascati e poi devono ripararlo "manualmente"... Strano che MT non possa leggere ciò che ha generato.
Grazie, c'è qualche garanzia che i dati saranno disponibili in start()?
si può provare a usare RefreshRates() - vedere gli esempi nella guida standard di MetaEditor
C'è un'opzione "Salva come rapporto" nell'ottimizzazione EA, ma i "Parametri di ingresso" non sono mostrati in Internet Explorer,
anche se, a giudicare dal codice html, sono presenti lì. In generale, è per questi parametri che è stata avviata l'ottimizzazione.
Forse qualcuno sa come vederli in Explorer?
(C'è anche la possibilità di copiarli in un file di testo con un comando separato, ma è preferibile vederli in IE)