[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 325

 

Подскажите, как прописать при увеличении разницы двух EMA (пятидневные/мин. и макс.,) продавать лонг по максимуму EMA и откупать шорт по минимуму EMA?

В качестве разницы двух EMA использую «Rastvor» в заголовке глобальных переменных.

Как прописать данный код в торговых критериях?

 
Fox_RM:

Т.е. Vol_Arr[] нужно инициализировать как глобальный массив я так понимаю.


Вопрос конечно нубский, НО.

1. Почему тогда объемы в индикаторе отображаются корректно.

2. Я при подсчете обращаюсь не к Vol_Arr[] , а к AOBuffer3[].

Спасибо! 


  При объявлении массива (не буфера) вы должны явно указать его размер....   как минимум.
 
Fox_RM:

Т.е. Vol_Arr[] нужно инициализировать как глобальный массив я так понимаю.


Вопрос конечно нубский, НО.

1. Почему тогда объемы в индикаторе отображаются корректно.

2. Я при подсчете обращаюсь не к Vol_Arr[] , а к AOBuffer3[].

Спасибо! 

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;
}
Оба массива, которые Вы используете Вами же и связаны с индикаторными буферами - то есть, память под них отводится (хотя и неявно)
SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);

под указанный же массив (Vol_Arr[]) память Вы не отводите совсем, ни статически ни динамически.

2. Насколько я вижу по коду, в массиве AOBuffer3[] у Вас рассчитывается разность МА, а не объемы

 

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

 Объемы учитываются в ExtMapBuffer1

Можно инициализировать Vol_Arr[] как глобальный, можно с модификатором статик - на выбор, но память нужно отводить в любом случае или связать с индикаторным буфером, как и предыдущие два массива - да мало ли вариантов.

 
VladislavVG:
1. Оба массива, которые Вы используете Вами же и связаны с индикаторными буферами - то есть, память под них отводится (хотя и неявно)

......

Владислав, пересмотрел код еще раз. Часть кода с Vol_Arr[]  осталась от старой версии индикатора, я ее удалил.

Думаю, что ошибка все-же в этой части кода, но не пойму где! Закоментил эту часть кода более подробно. 

 
  //-- Поиск 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

 Рис2

 
Fox_RM:

Владислав, пересмотрел код еще раз. Часть кода с Vol_Arr[]  осталась от старой версии индикатора, я ее удалил.

Думаю, что ошибка все-же в этой части кода, но не пойму где! Закоментил эту часть кода более подробно. 

 

Ок, опубликуйте еще раз полностью тот код, который теперь работает - посмотрим.
 

Вот он:

#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);
 }

 Спасибо еще раз!

 
Fox_RM:

Вот он:



На вскидку:

   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
  } 

 Выделенный фрагмент вне цикла, а в нем используется счетчик цикла i - что-то не так или с логикой или с реализацией

 
hoz:

А зачем Вам фигуры в виде CSV файлов?

Нужны для тестирования и отладки алгоритмов распознавания.

hoz:

Напиши сам, чтоб понимать их, а не брать чьи-то.

Что именно написать? Вы имеете ввиду, самостоятельно разметить фигуры на графике и экспортировать соответствующие куски истории? Это решение пока что является первым на очереди, но до сих пор надеюсь, что кто-то это уже сделал. Ведь это просто рутинная работа. 

hoz:

Много не значит лучше!

 Позвольте не согласиться. Чем больше будет набор для тестирования, тем более статистически достоверным будет результат работы программы.

 

 


 

p.s. Вопрос по-прежнему актуален. (См. вопрос в этом сообщении )

 

Всем привет!!!

Подскажите, пожалуйста, какой код нужен, чтобы лонг закрывался по максимуму текущей МА.

Ниже собственно торговые критерии и красным выделено, что не понятно.

Также не понятно, как задать программе выходить из позиции,

после увеличения разницы между МА1 и МА2? 

//--------------------------------------------------------------- 5 --
// Торговые критерии
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,1); // МА_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,1); // МА_2

if ( iHigh (Symbol(),Period(),0) >= MA_1_t) //
{
Opn_S=true;
}
if ( iLow (Symbol(),Period(),0) <= MA_2_t) //
{
Opn_B=true; // Критерий откр. Buy
}
if (какой нужен код, чтобы лонг закрылся по сегодняшней максимальной iMA???)
{
Cls_B=true;
}
//--------------------------------------------------------------- 6 --

 
VladislavVG:


На вскидку:

 Выделенный фрагмент вне цикла, а в нем используется счетчик цикла i - что-то не так или с логикой или с реализацией


Спасибо Владислав! Кое-что начало получаться. Но почему-то только так?! :(

рис3 

Еще вопрос почему в окне индикатора не отображаются текстовые метки?

// -- Процедура
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);
Причина обращения: