MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1306 1...129913001301130213031304130513061307130813091310131113121313...1953 新しいコメント Tretyakov Rostyslav 2020.11.26 21:12 #13051 インジケータにもう一つバッファを追加したのですが(double ma_buffer_stop[];)、描画されないし、エラーも出ます( //+------------------------------------------------------------------+ //| MTF_Moving.mq4 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com/ru/users/melnik | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com/ru/users/melnik" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 3 #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_color1 Red #property indicator_color2 Blue #property indicator_color3 Black #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE double ma_buffer_slow[]; double ma_buffer_fast[]; double ma_buffer_stop[]; //--- input parameters input int PeriodMaSlow=21; //Period slow Ma input int PeriodMaFast=13; //Pertiod fast Ma input ENUM_APPLIED_PRICE PriceMa=0; //Applied price input ENUM_MA_METHOD MethodMa=0; //Method Ma input ENUM_TIMEFRAMES Timeframe=60; //Timeframe for calculate ENUM_TIMEFRAMES prd; int index=-1; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, ma_buffer_slow, INDICATOR_DATA); SetIndexBuffer(1, ma_buffer_fast, INDICATOR_DATA); SetIndexBuffer(2, ma_buffer_stop, INDICATOR_DATA); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 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[]) { //--- if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0); if(Period()>Timeframe) prd=PERIOD_CURRENT; if(Period()<=Timeframe) prd=prd=Timeframe; for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--) { if(TimeMinute(time[i])==0)index=iBarShift(Symbol(), prd, time[i], false); ma_buffer_fast[i]=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index); ma_buffer_slow[i]=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index); if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) {ma_buffer_stop[i]=ma_buffer_slow[i]+50*Point;} if(ma_buffer_fast[i+1]<=ma_buffer_slow[i+1]&&ma_buffer_fast[i]>ma_buffer_slow[i]) {ma_buffer_stop[i]=ma_buffer_slow[i]-50*Point;} } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ Aleksei Stepanenko 2020.11.27 10:03 #13052 チェック、こんなところにまで入ってきているのか?if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) printf(ma_buffer_slow[i]); というのが真っ先に思い浮かびます。 Valeriy Yastremskiy 2020.11.27 10:27 #13053 ゼロで割り算を キャッチすることもあるんです。(力学の世界ではどんなことも起こりうる)。 分割操作のコメントや、EAをチャートに投げるなどして探しています。 もっと普通の方法で、エラーのある行を取得する方法はないでしょうか? 問題は、ある特定の状態でのみエラーが発生することです。すなわち、ある時間枠で、新しいローソク足で、エラーが消えることがあります。4時の位置で気がつくといい感じです。探す時間はある。 Igor Makanu 2020.11.27 10:41 #13054 Valeriy Yastremskiy:もっと一般的な方法で、エラーのある行を取得する方法はないのでしょうか? エキスパートログにゼロ除算が 行われたファイルと行番号のエントリがあるはずです。 Valeriy Yastremskiy 2020.11.27 10:51 #13055 Igor Makanu:Expert Advisor のログに、ゼロによる除算が 行われたファイルと行番号のエントリがある必要があります。 2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4: 'qstr7_52_1.mq4' (962,43) にゼロディバイドがあります。 これだけです。 962.43ですが。 ほらね)))ありがとうございます!!!! Tretyakov Rostyslav 2020.11.27 12:06 #13056 Aleksei Stepanenko:こんなところにまで来ているのか? というのは、思いつきの話です。 に行く。 すると、描画される double prev01,prev02; if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0); if(Period()>Timeframe) prd=PERIOD_CURRENT; if(Period()<=Timeframe) prd=prd=Timeframe; for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--) { if(TimeMinute(time[i])==0)index=iBarShift(Symbol(), prd, time[i], false); ma_buffer_fast[i]=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index); ma_buffer_slow[i]=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index); prev01=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index+1); prev02=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index+1); if(prev01>=prev02&&ma_buffer_fast[i]<ma_buffer_slow[i]) {ma_buffer_stop[i]=ma_buffer_slow[i]+50*Point;} if(prev01<=prev02&&ma_buffer_fast[i]>ma_buffer_slow[i]) {ma_buffer_stop[i]=ma_buffer_slow[i]-50*Point;} } Aleksei Stepanenko 2020.11.27 14:34 #13057 この配列は交点にのみ正しい値を持ち、それ以外はEMPTY_VALUE である。したがって、何も見えていないのです。グローバル変数を 入力し、交差の瞬間に値を代入する必要があります。そして、交差した瞬間の現在値や、交差していないときの過去値がすでに出てきます。 double Stop=0; int OnCalculate(.... if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) Stop=ma_buffer_slow[i]+50*Point; if(ma_buffer_fast[i+1]<=ma_buffer_slow[i+1]&&ma_buffer_fast[i]>ma_buffer_slow[i]) Stop=ma_buffer_slow[i]-50*Point; ma_buffer_stop[i]=Stop; Tretyakov Rostyslav 2020.11.27 15:37 #13058 Aleksei Stepanenko:この配列は交点にのみ正しい値を持ち、それ以外はEMPTY_VALUE である。したがって、何も見えていないのです。グローバル変数を 入力し、交差の瞬間に値を代入する必要があります。そして、交差した瞬間の現在値や、交差していないときの過去値がすでに出てきます。 ありがとうございます、うまくいきました) BillionerClub 2020.11.27 17:23 #13059 インジケーター機能が動作中の場合、強制的にタイムフレーム変更をキャンセルすることは可能ですか? Tretyakov Rostyslav 2020.11.27 17:24 #13060 Aleksei Stepanenko:この配列は交点にのみ正しい値を持ち、それ以外はEMPTY_VALUE である。したがって、何も見えていないのです。グローバル変数を 入力し、交差の瞬間に値を代入する必要があります。そして、交差した瞬間の現在値や、交差していないときの過去値がすでに出てきます。 PeriodMaSlowを 2倍してみました。 if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0); if(Period()>Timeframe) prd=PERIOD_CURRENT; if(Period()<=Timeframe) prd=prd=Timeframe; for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--) で、最初のコードはエラーなしで動作します。 1...129913001301130213031304130513061307130813091310131113121313...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
インジケータにもう一つバッファを追加したのですが(double ma_buffer_stop[];)、描画されないし、エラーも出ます(
チェック、こんなところにまで入ってきているのか?
というのが真っ先に思い浮かびます。ゼロで割り算を キャッチすることもあるんです。(力学の世界ではどんなことも起こりうる)。
分割操作のコメントや、EAをチャートに投げるなどして探しています。
もっと普通の方法で、エラーのある行を取得する方法はないでしょうか?
問題は、ある特定の状態でのみエラーが発生することです。すなわち、ある時間枠で、新しいローソク足で、エラーが消えることがあります。4時の位置で気がつくといい感じです。探す時間はある。
もっと一般的な方法で、エラーのある行を取得する方法はないのでしょうか?
エキスパートログにゼロ除算が 行われたファイルと行番号のエントリがあるはずです。
Expert Advisor のログに、ゼロによる除算が 行われたファイルと行番号のエントリがある必要があります。
2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4: 'qstr7_52_1.mq4' (962,43) にゼロディバイドがあります。
これだけです。
962.43ですが。
ほらね)))ありがとうございます!!!!
こんなところにまで来ているのか?
というのは、思いつきの話です。に行く。
すると、描画される
この配列は交点にのみ正しい値を持ち、それ以外はEMPTY_VALUE である。したがって、何も見えていないのです。グローバル変数を 入力し、交差の瞬間に値を代入する必要があります。そして、交差した瞬間の現在値や、交差していないときの過去値がすでに出てきます。
この配列は交点にのみ正しい値を持ち、それ以外はEMPTY_VALUE である。したがって、何も見えていないのです。グローバル変数を 入力し、交差の瞬間に値を代入する必要があります。そして、交差した瞬間の現在値や、交差していないときの過去値がすでに出てきます。
ありがとうございます、うまくいきました)
この配列は交点にのみ正しい値を持ち、それ以外はEMPTY_VALUE である。したがって、何も見えていないのです。グローバル変数を 入力し、交差の瞬間に値を代入する必要があります。そして、交差した瞬間の現在値や、交差していないときの過去値がすでに出てきます。
PeriodMaSlowを 2倍してみました。
で、最初のコードはエラーなしで動作します。