MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 209

 
Alexey Viktorov:

問題はこの行にある

1つのバーで複数の通貨をチェックしたいので、1つのバーと1つのシンボルでアラートを繰り返すことを避け、同じバーで異なるシンボルでアラートを作ることを可能にするために、時間と通貨をチェックする必要があります。一見すると、シンボルが表示されているかどうかのフラグを持つ配列がもう一つ必要です。

一般的には、この行にシンボルチェックを追加するか、新しいバーが 現れたときだけループを繰り返すようにする必要があります。しかし、このインディケータでシンボルに新しいバーが現れたとき、他のシンボルにはまだ新しいバーが現れていないのではないかという不安があります。

結論:各シンボルに新しいバーが現れるかどうかを個別に判断し、同時に線数を無限に引き延ばさないように頭の筋肉を使わなければならない。既成の解決策はない。それに、コードを書いて提案するのは好きではないので...。

私は彼の問題を解決していないのですか?

どこかで見落としがあったのかもしれませんね。膝の上でコードを書きました。

 
Artyom Trishkin:

私は彼の問題を解決していないのですか?

どこかで見落としがあったのかもしれませんね。膝の上でコードを書きました。

Artemさん、私の投稿の最後の文がすべてを説明しています。あなたのコードを見もしなかった。前回の返信を引用した最初の未読の質問を開き、回答した後、他のアドバイスを見ました。私の膝の上からでも、あなたのコードの正しさを疑うことはありません...。

 
Alexey Viktorov:

Artyomさん、私の投稿の最後の文がすべてを説明しています。あなたのコードを見もしなかった。最初の未読の、私の前の回答の引用がある質問を開き、私は回答し、その後、他のアドバイスを見ました。私の膝の上からでも、あなたのコードの正しさを疑うことはありません...。

怠け者と言われそうですが......。)

一見しただけでも、このコードが現在のシンボルのティックに依存していることが分かります。したがって、OnTick()からループを取り除き、タイマーに突っ込まなければなりません。そして、タイムアラートの定義を少し修正します。

 

こんにちは、すべてのプロセスの誤解は、サイクルmm + +の関数 "スタート "であり、Print()を介して その変更に従ってください、だから質問:"なぜ代わりに1,2,3,4、など4桁の数字をポップアップ?"

コード自体

int start()

  {
   int    counted_bars=IndicatorCounted();
   int limit, i;
                                               int mm=0;     // ======= ПЕРВОЕ========
  

   if(counted_bars<0) return(-1);

   limit=(Bars-counted_bars)-1;

for (i=limit; i>=0;i--)
    { 
       if (TimeDayOfWeek(Time[i]) != 0)
       {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];}
 

if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0)
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print(" TEST= ",mm);// ========ТРЕТЬЕ========
  
   LastLow=Open[i]; LastHigh=Open[i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
     ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return(0);
  }
//+------------------------------------------------------------------+
 
виталик:

こんにちは、すべてのプロセスの誤解は、サイクルmm + +の関数 "スタート "であり、Print()を介してその変更に従ってください、だから質問:"なぜ代わりに1,2,3,4、など4桁の数字をポップアップ?"

コード自体


初回実行時、10秒IndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

ということで、リミット=履歴の最大バー数-1

 
Alekseu Fedotov:


初回実行時、10秒間IndicatorCounted()=0

meanslimit= 履歴1における最大バー

ループの外側でゼロを宣言して初期化 int mm=0; とループ内に配置 mm++;print() では、なぜか下降方向にのみ4桁の数字が1単位の差で変化しています。
 
виталик:
ループの外側でゼロを宣言して初期化 int mm=0; とループ内に配置 mm++; print() では、4桁の数字が1単位の差で変化しているが、なぜか下降方向だけである
すべての印刷物がこのログに印刷されるわけではありません。ファイルの中を見る。
 

Alexey Viktorov:

...頭の筋肉に負担をかけなければならない...

ご回答いただいた皆様、ありがとうございました。

アルチョム・トリシキン:こんな感じです。

アルテムさん、なぜ解けていないと書くのですか?すべてのツールの信号を送りますが、システムに大きな負荷がかかるだけです。負荷を軽減することは可能ですか?

新しいバーでのチェックを制限しても、ティック ごとにチェックしなければならない条件もあるため、うまくいきません。

OnTimer()を追加してみましたが、OnTick()の時はEAで動きましたが、OnCalculateの時はどうすればいいのでしょうか?

int OnInit()
  {
  EventSetMillisecondTimer(1);
//--- indicator buffers mapping
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
{// ---
        EventKillTimer();
 // ---
}
void OnTimer()
  {
   RefreshRates();
  // OnTick();
   OnCalculate();
  }

 
Ibragim Dzhanaev:

注文が開始されない理由を教えてください。


OK、開きます。
//пересечение вверх
bool PeresVverh()
  {//Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
      if(Ma(MaPer1,1)>=Ma(MaPer2,1))
         if(Ma(MaPer1,0)<Ma(MaPer2,0))
            return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  {//Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
      if(Ma(MaPer1,1)<=Ma(MaPer2,1))
         if(Ma(MaPer1,0)>Ma(MaPer2,0))
            return(true);
   return(false);
  }

 
Sile Si:

ご回答いただいた皆様、ありがとうございました。

アルチョムさん、なぜ解けていないと書いているのですか?すべての計器で信号が出ているが、システムに大きな負荷がかかっている。負荷を軽減する方法はありますか?

新しいバーでチェックするという制限は、ティック ごとにチェックしなければならない条件もあるため、うまくいきません。

あなたのコードでは、私はOnTimer()を追加しようとすると、それはOnTick()時にEAで動作しましたが、OnCalculateでそれを行うにはどうすればよいのでしょうか?


200ミリ秒のタイマーを使って試してみてください。

//+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string   name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(200);
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   for(int i=0; i<ArraySize(symbols_array); i++) {
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);;
         if(symbols_array[i].time_alert!=tm) {
            Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);
         if(symbols_array[i].time_alert!=tm) {
            Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition(string symbol_name,int shift) {
   MqlRates array[];
   if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){
      if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY);
      if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL);
      }
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
ushort SetSymbols(string symbols_list,SSymbolsData &array[]){
   symbols_list+=","; // Добавим признак конца строки
   short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list);
   string sy="";
   Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке
   while(beg<len) {
      beg++;
      end=(short)StringFind(symbols_list,",",beg);
      if(end==beg || end<0) continue;
      sy=StringSubstr(symbols_list,beg,end-beg);
      if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue;
      ushort sz=(ushort)ArraySize(array);
      ArrayResize(array,sz+1);
      array[sz].name=sy;
      array[sz].time_alert=0;
      //--- Посмотрим корректность найденного символа и записи его в массив
      Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name);
      }
   return((ushort)ArraySize(array));
}
//+------------------------------------------------------------------+
bool CheckSymbol(string symbol_name,SSymbolsData &array[]){
   for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true);
   return(false);
}
//+------------------------------------------------------------------+
bool IsPresentSymbol(string symbol_name){
   for(ushort i=0; i<SymbolsTotal(false); i++){
      if(SymbolName(i,false)==symbol_name) {
         SymbolSelect(symbol_name,true);
         return(true);
         }
      }
   return(false);
}
//+------------------------------------------------------------------+