Questions des débutants MQL5 MT5 MetaTrader 5 - page 721

 
sile:

Bonjour.

Aidez-moi, s'il vous plaît.

Signal lorsque les lignes de l'indicateur sont croisées sur la première barre.

La position s'ouvre correctement sur la première barre si le décalage ma_shiftT = 0 et ma_shiftD = 0. Si le décalage ma_shiftT = -1 et ma_shiftD = 1, la position s'ouvre sur la troisième ou la quatrième barre.

Que dois-je faire pour ouvrir une position si elle est croisée sur la première barre ?


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

Premièrement : pourquoi copier 5 valeurs d'indicateur si vous n'en utilisez qu'une seule ?

Deuxièmement : La position des lignes indicatrices n'indique pas leur croisement.

Il suffit de copier 2 valeurs, en commençant par la première.

CopyBuffer(iTEMAHandle, 0, 1, 2, ma1Val)

CopyBuffer(iDEMAHandle, 0, 1, 2, maVal)

La seule façon de déterminer s'il y a une intersection est de comparer la position des lignes sur la deuxième barre et sur la première. POUR LA TÂCHE À ACCOMPLIR.

Il est nécessaire de considérer la direction de l'indexation des tableaux. Dans ce cas, nous obtiendrons

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

Si la condition est remplie, le fait de l'intersection est évident. La direction de l'intersection peut être déterminée par vous-même.


ps ; Oh, c'est vrai... Je n'ai pas regardé attentivement la définition du fait d'intersection. En tout cas, les valeurs supplémentaires ne sont pas nécessaires. C'est probablement ce qui vous a déconcerté.

 
sile:

Bonjour.

Aidez-moi, s'il vous plaît.

Signal lorsque les lignes de l'indicateur sont croisées sur la première barre.

La position s'ouvre correctement sur la première barre si le décalage ma_shiftT = 0 et ma_shiftD = 0. Si le décalage ma_shiftT = -1 et ma_shiftD = 1, la position s'ouvre sur la troisième ou la quatrième barre.

Que dois-je faire pour ouvrir une position lorsqu'il croise sur la première barre ?


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

J'ai joint un exemple pour vous aider. Dans cet exemple, je ne copie pas plusieurs valeurs, mais une seule à la fois. En comparant ce que mon exemple renvoie et ce que votre exemple renvoie, vous devriez voir - comment l'indexation se produit dans les tableaux de votre exemple (c'est-à-dire que vous devriez comprendre où un élément de la barre 1 est stocké dans le tableau et où un élément de la barre 2 est stocké).

Comment travailler avec mon exemple :

J'ai créé et enregistré un modèle de graphique spécifiquement pour les paramètres de l'exemple avec le même nom que l'exemple - "Two iMA Shift minus shift plus.tpl". Enregistrez ce modèle dans le dossier \MQL5\Profiles\Templates de votre terminal. Maintenant, lorsque vous exécutez le testeur, le testeur prendra ce modèle et vous aurez une belle image dans le testeur :

Sans titre

Lorsqu'il détecte une intersection, le testeur s'arrête à la directive

//---
   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();
     }

et vous pourrez dans le testeur, en utilisant "Crosshair", vous déplacer sur les barres et voir les valeurs des indicateurs sur la barre 1 et la barre 2 (pré-inclure la "fenêtre de données").

 

Bonjour !

J'ai une question sur le spread du FOREX.

Lorsque l'écart se creuse, est-ce que le ASK augmente et le BID diminue ou est-ce que les deux bougent symétriquement dans des directions différentes ?

 
Sergey Zhukov:

Bonjour !

J'ai une question sur le spread du FOREX.

Lorsque l'écart se creuse, est-ce que ASK augmente, BID diminue ou est-ce que les deux bougent symétriquement dans des directions différentes ?

Cela peut être l'un ou l'autre. Une chose demeure inchangée : le spread est la différence entre le cours vendeur et le cours acheteur.
 
Vladimir Karputov:
Cela peut être tout ce que vous voulez. Une chose demeure inchangée : le spread est la différence entre le cours vendeur et le cours acheteur.
Ai-je bien compris que lorsque l'écart commence à se réduire, ils peuvent se rapprocher l'un de l'autre en même temps ?
 
Sergey Zhukov:
Ai-je bien compris que lorsque l'écart commence à se réduire, ils peuvent se rapprocher l'un de l'autre en même temps ?

"Une chose reste la même : le spread est la différence entre le prix Ask et le prix Bid".

Il n'y a pas d'autres lois.

 
Vladimir Karputov:

"Une chose reste la même : le spread est la différence entre le prix Ask et le prix Bid".

Il n'y a pas d'autres lois.

Que pensez-vous, si disons que j'ai un achat et que l'écart commence à s'élargir, l'Ask monte et l'Bid descend, dois-je fermer la position ou attendre que l'Ask descende ?
 
Sergey Zhukov:
Que pensez-vous, si j'ai un achat et que le spread commence à s'élargir, Ask monte et Bid descend, dois-je fermer la position ou attendre que Ask descende ?

Un achat (position BUY) est fermé au prix de l'offre.

Une autre question que vous vous posez probablement est "que faire en période de très forte volatilité ?". La réponse est que chacun décide différemment.

 
Vladimir Karputov:

Un achat (position BUY) est fermé au prix de l'offre.

Une autre question que vous vous posez probablement est "que faire en période de très forte volatilité ?". La réponse est que chacun décide différemment.

Oui, c'est bien ça, c'est l'ultra-haute volatilité que je voulais dire, je vais essayer de chercher sur le forum, merci.
 
Vladimir Karputov:

Un achat (position BUY) est fermé au prix de l'offre.

Une autre question que vous vous posez probablement est "que faire en période de très forte volatilité ?". La réponse est que chacun décide différemment.

Ouais, eh bien... Où trouver un tel courtier... Pouvez-vous me donner un lien ?