построение линии H_line на самом высоком максимуме из последних 36 максимумов

 

Здравствуйте

Я пытался написать в коде следующее:

когда K% линии stochastic(80,30,30) > 75, оглядываемся на 36 баров назад (34,shift 2) и рисуем H_линию "помидор" от самого высокого максимума до текущего бара.

Когда K% линии stochastic(80,30,30) < 25, посмотрите на 36 баров назад (34,shift 2) и нарисуйте H_линию "оливка" от самого низкого минимума до текущего бара.

int start()
  {

double stoch;
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];

/////////////////////////////////////////////////////////////////////////////////
for(high_nr=2;high_nr<36;high_nr++)
{

   if(Bid<high_price && stoch>75)
     {
      ObjectCreate("tomato",OBJ_TREND,0,Time[high_nr],high_price,Time[0],high_price);
      ObjectSet("tomato",OBJPROP_COLOR,Tomato);
      Print ("tomato ON"+high_price);
     }
       
}
///////////////////////////////////////////////////////////////////////////////
for(low_nr=2;low_nr<36;low_nr++)
{
if(Bid>low_price && stoch<25)
   {
   ObjectCreate("olive",OBJ_TREND,0,Time[low_nr],low_price,Time[0],low_price);
   ObjectSet("olive",OBJPROP_COLOR,Olive);
   Print ("olive ON"+low_price);
   }
}   
   
   
//----
   
//----
   return(0);
  }

Когда я запускаю это, я получаю первую настройку для tomato и для olive ok, затем даже если в журнале я получаю "tomato ON" разных ценовых уровней, я не получаю новую линию tomato на графике. то же самое для olive.

Идея ea состоит в том, чтобы использовать эти линии для открытия сделок. поэтому в итоге я хочу получить следующее:

когда K%>75

нарисовать линию o самую высокую (последние 36 баров).

если линия ON, не рисовать больше линий, пока линия не будет удалена.

если открыта сделка, удалить линию

если сделка не открыта и прошло 24 бара от бара, который определил k%>75, также удалить линию.

:)

это мой первый код, который я написал в моей дырявой жизни, пожалуйста, научите меня, как посмотреть на проблему.

спасибо

 

нужно другое имя

      ObjectCreate("tomato " + high_nr,OBJ_TREND,0,Time[high_nr],high_price,Time[0],high_price);
      ObjectSet("tomato " + high_nr,OBJPROP_COLOR,Tomato);
 

после

   ObjectCreate("olive"+low_nr,OBJ_TREND,0,Time[low_nr],low_price,Time[0],low_price);
   ObjectSet("olive"+low_nr,OBJPROP_COLOR,Olive);

код размещает 25 строк, на той же цене, но начиная не со свечи low_nr (которая всегда 10, не имеет значения, какое реальное число после stoch <25), а со свечи 35.

То же самое для помидора.

:(

 

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

Именно поэтому он работает нормально в первый раз, но не после этого (в вашем исходном коде).

Если вы хотите, чтобы на графике отображалась только последняя линия, удовлетворяющая критериям, создайте линию в init, а затем используйте ObjectMove для перемещения объекта в новые координаты.

Если вы хотите, чтобы отображались все предыдущие линии,

ObjectCreate("tomato " + high_nr,OBJ_TREND,0,Time[high_nr],high_price,Time[0],high_price);

Поскольку high_nr - это сдвиг бара, он, скорее всего, будет повторен в более позднее время, поэтому не будет работать должным образом. Используйте дату в имени, и тогда оно будет уникальным.

 
можете ли вы уточнить, чего вы пытаетесь достичь?
 
cichichan:

Здравствуйте

Я пытался написать в коде следующее:

когда K% линии stochastic(80,30,30) > 75, оглядываемся на 36 баров назад (34,shift 2) и рисуем H_линию "помидор" от самого высокого максимума до текущего бара.

Когда K% линии stochastic(80,30,30) < 25, посмотрите на 36 баров назад (34,shift 2) и нарисуйте H_линию "оливка" от самого низкого минимума до текущего бара.

Когда я запускаю это, я получаю первую настройку для tomato и для olive ok, затем даже если в журнале я получаю "tomato ON" разных ценовых уровней, я не получаю новую линию tomato на графике. то же самое для olive.

Идея ea состоит в том, чтобы использовать эти линии для открытия сделок. поэтому в итоге я хочу получить следующее:

когда K%>75

нарисовать линию o самую высокую (последние 36 баров).

если линия ON, не рисовать больше линий, пока линия не будет удалена.

если открыта сделка, удалить линию

если сделка не открыта и прошло 24 бара от бара, который определил k%>75, также удалить линию.

:)

