初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 224

 
Expert Advisorでは、最初の行の
OnTick()

これらの行の後、さらにコードが1本のロウソクに1回実行されます。その形成の瞬間に

このインジケータをEAから呼び出すのですね、やはり?

 
Aleksei Stepanenko:
Expert Advisorでは、最初の行の

これらの行の後、さらにコードが1本のロウソクに1回実行されます。その形成の瞬間に

このインジケータはEAから呼び出しているとのことですが、どうでしょうか?

実は、このインジケータを別のインジケータに挿入して、別のプログラムに信号を送っているんです。つまり、Expert Advisorは存在しないのです。つまり、インジケーター自体のどこかに埋め込まれているはずなのですが、どのように?
 
どのプログラムがお得なのか?アドバイザーである。そうでしょう?
 
Aleksei Stepanenko:
そして、どのようなプログラムが取引を開始するのでしょうか?それが「Expert Advisor」です。そうでしょう?

あ、そうか、もしかして...。しかし、その後、事態はより複雑になっていくようで...。このコードに合わせるのは無理がありますよね?そして、2つ目のインジケータコードにもコードはありません。

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]=...これは残念なことです。