MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 209 1...202203204205206207208209210211212213214215216...1953 新しいコメント Artyom Trishkin 2017.05.19 08:02 #2081 Alexey Viktorov:問題はこの行にある1つのバーで複数の通貨をチェックしたいので、1つのバーと1つのシンボルでアラートを繰り返すことを避け、同じバーで異なるシンボルでアラートを作ることを可能にするために、時間と通貨をチェックする必要があります。一見すると、シンボルが表示されているかどうかのフラグを持つ配列がもう一つ必要です。一般的には、この行にシンボルチェックを追加するか、新しいバーが 現れたときだけループを繰り返すようにする必要があります。しかし、このインディケータでシンボルに新しいバーが現れたとき、他のシンボルにはまだ新しいバーが現れていないのではないかという不安があります。結論:各シンボルに新しいバーが現れるかどうかを個別に判断し、同時に線数を無限に引き延ばさないように頭の筋肉を使わなければならない。既成の解決策はない。それに、コードを書いて提案するのは好きではないので...。私は彼の問題を解決していないのですか?どこかで見落としがあったのかもしれませんね。膝の上でコードを書きました。 Alexey Viktorov 2017.05.19 11:12 #2082 Artyom Trishkin:私は彼の問題を解決していないのですか?どこかで見落としがあったのかもしれませんね。膝の上でコードを書きました。Artemさん、私の投稿の最後の文がすべてを説明しています。あなたのコードを見もしなかった。前回の返信を引用した最初の未読の質問を開き、回答した後、他のアドバイスを見ました。私の膝の上からでも、あなたのコードの正しさを疑うことはありません...。 Artyom Trishkin 2017.05.19 12:37 #2083 Alexey Viktorov:Artyomさん、私の投稿の最後の文がすべてを説明しています。あなたのコードを見もしなかった。最初の未読の、私の前の回答の引用がある質問を開き、私は回答し、その後、他のアドバイスを見ました。私の膝の上からでも、あなたのコードの正しさを疑うことはありません...。怠け者と言われそうですが......。)一見しただけでも、このコードが現在のシンボルのティックに依存していることが分かります。したがって、OnTick()からループを取り除き、タイマーに突っ込まなければなりません。そして、タイムアラートの定義を少し修正します。 виталик 2017.05.19 13:17 #2084 こんにちは、すべてのプロセスの誤解は、サイクル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); } //+------------------------------------------------------------------+ Alekseu Fedotov 2017.05.19 14:51 #2085 виталик:こんにちは、すべてのプロセスの誤解は、サイクルmm + +の関数 "スタート "であり、Print()を介してその変更に従ってください、だから質問:"なぜ代わりに1,2,3,4、など4桁の数字をポップアップ?"コード自体 初回実行時、10秒IndicatorCounted()=0 limit=(Bars-counted_bars)-1;ということで、リミット=履歴の最大バー数-1 виталик 2017.05.19 15:48 #2086 Alekseu Fedotov: 初回実行時、10秒間IndicatorCounted()=0meanslimit= 履歴1における最大バー 数 ループの外側でゼロを宣言して初期化 int mm=0; とループ内に配置 mm++;print() では、なぜか下降方向にのみ4桁の数字が1単位の差で変化しています。 Artyom Trishkin 2017.05.19 15:56 #2087 виталик: ループの外側でゼロを宣言して初期化 int mm=0; とループ内に配置 mm++; print() では、4桁の数字が1単位の差で変化しているが、なぜか下降方向だけである すべての印刷物がこのログに印刷されるわけではありません。ファイルの中を見る。 Sile Si 2017.05.19 19:43 #2088 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(); } Sile Si 2017.05.19 19:59 #2089 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); } Artyom Trishkin 2017.05.19 20:30 #2090 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); } //+------------------------------------------------------------------+ 1...202203204205206207208209210211212213214215216...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
問題はこの行にある
1つのバーで複数の通貨をチェックしたいので、1つのバーと1つのシンボルでアラートを繰り返すことを避け、同じバーで異なるシンボルでアラートを作ることを可能にするために、時間と通貨をチェックする必要があります。一見すると、シンボルが表示されているかどうかのフラグを持つ配列がもう一つ必要です。
一般的には、この行にシンボルチェックを追加するか、新しいバーが 現れたときだけループを繰り返すようにする必要があります。しかし、このインディケータでシンボルに新しいバーが現れたとき、他のシンボルにはまだ新しいバーが現れていないのではないかという不安があります。
結論:各シンボルに新しいバーが現れるかどうかを個別に判断し、同時に線数を無限に引き延ばさないように頭の筋肉を使わなければならない。既成の解決策はない。それに、コードを書いて提案するのは好きではないので...。
私は彼の問題を解決していないのですか?
どこかで見落としがあったのかもしれませんね。膝の上でコードを書きました。
私は彼の問題を解決していないのですか?
どこかで見落としがあったのかもしれませんね。膝の上でコードを書きました。
Artemさん、私の投稿の最後の文がすべてを説明しています。あなたのコードを見もしなかった。前回の返信を引用した最初の未読の質問を開き、回答した後、他のアドバイスを見ました。私の膝の上からでも、あなたのコードの正しさを疑うことはありません...。
Artyomさん、私の投稿の最後の文がすべてを説明しています。あなたのコードを見もしなかった。最初の未読の、私の前の回答の引用がある質問を開き、私は回答し、その後、他のアドバイスを見ました。私の膝の上からでも、あなたのコードの正しさを疑うことはありません...。
怠け者と言われそうですが......。)
一見しただけでも、このコードが現在のシンボルのティックに依存していることが分かります。したがって、OnTick()からループを取り除き、タイマーに突っ込まなければなりません。そして、タイムアラートの定義を少し修正します。
こんにちは、すべてのプロセスの誤解は、サイクルmm + +の関数 "スタート "であり、Print()を介して その変更に従ってください、だから質問:"なぜ代わりに1,2,3,4、など4桁の数字をポップアップ?"
コード自体
こんにちは、すべてのプロセスの誤解は、サイクルmm + +の関数 "スタート "であり、Print()を介してその変更に従ってください、だから質問:"なぜ代わりに1,2,3,4、など4桁の数字をポップアップ?"
コード自体
初回実行時、10秒IndicatorCounted()=0
ということで、リミット=履歴の最大バー数-1
初回実行時、10秒間IndicatorCounted()=0
meanslimit= 履歴1における最大バー 数
ループの外側でゼロを宣言して初期化 int mm=0; とループ内に配置 mm++; print() では、4桁の数字が1単位の差で変化しているが、なぜか下降方向だけである
Alexey Viktorov:
...頭の筋肉に負担をかけなければならない...
ご回答いただいた皆様、ありがとうございました。
アルチョム・トリシキン:こんな感じです。
新しいバーでのチェックを制限しても、ティック ごとにチェックしなければならない条件もあるため、うまくいきません。
OnTimer()を追加してみましたが、OnTick()の時はEAで動きましたが、OnCalculateの時はどうすればいいのでしょうか?
注文が開始されない理由を教えてください。
ご回答いただいた皆様、ありがとうございました。
アルチョムさん、なぜ解けていないと書いているのですか?すべての計器で信号が出ているが、システムに大きな負荷がかかっている。負荷を軽減する方法はありますか?
新しいバーでチェックするという制限は、ティック ごとにチェックしなければならない条件もあるため、うまくいきません。
あなたのコードでは、私はOnTimer()を追加しようとすると、それはOnTick()時にEAで動作しましたが、OnCalculateでそれを行うにはどうすればよいのでしょうか?
200ミリ秒のタイマーを使って試してみてください。