это мой первый код, который я написал в моей дырявой жизни, пожалуйста, научите меня, как посмотреть на проблему.

спасибо

Начнем с начала .....

double stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

На баре 0 стох может попасть куда-то при значении бара 0 > 75 и закончиться с меньшим значением.

Нужно ли в этом случае проводить линию? Или это только для близкой цены стохастик заканчивается?

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];

Вы когда-нибудь использовали iHighest и/или iLowest? Посмотрите, как сделать iHighest и iLowest

if(stoch > 75) high_price = High[iHighest(NULL,0,MODE_HIGH,......

if(stoch < 25) low_price = Low[iLowest(........

//-----

for(high_nr=2;high_nr<36;high_nr++)   // why do you repeat this ??
{

   if(Bid<high_price && stoch>75)
     {
      ObjectCreate("tomato",OBJ_TREND,0,Time[high_nr],high_price,Time[0],high_price);
      ObjectSet("tomato",OBJPROP_COLOR,Tomato);
      Print ("tomato ON"+high_price);
     }
       
}

одного раза создания достаточно .... цикл повторяет только то, что находится внутри { }

поэтому цикл не нужен для этого ....

затем перед созданием

  • проверка запущенных сделок
  • проверить, существует ли уже объект с именем, начинающимся на "tomato", и если он существует, то проверить, нужно ли удалить старый объект.

создайте имя в тот момент, когда вы делаете его как

linenamehigh =     "tomato  "+ TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)

проверка ваших объектов может с

//----
   int i, ot=ObjectsTotal()-1;
   string id;
//----
   for(i=ot;i>=0;i--)
    {id=ObjectName(i);
     if(StringSubstr(id,0,7)=="tomato ")
      {
      //check when created 
      if(StringSubstr(id,8,...)< TimeToStr(Time[24],........)){ObjectDelete(id);}
      }  
     if(StringSubstr(id,0,6)=="olive ")
         {
         //.....
         }
    }

Щелкните по ссылкам и попытайтесь понять, что происходит

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

 
qjol:
Выможете уточнить, чего Вы пытаетесь достичь?


окончательная идея:

Сигнал 1 = когда K%>75 и максимум бара[1] и текущего бара[0] меньше самого высокого максимума из последних 36 баров (High_point)

нарисовать томатную линию на High_point

если томатная линия уже нарисована, не рисуйте больше никаких линий, пока линия не будет удалена.

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

если сделка не открыта и прошло 96 баров от бара, определившего High_point ,удалите линию.

Теперь я получаю только одну линию на каждом сигнале 1(функция Print посылает 36 "tomato ON" каждый действительный тик, я полагаю), поэтому я должен сказать коду, чтобы остановить цикл после того, как он найдет линию tomato. Я иду варить спагетти и думать, как я должен написать это... в моей голове это должно быть следующим шагом.... надеюсь, я ничего не упустил :)

Я на правильном пути? Большое спасибо за помощь и советы.

код до сих пор:

//+------------------------------------------------------------------+
//|                                                      1expert.mq4 |
//|                                                              ant |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "ant"
#property link      ""

#property indicator_chart_window

extern int Kperiod = 80;
extern int Dperiod = 30;
extern int Stochshift = 30;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

double stoch;
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
datetime L=Time[low_nr];

/////////////////////////////////////////////////////////////////////////////////
for(high_nr=2;high_nr<36;high_nr++)
{

   if(Bid<high_price && High[0]<high_price && High[1]<high_price && stoch>75)
     {
      ObjectCreate("tomato"+H,OBJ_TREND,0,H,high_price,Time[0],high_price);
      ObjectSet("tomato"+H,OBJPROP_COLOR,Tomato);
      Print ("tomato ON"+H);
     }
       
}
///////////////////////////////////////////////////////////////////////////////
for(low_nr=2;low_nr<36;low_nr++)
{
if(Bid>low_price && Low[0]>low_price && Low[1]>low_price && stoch<25)
   {
   ObjectCreate("olive"+L,OBJ_TREND,0,L,low_price,Time[0],low_price);
   ObjectSet("olive"+L,OBJPROP_COLOR,Olive);
   Print ("olive ON"+low_price);
   }
}   
   
   
//----
   
//----
   return(0);
  }
 

я написал в одно время с постом deVries.

Я иду читать :)

 
double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
datetime L=Time[low_nr];

