Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 721

 
sile:

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_shiftT=-1;
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

if(maVal[0] <= ma1Val[0] && maVal[1] > ma1Val[1])

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.

 
sile:

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_shiftT=-1;
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:

Senza titolo

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?

 
Sergey Zhukov:

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 in entrambi i casi. Una cosa rimane la stessa - lo spread è la differenza tra il prezzo Ask e il prezzo Bid.
 
Vladimir Karputov:
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 restringersi, possono avvicinarsi l'uno all'altro allo stesso tempo?
 
Sergey Zhukov:
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.

 
Vladimir Karputov:

"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 diciamo che 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?
 
Sergey Zhukov:
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.

 
Vladimir Karputov:

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.

Sì, è vero, è la volatilità ultra-alta che intendevo, proverò a cercare nel forum, grazie.
 
Vladimir Karputov:

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.

Sì, beh... Dove trovare un tale broker... Puoi darmi un link?
Motivazione: