Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 224

 
В советник, первыми строчками в 
OnTick()

после этих строчек дальнейший код будет исполнятся один раз за одну свечу. В момент её образования.

Вы же вызываете этот индикатор из советника, как я понял?

 
Aleksei Stepanenko:
В советник, первыми строчками в 

после этих строчек дальнейший код будет исполнятся один раз за одну свечу. В момент её образования.

Вы же вызываете этот индикатор из советника, как я понял?

Ну вообще этот индикатор я вставляю в другой индикатор, который передаёт сигнал на другую программу. То есть советника как бы нету. То есть надо куда-то в сам индикатор это встроить, но вот как?
 
А сделки какая программа открывает? Она и есть советник. Не?
 
Aleksei Stepanenko:
А сделки какая программа открывает? Она и есть советник. Не?

Ааа, ну может быть... Но тогда всё похоже усложняется сильно прям... Никак нельзя в этот код встроить, да? И в коде второго индикатора тоже нет кода 

OnTick()
Как же блин это вообще так работает?...:)))))
 
Можно попробовать по другому, там где Вы вызываете этот индикатор через iCustom, в конце этой функции вместо 0 тоже поставить 1.
 
Кстати всё равно индикатор рисует также много стрелок, но когда перегружаешь график, остаются только некоторые из них. :( Как будто на истории индикатор сам себя выгораживает, типа смотри как я торгую хорошо, а в реальном времени всё совсем иначе. :(
 
ElenkaVladi:
Кстати всё равно индикатор рисует также много стрелок,

Да? Хмм, чуть попозже посмотрю его.

 
Aleksei Stepanenko:
Можно попробовать по другому, там где Вы вызываете этот индикатор через iCustom, в конце этой функции вместо 0 тоже поставить 1.

То есть вот здесь?

if (IndicatorName != "") {
      up = iCustom(NULL, 0, IndicatorName, IndiBufferCall, SignalType);
      dn = iCustom(NULL, 0, IndicatorName, IndiBufferPut, SignalType);
if (IndicatorName != "") {
      up = iCustom(NULL, 1, IndicatorName, IndiBufferCall, SignalType);
      dn = iCustom(NULL, 1, IndicatorName, IndiBufferPut, SignalType);

Вот так сделать?

 
Aleksei Stepanenko:

Да? Хмм, чуть попозже посмотрю его.

Может дело в том сообщении? Нужно всё же сделать как там написано?

https://www.mql5.com/ru/forum/160587/page223#comment_19618305

В любом случае, огромное спасибо, что возитесь тут с нами...:)))

Прикрепляю файлы для лучшего понимания ситуации.

Вопросы от начинающих MQL4 MT4 MetaTrader 4
Вопросы от начинающих MQL4 MT4 MetaTrader 4
  • 2020.11.29
  • www.mql5.com
Если у Вас вопросы по MQL4, MT4, MetaTrader 4, пожалуйста пишите в этой теме. Особенно когда вопросы касаются торговых функций...
 
ElenkaVladi:

Вот рабочий код:

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Blue
#property  indicator_color2  Red
//---- indicator parameters
extern int  period = 4; //12
extern int  shift  = 0; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
double Ma[],MaOn[];

datetime LastTime=0;
int i, st=5;

int OnInit()
   {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW,2);
   SetIndexArrow(0,233);
   SetIndexStyle(1,DRAW_ARROW,2);
   SetIndexArrow(1,234);

   SetIndexBuffer(0,BufferUp);//стрелка синяя верх
   SetIndexBuffer(1,BufferDn);//стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("T3MA-ALARM ("+period+")");
   
   ArraySetAsSeries(Ma,true);
   ArraySetAsSeries(MaOn,true);
//---- initialization done
   if(Digits==3 || Digits==5) st*=10;
   return(INIT_SUCCEEDED);
   }
   
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
   {
   if(rates_total<=MathMax(period,shift)) return(0);
   int limit=rates_total-prev_calculated;   
   if(prev_calculated>0) limit++;

   if(LastTime!=time[1])
      {
      LastTime=time[1];
      ArrayCopy(Ma,Ma,rates_total-ArraySize(Ma),0,WHOLE_ARRAY);
      ArrayCopy(MaOn,MaOn,rates_total-ArraySize(MaOn),0,WHOLE_ARRAY);
      }

   for(i=limit; i>=1; i--) Ma[i]=iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
   for(i=limit; i>=1; i--) MaOn[i]=iMAOnArray(Ma,rates_total,period,0,MODE_EMA,i);
      
   for(i=limit; i>=1; i--)
      {
      if(MaOn[i+shift]-MaOn[i+1+shift]<0 && MaOn[i+1+shift]-MaOn[i+2+shift]>0){BufferDn[i+1]=high[i+1]+st*Point;}
      if(MaOn[i+shift]-MaOn[i+1+shift]>0 && MaOn[i+1+shift]-MaOn[i+2+shift]<0){BufferUp[i+1]=low[i+1]-st*Point;}
      }
   return(rates_total);
   }
Обратите внимание что стрелка рисуется задним числом BufferDn[i+1]=... Это печалька.
Причина обращения: