[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 325

 
Fox_RM:

C'est-à-dire queVol_Arr[] devrait être initialisé comme un tableau global si je comprends bien.


La question est bien sûr une question nulle, MAIS.

1. Pourquoi les volumes s'affichent-ils correctement dans l'indicateur ?

2. Lors du calcul, j'accède àAOBuffer3[] et non àVol_Arr[].

Merci !


Lorsque vous déclarez un tableau (et non un tampon), vous devez spécifier explicitement sa taille..... au moins.
 
Fox_RM:

C'est-à-dire queVol_Arr[] devrait être initialisé comme un tableau global si je comprends bien.


La question est bien sûr une question nulle, MAIS.

1. Pourquoi les volumes s'affichent-ils correctement dans l'indicateur ?

2. Lors du calcul, j'accède àAOBuffer3[] et non àVol_Arr[].

Merci !

1.
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
Les deux tableaux que vous utilisez sont liés à des tampons indicateurs, c'est-à-dire qu'on leur alloue de la mémoire (bien qu'implicitement).
SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);

Vous n'allouez pas de mémoire pour ce tableau(Vol_Arr[]), que ce soit de manière statique ou dynamique.

2. D'après ce que je vois dans le code, la différence entre les volumes MA et non MA est calculée dans le tableauAOBuffer3[].

   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}

Les volumes sont comptés dansExtMapBuffer1.

Vol_Arr[] peut être initialisé comme un tableau global ou avec un modificateur statique - vous pouvez choisir le vôtre, mais la mémoire doit être allouée dans tous les cas ou vous pouvez le lier au tampon de l'indicateur, ainsi qu'aux deux tableaux précédents - bien sûr, il existe de nombreuses variantes.

 
VladislavVG:
1) Les deux tableaux que vous utilisez sont reliés à des tampons indicateurs, c'est-à-dire que la mémoire leur est allouée (bien qu'implicitement).

......

Vladislav, j'ai revu le code. Une partie du code avecVol_Arr[]est resté de l'ancienne version de l'indicateur, je l'ai supprimé.

Je pense que l'erreur se trouve toujours dans cette partie du code, mais je ne comprends pas où ! J'ai commenté cette partie du code de manière plus détaillée.

 
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  --- Ищу самый высокий бар и определяю время этого бара // -- пока значение  tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}    --- Ищу самый низкий бар и определяю время этого бара // -- пока значение  tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение  colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение  VLUP = 47

Fig2

 
Fox_RM:

Vladislav, j'ai revu le code. Une partie du code avecVol_Arr[]est resté de l'ancienne version de l'indicateur, je l'ai supprimé.

Je pense que l'erreur se trouve toujours dans cette partie du code, mais je ne comprends pas où ! J'ai commenté cette partie du code de manière plus détaillée.

OK, je poste à nouveau le code complet, qui fonctionne maintenant - voyons voir.
 

C'est ici :

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  SteelBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=2;
extern bool Show_Volume=true;
extern double coaf=1.5;
extern bool Show_Vol_line=true;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];

double VLUP;
   double prhgh_e=0, prhgh_s, prlw_e=0, prlw_s;
    datetime tmhgh, tmlw;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
    //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

//---- AO_fan line 2 (basic) buffer
   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
  }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение VLUP = 47
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
  SetText2("Волна1",DoubleToStr(VLUP,0),980,10,Gray,10); 
  SetText2("Волна2",TimeToStr(tmlw,0),980,25,Gray,10); 
  SetText2("Волна3",TimeToStr(tmhgh,0),980,40,Gray,10);
  SetText2("Волна4",DoubleToStr(colbr,0),980,55,Gray,10);  
  
  
      
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 10, "Times New Roman", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }
  
  void SetText2(string name, string text, int xdist, int ydist, color c, int size) 
 {                                                                                    
  ObjectCreate(name,OBJ_LABEL,0,0,0,0,0);     
  ObjectSet(name, OBJPROP_XDISTANCE, xdist);
  ObjectSet(name, OBJPROP_YDISTANCE, ydist);    
  ObjectSetText(name,text,7,"Arial Black",c);
 }