if (stoch > 75 && High[1] < High[high_nr] && High[0] < High[high_nr])
   {
   ObjectCreate("tomato"+H,OBJ_TREND,0,Time[H],high_price,Time[0],High[0]);
   ObjectSet("tomato"+H,OBJPROP_COLOR,Tomato);
   Print ("tomato ON"+H);   
   }

B.T.W. для этого не нужна линия

 

Случай, о котором вы говорите cichichan, произойдет редко, поэтому вы должны использовать индекс, чтобы вы могли видеть, что вы делаете:

http://charts.mql5.com/3/799/eurusd-h1-fxpro-financial-services.png

Стрелка_вниз не отображается, где-то есть ошибка ....

//+------------------------------------------------------------------+
//|                                                      lexpert.mq4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "ant"
#property link      ""

#property indicator_chart_window
#property indicator_buffers 8
#property  indicator_color1 YellowGreen  
#property  indicator_color2 Coral


extern int Kperiod = 80;
extern int Dperiod = 30;
extern int Stochshift = 30;

 double arrow_up[];
 double arrow_down[];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   //-------- 
   SetIndexBuffer(0, arrow_up );
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID,2);
   SetIndexArrow(0,233);
   SetIndexEmptyValue(0,0.0);
//-------- 
   SetIndexBuffer(1,arrow_down);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID,2);
   SetIndexArrow(1,234 );
   SetIndexEmptyValue(1,0.0);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

   int    limit;
   int    counted_bars=IndicatorCounted();

   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   //---- macd counted in the 1-st additional buffer
   for(int i=limit; i>=0; i--)
      { 

double stoch_1, stoch_2;
stoch_2=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,i+2);
stoch_1=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,i+1);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,i+2);
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,i+2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
datetime L=Time[low_nr];

/////////////////////////////////////////////////////////////////////////////////


   if(Bid<high_price && High[i]<high_price && High[i+1]<high_price && stoch_2<75 && stoch_1 >75)
     {
     arrow_down[i] =  High[i] + 5*iATR(NULL,0,200,i);
      ObjectCreate("tomato"+H,OBJ_TREND,0,H,high_price,Time[i],high_price);
      ObjectSet("tomato"+H,OBJPROP_RAY_RIGHT, false);
      ObjectSet("tomato"+H,OBJPROP_WIDTH,5 ); 
      ObjectSet("tomato"+H,OBJPROP_COLOR,Tomato);
      Print ("tomato ON"+H);
     }
    else    arrow_down[i] = 0.0;

///////////////////////////////////////////////////////////////////////////////

if(Bid>low_price && Low[i]>low_price && Low[i+1]>low_price &&  stoch_2>25 && stoch_1 < 25)
   {
   arrow_up[i] = Low[i] - 5*iATR(NULL,0,200,i);
   ObjectCreate("olive"+L,OBJ_TREND,0,L,low_price,Time[i],low_price);
   ObjectSet("olive"+L,OBJPROP_COLOR, Yellow );
   ObjectSet("olive"+L,OBJPROP_WIDTH,5 );
   ObjectSet("olive"+L,OBJPROP_RAY_RIGHT, false);
   Print ("olive ON"+low_price);
   }
   else  arrow_up[i] = 0.0;
   
//----
  } 
//----
   return(0);
  }
 
п о с л е д о в а т е л ь н о с т ь п р о в е д е н и я э к с п е р т н о г о осмотра
Причина обращения: