Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 721
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
Salve.
Per favore, aiutatemi.
Segnale quando le linee dell'indicatore sono incrociate sulla prima barra.
La posizione si apre correttamente sulla prima barra se lo shift ma_shiftT = 0 e ma_shiftD = 0. Se lo shift ma_shiftT = -1 e ma_shiftD = 1, la posizione si apre sulla terza o quarta barra.
Cosa devo fare per aprire una posizione se è incrociata sulla prima barra?
input int ma_shiftD=1;
int iTEMAHandle; // хэндл индикатора iTEMA
int iDEMAHandle; // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений для каждого бара
double maVal[]; //
//+------------------------------------------------------------------+
int OnInit()
{
//---
m_symbol.Name(Symbol());
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- освобождаем хэндлы индикаторов
IndicatorRelease(iTEMAHandle);
IndicatorRelease(iDEMAHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//--- массив значений индикатора
ArraySetAsSeries(ma1Val,true);
//--- массив значений индикатора
ArraySetAsSeries(maVal,true);
if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
//====
if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
{
Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
return;
}
if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
{
Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
return;
}
bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
if(Sell_Condition_3 && Sell_Condition_4)
{
// открываю позицию SELL
}
}
Primo: perché copiare 5 valori di indicatori se ne usate solo uno?
Secondo: La posizione delle linee degli indicatori non indica il loro incrocio.
È sufficiente copiare 2 valori, partendo dal primo.
CopyBuffer(iTEMAHandle, 0, 1, 2, ma1Val)
CopyBuffer(iDEMAHandle, 0, 1, 2, maVal)
L'unico modo per determinare se c'è un'intersezione è confrontare la posizione delle linee sulla seconda barra e sulla prima. PER IL COMPITO DA SVOLGERE.
È necessario considerare la direzione dell'indicizzazione dell'array. In questo caso otterremo
Se la condizione è soddisfatta, il fatto dell'intersezione è ovvio. La direzione dell'intersezione può essere determinata da voi stessi.
ps; Oh, giusto... Non ho guardato attentamente la definizione del fatto dell'intersezione. Beh, in ogni caso i valori extra non sono necessari. Sono probabilmente ciò che ti ha fatto sbagliare.
Salve.
Per favore, aiutatemi.
Segnale quando le linee dell'indicatore sono incrociate sulla prima barra.
La posizione si apre correttamente sulla prima barra se lo shift ma_shiftT = 0 e ma_shiftD = 0. Se lo shift ma_shiftT = -1 e ma_shiftD = 1, la posizione si apre sulla terza o quarta barra.
Cosa devo fare per aprire una posizione quando si incrocia sulla prima barra?
input int ma_shiftD=1;
int iTEMAHandle; // хэндл индикатора iTEMA
int iDEMAHandle; // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений для каждого бара
double maVal[]; //
//+------------------------------------------------------------------+
int OnInit()
{
//---
m_symbol.Name(Symbol());
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- освобождаем хэндлы индикаторов
IndicatorRelease(iTEMAHandle);
IndicatorRelease(iDEMAHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//--- массив значений индикатора
ArraySetAsSeries(ma1Val,true);
//--- массив значений индикатора
ArraySetAsSeries(maVal,true);
if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
//====
if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
{
Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
return;
}
if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
{
Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
return;
}
bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
if(Sell_Condition_3 && Sell_Condition_4)
{
// открываю позицию SELL
}
}
Ho allegato un esempio per aiutarvi - in questo esempio non sto copiando più valori, ma uno alla volta. Confrontando ciò che il mio esempio restituisce e ciò che il tuo esempio restituisce, dovresti vedere - come avviene l'indicizzazione negli array nel tuo esempio (cioè dovresti capire dove un elemento della barra 1 è memorizzato nell'array e dove un elemento della barra 2 è memorizzato).
Come lavorare con il mio esempio:
Ho creato e salvato un modello di grafico appositamente per le impostazioni dell'esempio con lo stesso nome dell'esempio - "Two iMA Shift minus shift plus.tpl". Salva questo modello nella cartella \MQL5\Profiles\Templates del tuo terminale. Ora, quando si esegue il tester, il tester prenderà questo modello e si avrà un'immagine così bella nel tester:
Quando rileva un'intersezione, il tester si fermerà alla direttiva
if(ma_one_1<ma_two_1 && ma_one_2>ma_two_2)
{
string text="ma_one_1 = "+DoubleToString(ma_one_1,Digits()+1)+"\n"+
"ma_two_1 = "+DoubleToString(ma_two_1,Digits()+1)+"\n"+
"ma_one_2 = "+DoubleToString(ma_one_2,Digits()+1)+"\n"+
"ma_two_2 = "+DoubleToString(ma_two_2,Digits()+1);
Comment(text);
DebugBreak();
}
e sarete in grado nel tester, usando "Crosshair" di spostarvi sulle barre e vedere i valori degli indicatori sulla barra 1 e sulla barra 2 (pre-includere la "finestra dati").
Ciao!
Ho una domanda sullo spread nel FOREX.
Quando lo spread si allarga, ASK si alza, BID si abbassa o entrambi si muovono simmetricamente in direzioni diverse?
Ciao!
Ho una domanda sullo spread nel FOREX.
Quando lo spread si allarga, ASK sale, BID scende o entrambi si muovono simmetricamente in direzioni diverse?
Può essere tutto quello che vuoi. Una cosa rimane la stessa - lo spread è la differenza tra il prezzo Ask e il prezzo Bid.
Ho capito bene che quando lo spread inizia a ridursi, possono avvicinarsi l'uno all'altro allo stesso tempo?
"Una cosa rimane la stessa - lo spread è la differenza tra il prezzo Ask e il prezzo Bid".
Non ci sono altre leggi.
"Una cosa rimane la stessa - lo spread è la differenza tra il prezzo Ask e il prezzo Bid".
Non ci sono altre leggi.
Cosa ne pensi, se ho un acquisto e lo spread inizia ad allargarsi, l'Ask sale e il Bid scende, dovrei chiudere la posizione o aspettare che l'Ask scenda?
Un acquisto (posizione BUY) viene chiuso al prezzo Bid.
Un'altra cosa che probabilmente vi state chiedendo è "cosa fare in periodi di altissima volatilità? La risposta è che ognuno decide in modo diverso.
Un acquisto (posizione BUY) viene chiuso al prezzo Bid.
Un'altra cosa che probabilmente vi state chiedendo è "cosa fare in periodi di altissima volatilità? La risposta è che ognuno decide in modo diverso.
Un acquisto (posizione BUY) viene chiuso al prezzo Bid.
Un'altra cosa che probabilmente vi state chiedendo è "cosa fare in periodi di altissima volatilità? La risposta è che ognuno decide in modo diverso.