Merci encore !

 
Fox_RM:

C'est ici :



En un coup d'œil :

   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
  } // здесь цикл закончился
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 

Le fragment mis en évidence est en dehors de la boucle et il utilise le compteur de boucle i - quelque chose ne va pas, soit avec la logique, soit avec l'implémentation.

 
hoz:

Pourquoi avez-vous besoin des chiffres sous forme de fichiers CSV ?

Nécessaire pour tester et déboguer les algorithmes de reconnaissance.

hoz:

Écrivez-les vous-même pour les comprendre plutôt que de prendre ceux de quelqu'un d'autre.

Écrire quoi exactement ? Vous voulez dire, marquer les formes sur le graphique vous-même et exporter les morceaux d'histoire appropriés ? Cette solution est la première de la file d'attente jusqu'à présent, mais j'espère toujours que quelqu'un l'a déjà réalisée. Après tout, ce n'est qu'une corvée.

hoz:

L'abondance ne signifie pas le mieux !

Permettez-moi de ne pas être d'accord. Plus la suite de tests est importante, plus le résultat du programme sera statistiquement fiable.


p.s. La question est toujours valable.(Voir la question dans ce billet)

 

Salut à tous ! !!

Pourriez-vous me dire quel code est nécessaire pour faire un long close au maximum de la MA actuelle.

Vous trouverez ci-dessous les critères de négociation actuels, en soulignant en rouge ce qui n'est pas clair.

Je ne sais pas non plus comment indiquer au programme de quitter une position,

après avoir augmenté la différence entre MA1 et MA2 ?

//--------------------------------------------------------------- 5 --
// Critères de transaction
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,1) ; // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,1) ; // MA_2

if ( iHigh (Symbol(),Period(),0) >= MA_1_t) //
{
Opn_S=true ;
}
if ( iLow (Symbol(),Period(),0) <= MA_2_t) //
{
Opn_B=true ; // Ouvrir le critère d'achat
}
if(quel code est nécessaire pour faire une fermeture longue à l'iMA maximum d'aujourd'hui ?? )
{
Cls_B=true ;
}
//--------------------------------------------------------------- 6 --

 
VladislavVG:


Juste un coup d'œil rapide :

Le fragment mis en évidence est en dehors de la boucle et il utilise le compteur de la boucle i - quelque chose ne va pas, soit avec la logique, soit avec l'implémentation.


Merci Vladislav ! Quelque chose a commencé à fonctionner. Mais pour une raison quelconque, seulement comme ça ! :(

fig3

Une autre question : pourquoi les étiquettes de texte ne sont-elles pas affichées dans la fenêtre de l'indicateur ?

// -- Процедура
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 10, "Times New Roman", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }
// -- Обращение
SetText("Awesome_super_volumes", DoubleToStr(VLUP,0), tmhgh, dist, Black);
 

Je ne suis pas un fan des indicateurs, mais j'ai décidé de vérifier une chose. Le conseiller expert doit acheter au prix de l'indicateur RSI supérieur et vendre au prix de l'indicateur inférieur, respectivement. Seulement si le prix est déjà au-dessus de la limite supérieure de l'indicateur RSI, alors l'achat devrait être au-dessus de cette limite et en dessous de la valeur de cette limite + une certaine valeur de retrait de la limite vers le haut (dans le code j'ai spécifié juste un nombre 0.1), pour les ventes, au contraire.

Je l'ai fait comme ça :

Paramètres externes :

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

Code de la fonction recevant le signal et la valeur RSI elle-même :(0.1 ici est la tolérance de marge pour la gamme d'achat ou de vente)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

Parfois, l'EA ouvre des ordres à partir du niveau même, parfois beaucoup plus haut (pour l'achat) et parfois beaucoup plus bas (pour la vente). Pourquoi ? L'algorithme est élémentaire.