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

//+------------------------------------------------------------------+
//| 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);


File:
ala.mq4  3 kb
 
Reshetov >> :

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.

 
mukata >> :


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.

 
Enter писал(а) >>

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...
 

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];
}
}*/
}
//+----------------------------------------------------------------------------+

 
VNG писал(а) >>

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.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1; 
//extern int MTM_Integr_Period = 1000; 

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int MA_Period=3;
extern int MA_Mode=0;

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];
double MA[];
//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexBuffer (0, buf0);
  SetIndexEmptyValue(0, 0);
  SetIndexLabel (0, "i-mtm_integr");
  SetIndexStyle (0, DRAW_LINE);
  SetIndexBuffer (1, MA);
  SetIndexLabel (1, "MA");
  SetIndexStyle (1, DRAW_LINE);

}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
  int LoopBegin, i, j, per=3;
  double mtm, mtmsum;

  if ( NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin= NumberOfBars;
  LoopBegin=MathMin( LoopBegin, Bars-1);

  for ( 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--){
     MA[ i]= iMAOnArray( buf0, 0, MA_Period, 0, MA_Mode, i);
  }
}
//+----------------------------------------------------------------------------+
Forse questa variante andrà bene. Non ho controllato il codice, l'ho scritto nel browser
 
Reshetov >> :

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.

 
Silen >> :

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)

Motivazione: