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

 

Всем привет!

Изучив в течении месяца учебник  MQL4, решил написать советника, чтобы не сочинять нового из-за отстутствии опыта, решил взять шаблон эксперта tradingexpert.mq4 из учебника.

Суть стратегии следующая: трехбарная система максимумов и минимумов "Ларри Вильямса", строим две трехдневные EMA  по максимуму и минимуму, продаем

на максимуме, поупаем на минимуме. 

В шаблоне в разделе глобальных переменных убрал  строку extern double Rastvor =28.0; (собстевнно она не нужна),  также удалил ее из торговых критериев.

Изменил в глобальных переменных значения МА на 3:

extern int Period_MA_1= 3; // Период МА 1
extern int Period_MA_2= 3; // Период МА 2

В разделе торговых критериев было:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1
   MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2
 
   if (MA_1_t > MA_2_t + Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1_t < MA_2_t - Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 
стало:

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

if (PRICE_HIGH * Point >= MA_1_t * Point)    
    {                                                                    
  Opn_S=true;                                                  
  Cls_B=true;                                                 
    }

if (PRICE_LOW * Point <= MA_2_t * Point)    
    {                                                              
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell
    }
//--------------------------------------------------------------- 

 

Теперь суть проблемы: система только открывает ордера на продажу, а покупать не хочет. В чем может быть ошибка? 

Вполне возможно, что где-то еще ошибки, прошу не судить строго, а помочь советом) 

 
Forexman77:


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

if (PRICE_HIGH * Point >= MA_1_t * Point)    
    {                                                                    
  Opn_S=true;                                                  
  Cls_B=true;                                                 
    }

if (PRICE_LOW * Point <= MA_2_t * Point)    
    {                                                              
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell
    }
//--------------------------------------------------------------- 

 

Теперь суть проблемы: система только открывает ордера на продажу, а покупать не хочет. В чем может быть ошибка? 

Вполне возможно, что где-то еще ошибки, прошу не судить строго, а помочь советом) 



Это что такое?  PRICE_LOW и  PRICE_HIGH. Это всеволишь целые константы, которые имеют значение 0 или 1, до 6,. 

 

Следует использовать iHigh(Symbol(),Period(),i) что бы получить макс значение BID на баре i, и iLow(Symbol(),Period(),i) чтобы получить минимальное значение BID на баре i.

Если кувыркаетесь на текущем баре то: if ( iHigh(Symbol(),Period(),0)   >= MA_1_t)  И не нужно MA на Point умножать.

 

Доброго всем времени суток!

Подскажите пожалуйста в чем ошибка.

Прикрутил к стандартному индикатору Awesome индикатор объемов (Volume).

Хочу организовать подсчет Общего объема волны (считается от Low до High цены и соответствует Min и Max значению Awesome). См. рис1.

рис1 

 В чем ошибка значения не считаются.

Ниже сам код.

#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;
}
if (Show_Vol_line==true)
{
double Vol_Arr[];


  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
   }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);     
  
  int shift=iBarShift(NULL,0,tmlw);
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
//-- Эти значения должны отображаться в окне Awesome
  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); 
  }
  
//--Ввeл дополнительную процедуру для отображения значений на чарте. Ее не должно быть.
  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);
 }
 
Sepulca:


Это что такое?  PRICE_LOW и  PRICE_HIGH. Это всеволишь целые константы, которые имеют значение 0 или 1, до 6,. 

 

Следует использовать iHigh(Symbol(),Period(),i) что бы получить макс значение BID на баре i, и iLow(Symbol(),Period(),i) чтобы получить минимальное значение BID на баре i.

Если кувыркаетесь на текущем баре то: if ( iHigh(Symbol(),Period(),0)   >= MA_1_t)  И не нужно MA на Point умножать.

  Огромное спасибо!!! Работает!!
 

Ребята подскажите кто-нибудь, что не так с кодом плз! 

 
Fox_RM:

Ребята подскажите кто-нибудь, что не так с кодом плз! 


if (Show_Vol_line==true)
{
double Vol_Arr[]; // ошибки: 1. Размещение  2. Область видимости


  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
   }
   
 
VladislavVG:


Не совсем понял. Но с отображением объемов проблем нет. Есть проблемы с подсчетом объемов. Где-то здесь.

 //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];} // -- tmhgh - выводил это значение оно = 0;

  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);    tmlw - тоже = 0; Почему?
  
  int shift=iBarShift(NULL,0,tmlw);
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
asdfgh001:

Добрый день!

Мой вопрос будет немного отстранённым от темы. 

Подскажите, пожалуйста, можно ли где-нибудь найти нарезку фигур ТА в виде CSV файлов? Приемлем вариант с txt, xls или любыми другими форматами, которые можно обработать программно.

В различных статьях, учебниках по ТА присутствуют примеры фигур ТА, но разумеется в виде обычных картинок. А не попадались ли кому-то более-менее большие наборы фигур ТА, сохраненные как кусочек истории какой-нибудь валютной пары на периодах H1-H4 скажем? 

Гуглил, не нашел. Разумеется, можно вручную перебрать историю, отметить фигуры, экспортировать этот кусок истории как .csv; повторить нужное количество раз, собрать в итоге базу фигур. Но если кто-то это уже сделал, хотелось бы сэкономить время.

Заранее спасибо :) 


А зачем Вам фигуры в виде CSV файлов? Напиши библиотеки фигур... Напиши сам, чтоб понимать их, а не брать чьи-то. Много не значит лучше!
 
Fox_RM:


Не совсем понял. Но с отображением объемов проблем нет. Есть проблемы с подсчетом объемов. Где-то здесь.

 


1. Массив нужно размещать - то есть отвести память. Иначе просто негде хранить значения ;).

2. При получении нового тика Ваш даже размещенный массив будет переразмещен/переинициализирован. Это связано с областью видимости. Массив должен быть типа "статик", чтоб этого не происходило.

Почитайте что-нить по основам программирования.

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

 
VladislavVG:


1. Массив нужно размещать - то есть отвести память. Иначе просто негде хранить значения ;).

2. При получении нового тика Ваш даже размещенный массив будет переразмещен/переинициализирован. Это связано с областью видимости. Массив должен быть типа "статик", чтоб этого не происходило.

Почитайте что-нить по основам программирования.

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

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


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

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

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

Спасибо! 

Причина обращения: