[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 131

 

Bonjour.J'ai écrit un indicateur basé sur l'indicateur, l'indicateur original Signal-Signal montre ses valeurs sur toutes les barres précédentes quand il est attaché au graphique (il est appliqué à toutes les barres, à partir de la barre [1]), mais l'indicateur créé à partir de lui (il est appliqué à la barre [0]) montre ses valeurs seulement quand il est attaché au graphique, ses valeurs sont correctes mais sur les barres précédentes "vide", s'il vous plaît dites-moi comment le réparer.

Mon code :

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Victor, je pense que tu devrais mettre une pause sur Asc + distance, et dans la condition spécifier le ratio d'Asc et de Mashka, alors ce sera ce que tu veux. Essayez-le !

 
hoz:


Vous pouvez voir sur le graphique que le prix n'est pas au-dessus de fastMa (le bracelet rouge), mais carrément en dessous. Mais dans le code, la condition est explicitement indiquée que la pause doit être au prix :

Quel est le piège, professionnels ? Je ne sais plus quoi faire...

Peut-être qu'au moment où l'ordre a été passé, la MA était plus basse que ce qui est maintenant dessiné. Essayez de prendre les valeurs MAA non pas à partir de la 0ème mesure mais à partir de la 1ère.
 
borilunad:

Victor, je pense que tu devrais mettre une pause sur Asc + distance, et dans la condition spécifier le ratio d'Asc et de Mashka, alors ce sera ce que tu veux. Essayez-le !


Boris, c'est ce que j'ai fait :

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

Et voici l'ouverture du poste :

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Tout semble être correct. Mais il est toujours là.

Sepulca:
Peut-être qu'au moment où la commande a été passée, le MAHA était inférieur à celui qui est maintenant tiré. Essayez de prendre les valeurs MA de la 1ère barre au lieu de la 0ème.


Je l'ai essayé, aucune différence. Je l'ai remis... Ce qui m'importe, c'est ce qui se passe en ce moment, pas ce qui s'est passé avant.

Voici une capture d'écran (si la valeur reçue de la machine n'est pas 0, mais 1) :

Où est la logique ?

 

Victor, c'est pour cela que j'écris les conditions au début, pour tout voir, pour qu'il soit plus facile de trouver les erreurs de logique, surtout quand il n'y a pas encore assez de connaissances et d'expérience, ce dont je ferai partie pendant longtemps encore. Les professionnels manipulent facilement les fonctions, les fichiers et les bibliothèques, et ont probablement oublié comment ils ont progressivement maîtrisé toute cette sagesse. Mais nous ne pouvons pas apprendre la théorie sans la pratique, et beaucoup plus dépend du caractère de chaque personne.

 
hoz:


Boris, c'est ce que j'ai fait :

Et voici l'ouverture du poste :

Tout semble aller bien. Mais c'est toujours là.


Je l'ai essayé, aucune différence. Je l'ai remis... Ce qui m'importe, c'est ce qui se passe en ce moment, pas ce qui se passait avant.

Voici une capture d'écran (si la valeur reçue de la machine n'est pas 0, mais 1) :

Enfin, dites-moi exactement ce que vous voulez faire... Par exemple : MAA tel et tel est en train de monter et il est au-dessus de MAA tel et tel et le prix est au-dessus/au-dessous de MAA tel et tel et si c'est vrai, alors placez un ordre en attente à telle distance. Je vais vous donner un algorithme approximatif. En raison de tous ces fragments de code, sortis de leur contexte, il est difficile de vous orienter dans la bonne direction. Et le problème est pour la cinquième année (exagéré).


Pour ce qui est de la mise en évidence: travaillez sur les prix ouverts, vous ne verrez pas les MACs se redessiner sur la barre zéro.

 
artmedia70:

... il est difficile de vous indiquer la bonne direction...

IMHO, pas difficile, mais très facile à "diriger" ou à envoyer, car le camarade est trop zélé dans sa lutte contre les sachets et les étagères, ne prenant pas la peine d'étudier le manuel et la documentation. :-)

 
Roman.:

IMHO, pas difficile, mais très facile à "diriger" ou à envoyer, car le camarade est trop zélé dans la lutte contre les sachets et les étagères, ne prenant pas la peine d'étudier le manuel et la documentation. :-)

Mec, il n'y a pratiquement aucun piège... Il n'y a pas de miracles.
Un homme s'est donc entouré de ces pierres et les déplace, les fait bouger.
 
Sepulca:


Merci beaucoup, c'est exactement ce dont j'ai besoin.)
 
Roman.:

IMHO, pas compliqué, mais très facile à "diriger" ou à envoyer,

Il est certainement plus facile d'"envoyer", c'est-à-dire d'"envoyer", que de suggérer. Et en fait, je n'ai rien demandé pour me mettre dans un manuel scolaire. Écrire un double à un endroit, c'est vrai, mais l'essence ne change pas.

artmedia70:

Enfin, dites-moi exactement ce que vous voulez faire... Par exemple : MAK untel est en train de monter et il est au-dessus de MAK untel et le prix est à un certain point en dessous/au-dessus de MAK untel et si c 'est vrai, alors placez un ordre en attente à une certaine distance. Je vais vous donner un algorithme approximatif. Parce qu'il est difficile de vous orienter dans la bonne direction, lorsque vos fragments de code sont arrachés de leur contexte. Après tout, la tâche est pour la cinquième année (exagérément).



Je joins ici une version de test du code et la publie également dans mon post.

//+-----------------------------------------------------------------------------------+
//|                                                                       test_Ma.mq4 |
//|                                                                               hoz |
//|                                                                                   |
//+-----------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
// Машечки
double fastMa,
       slowMa;
double pt;
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD);
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE);
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa + i_thresholdFromMa * pt) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником

       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
   
   if (ticket > 0)
 
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa - i_thresholdFromMa * pt) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
   
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(fastMa - i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0)
    
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy(fastMa, slowMa))             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell(fastMa, slowMa))           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)       // Если машки указывают вверх..
       if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
           return(SIGNAL_BUY);                       // ..функция возвращает сигнал покупки

   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)      // Если машки указывают вниз..
       if ( MathAbs(Bid - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);                          // ..функция возвращает сигнал продажи
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,1);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,1);

// Отслеживание открытия нового бара
   static datetime lastBarTime = 0;    // Время проведения последних рассчётов
   
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

Les conditions indiquent clairement que le prix de l'ordre est supérieur (inférieur) à la MA+(-) décalée de la MA.

C'est ici :

if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt )

Le signal ne doit être calculé que lorsque le prix se trouve dans lazone de "gap" du tiret +(-) de la MA.

Dans une fonction d'achat, par exemple :

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

L'achat doit être supérieur àfastMa dei_thresholdFromMa * pt.

En fait, il n'y en a pas. Soit c'est un défaut de la langue, soit c'est un bug de l'ondulation. Comment expliquer autrement ce dont j'ai besoin ? J'ai donné le code entier sans conditions et fonctions supplémentaires (seulement un signal nu et une ouverture).

C'est déjà écrit clairement(pour un testeur, je ne l'ai pas vérifié pour de vrai !).

Voici comment ça s'ouvre :

Mauvais endroit pour ouvrir...

artmedia70:


En ce qui concernela mise en évidence: travaillez sur les prix ouverts, alors il n'y aura pas de reflux des MAs sur la barre zéro.

J'ai spécialement fait une condition sur la 1ère barre, pour qu'il n'y ait pas de confusion. L'essentiel est de savoir comment le faire fonctionner...
Dossiers :
test_ma.mq4  8 kb
Raison: