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

 
MakarFX #:

そして、もしそうなら

あなたのソリューションがなぜ無限ループを引き起こさないのか、それを理解するのに時間がかかりました。とはいえ、それ自体も1回実行される。しかし、上記の解決策に促され、ブーリアン・スイッチを作成しました。
ulong ms=0;
bool msFlag=0;

void OnTimer(){
  if(msFlag!=0 && GetMicrosecondCount()-ms > 100000){
    ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
    msFlag=0;
  }
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
    if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1"){
      ms=GetMicrosecondCount();
      msFlag=1;
      } 
  }
これで、ボタンが押されたときだけ、コードが実行されるようになりました。しかし、端末が数日間稼働したらどうなるのでしょうか?時間を返す別のメソッドのヘルプには、オーバーフローが発生すると書いてあります。

ulong ms=0;
bool msFlag=0;

int OnInit()
{
    EventSetMillisecondTimer(1);
    ...
}

void OnTimer(){
  if(msFlag!=0 && Seconds() > 20){
    ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
    msFlag=0;
  }
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
    if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1"){
      msFlag=1;
      }
  }
同じコードで、GetMicrosecondCountの代わりにSeconds()を使用しても、動作しません。"Seconds() > 20" 以上の場合 - ボタンが「押された」状態でフリーズします。低い場合は動作するが、ほとんど気づかないほど速い(点滅する)。
 
Nerd Trader #:
なぜ無限ループにならないのか、長い間理解できませんでした。とはいえ、単体でも1回実行される。しかし、上記の解決策によって、私はブーリアン・スイッチを作成することになりました。これで、ボタンが押されたときだけコードが実行されるようになりました。しかし、端末が数日間稼働したらどうなるのでしょうか?時間を返す別のメソッドのヘルプには、オーバーフローが発生すると書かれています。 同じコードで、GetMicrosecondCountの代わりにSeconds()を使用しても、動作しません。"Seconds() > 20" 以上の場合 - ボタンが「押された」状態でフリーズします。低い場合は動作するが、ほとんど気づかないほど速い(点滅する)。


すると、このようになります。

//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
      if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1")
         {ms=TimeCurrent();}
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(ms!=0&&TimeCurrent()>ms)
     {
      ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
      ms=0;
     }
  }
//+------------------------------------------------------------------+
 
MakarFX #:

すると、このようになります。

いいえ、そのように動作しません。秒が動作しないのであれば、TimeCurrent()はなおさらです。Milesecondsは、オーバーフローを引き起こすかもしれませんが、今のところ唯一の実行可能なバリアントです。
 
Nerd Trader #:
いや、そんなことはない、秒単位がダメならTimeCurrent()も全部ダメだ。今のところ、mile-secondsが唯一動作可能なバリエーションですが、オーバーフローを引き起こす可能性があります。
効果あり!
 
MakarFX #:
効果あり!
mmm は私の場合、ボタンが勝手に外れるということはありません。
 
Nerd Trader #:
mmmは私の場合、ボタンが勝手に外れるということはないです。
マーケットが終了したため、TimeCurrent()は変更されません。クリプトで確認すると、週末に動作している
 
MakarFX #:
マーケットが終了したため、TimeCurrent()は変更されません。クリプトで確認、土日も動いている
私のブローカーのCryptoは土日には取引しません。テスターで試したところ、うまくいきません。
 
Nerd Trader #:
週末の私のブローカーのCryptoは取引されていない。テスターで試したところ、うまくいきません。
A-Marketsのデモを開く。テスターでタイマーが作動しない。
 

はじめまして、配列が表示されます。

int arr[]={6,4,6,7,55,55,7,6,77,66,66,2,2};

すべての数字が表示され、かつ繰り返しがないように変更するにはどうしたらよいですか?

int re[]={6,4,7,55,77,66,2};
 
Galim_V #:

ご挨拶に、配列

すべての数字が存在し、かつ繰り返しのないように変更するにはどうしたらよいでしょうか。

ライブラリを使わなくてもできる

int arr[]= {6,4,6,7,55,55,7,6,77,66,66,2,2};
int re[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  int AS=ArraySize(arr);
  int n=0;
  for(int i=0; i<AS; i++) {
    if(ArraySearch(re, arr[i])==-1) {
      n++;
      ArrayResize(re,n);
      re[n-1]=arr[i];
    }
  }
  ArrayPrint(re);
}
//===============================================================================================
//------------------------------ Функция удаляет копии с массива -------------------------------+
//===============================================================================================
int ArraySearch(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
//+------------------------------------------------------------------+