Quindi, se tutto va bene, la forma finale della funzione.
double ATR_Max() {
int i;
double m;
datetime tim;
iATR_H1_PER = 15;// периодif ( tim != Time[0] ) {
while( i < WindowBarsPerChart() ) {
double a = iATR( NULL, 0, iATR_H1_PER, i );
if ( m < a ) {
m = a;
}
i++;
tim = Time[0];
}
}
Alert( " Максимальное значение ATR для видимого количества баров равно - ", m );
return(m);
}
Boeing747 : Penso che tim = Time[0] sarebbe meglio posizionato dopo il ciclo ...perché chiedere Time[0] è fatto su tutte le barre visibili - non è razionale.
Grazie per la correzione. Il numero di errori cresce esponenzialmente a notte))))
Buon pomeriggio. Sapete se è possibile cambiare i parametri dell'indicatore al volo in mql4? L'idea è semplice: l'indicatore ZigZag è installato sul grafico. Lo script dovrebbe essere scritto e il tasto di scelta rapida dovrebbe essere collegato ad esso. Premendolo, i parametri dello zigzag saranno cambiati sul grafico.
Così, la funzione controlla i valori delle due barre precedenti e se sono troppo grandi, restituisce TRUE. La questione è come migliorarla piacevolmente: fare in modo che questa funzione cerchi grandi candele su più candele. Per esempio 24.
satorifx : Buon pomeriggio. Sapete se è possibile cambiare i parametri dell'indicatore al volo in mql4? L'idea è semplice: l'indicatore ZigZag è installato sul grafico. Lo script dovrebbe essere scritto e il tasto di scelta rapida dovrebbe essere collegato ad esso. Appena lo premo, i parametri di ZigZag cambieranno sul grafico.
Ho fatto un Expert Advisor fatto in casa per testare il trading, ma non riesco a capire una cosa...
Bay/sell è aperto usando le MA massime e minime
// Condizione per aprire la posizione BUY if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)
// Condizione per aprire una posizione SELL if(MA_H1>MA_H0&&Bid>=MA_H0&MA_0<MA_1&HA_up<HA_dw)
#include <b-Lots.mqh>externdouble TrailingStop = 30;
externdouble Sploss = 15;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start() {
double HA_up,HA_dw;
double MA_H0,MA_H1,MA_L0,MA_L1,MA_0,MA_1;
int i, cnt, ticket, total;
bool flag=true;
if(Bars<100) {
Print("bars less than 100");
return(0);
}
// Проверяем стоит ли открываться
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
flag=false;
break;
}
}
cnt=OrdersTotal()-1;
for(i=cnt;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
flag=false;
break;
}
}
if(!flag) return(0);
//-----------------------------------------------
MA_H0=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,0);
MA_H1=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,1);
MA_0=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,0);
MA_1=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,1);
MA_L0=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,0);
MA_L1=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,1);
HA_up=iCustom(0,0,"Heiken Ashi",3,0);
HA_dw=iCustom(0,0,"Heiken Ashi",2,0);
//задали все данные
total=OrdersTotal();
if(total<1)
{
// Проверка свободной маржиif(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Условие открытие позиции BUYif(MA_L1<MA_L0&&Ask<=MA_L0&&MA_0>MA_1&&HA_up>HA_dw)
{
Lots=GetSizeLot();
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Bid-Sploss*Point,0,"",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
elsePrint("Error opening BUY order : ",GetLastError());
return(0);
}
// Условие открытие позиции SELLif(MA_H1>MA_H0&&Bid>=MA_H0&&MA_0<MA_1&&HA_up<HA_dw)
{
Lots=GetSizeLot();
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Ask+Sploss*Point,0,"",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
elsePrint("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // длинная позиция открыта
{
if(NormalizeDouble (MathAbs(MA_H0-Bid),Digits)<Point)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
// трейлинг-стоп для длинной позицииif(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else
{
if(NormalizeDouble (MathAbs(MA_L0-Ask),Digits)<Point)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
// трейлинг-стоп для короткой позицииif(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
Domanda: se la posizione sulla candela corrente non è chiusa (le condizioni non sono arrivate), come chiuderla sulla prossima candela, quando corrisponde a MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );
Abbiamo una condizione di chiusura: attraversare il massimo o il minimo della candela corrente, ma abbiamo bisogno che la posizione si chiuda sulla prossima candela dopo essere stata aperta.
Possiamo scrivere se ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), ma come soddisfare la condizione della seconda candela aperta.
Se puoi rispondere con del codice, l'esempio è più chiaro.
Grazie per la risposta incredibilmente dettagliata.
Bisogna davvero essere dei sapientoni per capire che se una nuova persona arriva sul forum con una domanda, ha bisogno di una soluzione specifica o di un link a qualcosa di simile, non di una stupida scusa che "tutto è possibile"?
Grazie per la risposta incredibilmente dettagliata.
Bisogna davvero essere dei sapientoni per capire che se una nuova persona arriva sul forum con una domanda, ha bisogno di una soluzione specifica o di un link a qualcosa di simile, non di una stupida scusa che "tutto è possibile"?
Le persone che cercano di fare qualcosa da sole vengono aiutate qui. Ti guidano nella giusta direzione, ti spiegano, ecc...
Hai fatto una domanda e hai avuto una risposta. Hai provato a iniziare a scrivere qualcosa da solo?
Quando fai una domanda in un certo formato, pensa prima a che tipo di risposta otterrai al formato della domanda...
Quindi, se tutto va bene, la forma finale della funzione.
Quindi, se tutto va bene, la forma finale della funzione.
Quindi, se tutto va bene, la forma finale della funzione.
Penso che tim = Time[0] sarebbe meglio posizionato dopo il ciclo ...perché chiedere Time[0] è fatto su tutte le barre visibili - non è razionale.
Grazie per la correzione. Il numero di errori cresce esponenzialmente a notte))))
L'idea è semplice: l'indicatore ZigZag è installato sul grafico. Lo script dovrebbe essere scritto e il tasto di scelta rapida dovrebbe essere collegato ad esso. Premendolo, i parametri dello zigzag saranno cambiati sul grafico.
Continuando l'argomento attuale di trovare un filtro ad alta volatilità. Ecco il codice di un filtro esistente di WSR
int init()
Ecco la funzione stessa:
Così, la funzione controlla i valori delle due barre precedenti e se sono troppo grandi, restituisce TRUE. La questione è come migliorarla piacevolmente: fare in modo che questa funzione cerchi grandi candele su più candele. Per esempio 24.
Buon pomeriggio. Sapete se è possibile cambiare i parametri dell'indicatore al volo in mql4?
L'idea è semplice: l'indicatore ZigZag è installato sul grafico. Lo script dovrebbe essere scritto e il tasto di scelta rapida dovrebbe essere collegato ad esso. Appena lo premo, i parametri di ZigZag cambieranno sul grafico.
Ho fatto un Expert Advisor fatto in casa per testare il trading, ma non riesco a capire una cosa...
Domanda: se la posizione sulla candela corrente non è chiusa (le condizioni non sono arrivate), come chiuderla sulla prossima candela, quando corrisponde a MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );Bay/sell è aperto usando le MA massime e minime
// Condizione per aprire la posizione BUY
if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)
// Condizione per aprire una posizione SELL
if(MA_H1>MA_H0&&Bid>=MA_H0&MA_0<MA_1&HA_up<HA_dw)
Abbiamo una condizione di chiusura: attraversare il massimo o il minimo della candela corrente, ma abbiamo bisogno che la posizione si chiuda sulla prossima candela dopo essere stata aperta.
Possiamo scrivere se ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), ma come soddisfare la condizione della seconda candela aperta.
Se puoi rispondere con del codice, l'esempio è più chiaro.
Esiste una tale possibilità.
Grazie per la risposta incredibilmente dettagliata.
Bisogna davvero essere dei sapientoni per capire che se una nuova persona arriva sul forum con una domanda, ha bisogno di una soluzione specifica o di un link a qualcosa di simile, non di una stupida scusa che "tutto è possibile"?
Grazie per la risposta incredibilmente dettagliata.
Bisogna davvero essere dei sapientoni per capire che se una nuova persona arriva sul forum con una domanda, ha bisogno di una soluzione specifica o di un link a qualcosa di simile, non di una stupida scusa che "tutto è possibile"?
Le persone che cercano di fare qualcosa da sole vengono aiutate qui. Ti guidano nella giusta direzione, ti spiegano, ecc...
Hai fatto una domanda e hai avuto una risposta. Hai provato a iniziare a scrivere qualcosa da solo?
Quando fai una domanda in un certo formato, pensa prima a che tipo di risposta otterrai al formato della domanda...