MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 817 1...810811812813814815816817818819820821822823824...1953 新しいコメント Maxim Kuznetsov 2019.04.23 00:21 #8161 Seric29:一つの式に対して、等式、減法、加算、不等式、乗法などをチェックするような小さな関数をたくさん追加すればいいのです。 比較のためには CompareDoublesWithEpsilon(double d1,d2,epsilon) のような関数があるはずです。 PS/「引き算、足し算、掛け算のチェック」ってなんだよ、わかんねーよ :-( yiduwi 2019.04.23 00:55 #8162 M1のバーのオープンタイムを 上位のタイムフレームから見るにはどうしたらいいですか? 低いバーから高いバーを見たい場合は int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-2; ArrayInitialize(BufferUP,EMPTY_VALUE); ArrayInitialize(BufferDN,EMPTY_VALUE); } for(int i=limit; i>=0; i--) { int yy= iBarShift(Symbol(),PERIOD_H1,time[i]); Print("iTime: ", iTime(Symbol(),PERIOD_H1,yy)); } Maxim Kuznetsov 2019.04.23 01:06 #8163 yiduwi:M1のバーオープン 時間を上位のタイムフレームから見るにはどうしたらよいですか? 低いバーから高いバーを見たい場合は ということです。 datetime time_h1=iTime(_Symbol,PERIOD_H1,1); // время открытия прошлого бара H1 int bar_m1=iBarShift(_Symbol,PERIOD_M1,time_h1); // соотв. ему бар периода M1 datetime time_m1=iTime(_Symbol,PERIOD_M1,bar_m1); // время его открытия //追記 - 違いはh2からで、月曜日の朝だけです :-) yiduwi 2019.04.23 01:51 #8164 Maxim Kuznetsov:私の理解が正しければ、では。 datetime time_h1=iTime(_Symbol,PERIOD_H1,1); // время открытия прошлого бара H1 int bar_m1=iBarShift(_Symbol,PERIOD_M1,time_h1); // соотв. ему бар периода M1 datetime time_m1=iTime(_Symbol,PERIOD_M1,bar_m1); // время его открытия //追記 - 違いはh2からで、月曜日の朝だけです :-) 最後のバーH 1の開始時刻が 01:00:00だとすると、01:01:00に開始したバーM1からtime_m1変数に時刻を取得 するにはどうすればよいでしょうか。 Maxim Kuznetsov 2019.04.23 02:16 #8165 yiduwi:最後のH1バーが01:00:00に開いたと すると、01:01:00に開いたM1バーから時間をtime_m1変数に取得 するにはどうすればよいでしょうか。time_m1_plus_1=time_h1 + 1 * PeriodSeconds(PERIOD_M1); // 突然ですが :-) 1 分 = 60 秒を足すだけです。 しかし、あなたは日/セッション/週またはエキゾチックな通貨/インデックス/ファンドの変更を危険にさらす場合は、確実にするために、iBarShift、iTimeを使用する - まともな場所でバーが最初の取引(ボリュームなしでバーがない)で形成されているので、取引がない場合は、 "クイック "になります。 yiduwi 2019.04.23 03:59 #8166 Maxim Kuznetsov:time_m1_plus_1=time_h1 + 1 * PeriodSeconds(PERIOD_M1); // 突然ですが :-) 1 分 = 60 秒を足すだけです。さて、これは貴重なものです。指定した時間が任意の時間枠のバーの中にあることを知るには、次のようにします。 for(int i=limit; i>=0; i--) { if(time[i]<=StringToTime("2019.04.23 01:01:00") && time[i]+Period()*PeriodSeconds(PERIOD_M1)>=StringToTime("2019.04.23 01:01:00") { BufferUP[i]=low[i]-10*Point;// } } しかし、時間が偶数で、分なし"2019.04.23 01:00:00" の 場合、矢印は2つのバーにあります、 01:00:00 のバーと 00:00:00 の前のバーに 余分なものを入れない方法は? kopeyka2 2019.04.23 08:23 #8167 一日のすべての部分と季節に良い))七面鳥によって書かれました。それは機能しますが、エキスパートセクションにエラーを永続的に書き込みます。問題を解決しようとしています...「何を一番上に」..)))教えてください、プリズ、私が経験不足で台無しにしたところ...。コード内の問題のある場所を赤で強調表示しました...または緑の方が良いでしょう!?))) PS MT5のハンドルの動作条件のため、原則としてハンドルオプションを拒否しますコードに重大なバグがある場合は、いくらかの賃金を支払う用意があります。しかし、私は問題の本質に到達したいと思います!!!! //+------------------------------------------------------------------+ //| Ind Sliding Line Level MT5.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //+----------------------------------------------+ //| Параметры отрисовки индикатора 1 | //+----------------------------------------------+ #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_width1 1 //---- enum method { Simple= MODE_SMA , Exponential= MODE_EMA , }; //---- enum applied { CLOSE= PRICE_CLOSE , OPEN= PRICE_OPEN , HIGH= PRICE_HIGH , LOW= PRICE_LOW }; //--- входные параметры input int InpMAPeriod = 10 ; // Период мультитаймфреймовой линии input int InpBars = 50 ; // Расчитать баров (Период линии х 5) input int InpMAShift = 0 ; // Сдвиг линии //--- параметры для выбранного таймфрема input string TimeBar = "2019.04.19 00:00" ; //Дата начала отсчета input bool DataBars = false ; //Считать по дате (true) input int MAShift = 2 ; //Сдвиг бара таймфрема input ENUM_TIMEFRAMES Timeframes = PERIOD_D1 ; //Таймфрейм скользящей input method MethodLine = Simple; //Метод расчета скользящей input applied AppliedPrice = CLOSE; //Расчет цены скользящей input ENUM_LINE_STYLE MAStyle = STYLE_DASH ; //Стиль всех скользящих линий input color ColorLine = clrRed ; //Цвет скользящей и таймфрейма input int maWidthAll = 0 ; //Толщина всех скользящих линий input bool Ray = true ; //Сдвиг тренда вправо до шкалы input bool LineTrend = true ; //Выбор Линия(true) Отрезок(false) input bool HLines = false ; //Выключатель горизонтального уровня //---- int i,period_ma,beginbar,nn,BigPeriod; double ExtLineBuffer[],ArrayPrice[]; double SMA= 0.0 ,EMA= 0.0 ; double bp,bp1,bp2,bp3; datetime time_1,time_2; string smaname= "" ,emaname= "" ; string tooltipsma= "" ,tooltipema= "" ; string type_ma= "" ,pr= "" ; bool sma= false ,ema= false ,ok; //+------------------------------------------------------------------+ //| simple moving average multytimeframes | //+------------------------------------------------------------------+ void CalculateSimpleMA( int rates_total, int prev_calculated, int begin, const double &price[]) { int j,limit; //--- first calculation or number of bars was changed if (prev_calculated== 0 ) // first calculation { limit=period_ma+begin; //--- set empty value for first limit bars for (j= 0 ;j<limit- 1 ;j++) ExtLineBuffer[j]= 0.0 ; //--- calculate first visible value double fvalue= 0 ; for (j=begin;j<limit;j++) fvalue+=price[j]; fvalue/=period_ma; ExtLineBuffer[limit- 1 ]=fvalue; } else limit=prev_calculated- 1 ; //--- main loop for (j=limit;j<rates_total && ! IsStopped ();j++) ExtLineBuffer[j]=ExtLineBuffer[j- 1 ]+(price[j]-price[j-period_ma])/period_ma; //--- } //+------------------------------------------------------------------+ //| exponential moving average multytimeframes | //+------------------------------------------------------------------+ void CalculateExponentialMA( int rates_total, int prev_calculated, int begin, const double &price[]) { int q,limit; double SmoothFactor= 2.0 /( 1.0 +period_ma); //--- first calculation or number of bars was changed if (prev_calculated== 0 ) { limit=period_ma+begin; ExtLineBuffer[begin]=price[begin]; for (q=begin+ 1 ;q<limit;q++) ExtLineBuffer[q]=price[q]*SmoothFactor+ExtLineBuffer[q- 1 ]*( 1.0 -SmoothFactor); } else limit=prev_calculated- 1 ; //--- main loop for (q=limit;q<rates_total && ! IsStopped ();q++) ExtLineBuffer[q]=price[q]*SmoothFactor+ExtLineBuffer[q- 1 ]*( 1.0 -SmoothFactor); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit () { period_ma= int (InpMAPeriod< 1 ? 1 : InpMAPeriod); smaname= "Ind SMA " + string (InpMAPeriod); emaname= "Ind EMA " + string (InpMAPeriod); //--- SetIndexBuffer ( 0 ,ExtLineBuffer, INDICATOR_DATA ); switch (Timeframes) { case PERIOD_MN1 : BigPeriod= PERIOD_MN1 ; ok= true ; pr= "MN1" ; break ; case PERIOD_W1 : BigPeriod= PERIOD_MN1 ; ok= true ; pr= "W1" ; break ; case PERIOD_D1 : BigPeriod= PERIOD_W1 ; ok= true ; pr= "D1" ; break ; case PERIOD_H12 : BigPeriod= PERIOD_D1 ; ok= true ; pr= "H12" ; break ; case PERIOD_H8 : BigPeriod= PERIOD_D1 ; ok= true ; pr= "H8" ; break ; case PERIOD_H4 : BigPeriod= PERIOD_D1 ; ok= true ; pr= "H4" ; break ; case PERIOD_H3 : BigPeriod= PERIOD_H4 ; ok= true ; pr= "H3" ; break ; case PERIOD_H2 : BigPeriod= PERIOD_H4 ; ok= true ; pr= "H2" ; break ; case PERIOD_H1 : BigPeriod= PERIOD_H4 ; ok= true ; pr= "H1" ; break ; case PERIOD_M30 : BigPeriod= PERIOD_H1 ; ok= true ; pr= "M30" ; break ; case PERIOD_M20 : BigPeriod= PERIOD_H1 ; ok= true ; pr= "M20" ; break ; case PERIOD_M15 : BigPeriod= PERIOD_M30 ; ok= true ; pr= "M15" ; break ; case PERIOD_M12 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M12" ; break ; case PERIOD_M10 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M10" ; break ; case PERIOD_M6 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M6" ; break ; case PERIOD_M5 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M5" ; break ; case PERIOD_M4 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M4" ; break ; case PERIOD_M3 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M3" ; break ; case PERIOD_M2 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M2" ; break ; case PERIOD_M1 : BigPeriod= PERIOD_M15 ; ok= true ; pr= "M1" ; break ; } switch (MethodLine) { case Simple: sma= true ; type_ma= "SMA " ; break ; case Exponential: ema= true ; type_ma= "EMA " ; break ; } //--- set accuracy IndicatorSetInteger ( INDICATOR_DIGITS , _Digits ); //--- sets first bar from what index will be drawn PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,period_ma); //---- line shifts when drawing PlotIndexSetInteger ( 0 , PLOT_SHIFT ,InpMAShift); //--- PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR ,ColorLine); //--- IndicatorSetString ( INDICATOR_SHORTNAME ,type_ma+ " " + string (period_ma)); //---- sets drawing line empty value-- PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 ); //---- ChartRedraw ( 0 ); //---- initialization done return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { ObjectsDeleteAll ( 0 ,smaname); ObjectsDeleteAll ( 0 ,emaname); ObjectsDeleteAll ( 0 , "No Period " ); Comment ( "" ); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- минимальное количество баров if (rates_total<period_ma- 1 +begin) return ( 0 ); //--- Количество начальных баров без отрисовки и значений PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,period_ma- 1 +begin); if (prev_calculated== 0 ) { ArrayInitialize (ExtLineBuffer, 0 ); ArrayInitialize (ArrayPrice, 0 ); } //--- calculation switch (MethodLine) { case Simple: CalculateSimpleMA(rates_total,prev_calculated,begin,price); break ; case Exponential: CalculateExponentialMA(rates_total,prev_calculated,begin,price); break ; } //считаем количество элементов буфера int size= ArraySize (ExtLineBuffer); ArrayResize (ArrayPrice,size, 100000 ); //---- Расчет и построение горизонтального уровня выбранного таймфрейма if (DataBars== false ) beginbar=MAShift; if (DataBars== true ) beginbar= iBarShift ( _Symbol ,Timeframes, StringToTime (TimeBar)); time_1= iTime ( _Symbol ,Timeframes,beginbar); time_2= iTime ( _Symbol ,Timeframes, 0 ); if (HLines== true ) { //+------------------------------------------------------------------+ //| Simple Moving Average | //+------------------------------------------------------------------+ if (sma== true && ok== true && Period ()<=BigPeriod) //SMA { int lim=period_ma+beginbar; double firstValue= 0.0 ; for (i=beginbar;i<lim;i++) switch (AppliedPrice) { case 1 : firstValue+= iClose ( _Symbol ,Timeframes,i); break ; case 2 : firstValue+= iOpen ( _Symbol ,Timeframes,i); break ; case 3 : firstValue+= iHigh ( _Symbol ,Timeframes,i); break ; case 4 : firstValue+= iLow ( _Symbol ,Timeframes,i); break ; default : firstValue+= iClose ( _Symbol ,Timeframes,i); break ; } firstValue/=period_ma; //----- SMA= NormalizeDouble (firstValue, _Digits ); if (LineTrend== true ) tooltipsma= "Line " +type_ma+ string (InpMAPeriod)+ " " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + DoubleToString (SMA, _Digits ); else tooltipsma= "Trend " +type_ma+ string (InpMAPeriod)+ " " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + "Original Price: " + DoubleToString (SMA, _Digits ); if (LineTrend== true ) HLine( 0 ,smaname,tooltipsma,time_1,SMA,MAStyle,maWidthAll,ColorLine); else PlotTrend( 0 ,smaname,tooltipsma, 0 ,time_1,SMA,time_2,SMA,ColorLine,MAStyle,maWidthAll, true , false , false , true ); //---- } //sma==true //---------------------------------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Exponential Moving Average | //+------------------------------------------------------------------+ if (ema== true && ok== true && Period ()<=BigPeriod) //EMA { int p,lmt; double SmoothFactor= 2.0 /( 1.0 +period_ma); if (prev_calculated== 0 ) lmt= 0 ; else lmt=InpBars; for (p=lmt;p>=beginbar;p--) { switch (AppliedPrice) { case 1 : ArrayPrice[lmt]= iClose ( _Symbol ,Timeframes,lmt); break ; case 2 : ArrayPrice[lmt]= iOpen ( _Symbol ,Timeframes,lmt); break ; case 3 : ArrayPrice[lmt]= iHigh ( _Symbol ,Timeframes,lmt); break ; case 4 : ArrayPrice[lmt]= iLow ( _Symbol ,Timeframes,lmt); break ; default : ArrayPrice[lmt]= iClose ( _Symbol ,Timeframes,lmt); break ; } switch (AppliedPrice) { case 1 : ArrayPrice[p]= iClose ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ; case 2 : ArrayPrice[p]= iOpen ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ; case 3 : ArrayPrice[p]= iHigh ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ; case 4 : ArrayPrice[p]= iLow ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ; default : ArrayPrice[p]= iClose ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ; } } //for / /------------------------------------------------------------------------------------------------------------- EMA= NormalizeDouble (ArrayPrice[beginbar], _Digits ); if (LineTrend== true ) tooltipema= "Line " +type_ma+ string (InpMAPeriod)+ " " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + DoubleToString (EMA, _Digits ); else tooltipema= "Trend " +type_ma+ string (InpMAPeriod)+ " " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + "Original Price: " + DoubleToString (EMA, _Digits ); if (LineTrend== true ) HLine( 0 ,smaname,tooltipema,time_1,EMA,MAStyle,maWidthAll,ColorLine); else PlotTrend( 0 ,smaname,tooltipema, 0 ,time_1,EMA,time_2,EMA,ColorLine,MAStyle,maWidthAll, true , false , false , true ); ArrayFree (ArrayPrice); //---- } //ema==true } //if(HLines==true) //--- return value of prev_calculated for next call return (rates_total); } //+------------------------------------------------------------------+ //| Вывод горизонтальной линии на график | //+------------------------------------------------------------------+ bool HLine( const long chart_ID= 0 , string name= "" , string tooltip= "" , datetime time= 0 , double price= 0 , int style= STYLE_SOLID , int width= 1 , color clr= clrBlack ) { //--- сбросим значение ошибки ResetLastError (); //--- if (! ObjectCreate (chart_ID,name, OBJ_HLINE , 0 , 0 ,price)) { Print ( __FUNCTION__ , ": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ()); return ( false ); } ObjectSetInteger (chart_ID,name, OBJPROP_STYLE , style); ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH , width); ObjectSetInteger (chart_ID,name, OBJPROP_COLOR , clr); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN , true ); ObjectSetString (chart_ID,name, OBJPROP_TOOLTIP ,tooltip); //---- return ( true ); } //+------------------------------------------------------------------+ //| Построение трендовой линии на графике | //+------------------------------------------------------------------+ bool PlotTrend( const long chart_ID= 0 , string name= "" , string tooltip= "" , const int subwindow= 0 , datetime time1= 0 , double price1= 0 , datetime time2= 0 , double price2= 0 , const color clr= clrBlack , const ENUM_LINE_STYLE style= STYLE_SOLID , const int width= 2 , const bool back= true , const bool selection= false , const bool ray= false , const bool hidden= true ) { //---- ResetLastError (); if ( ObjectFind (chart_ID,name)!=subwindow) { if (! ObjectCreate (chart_ID,name, OBJ_TREND ,subwindow,time1,price1,time2,price2)) { Print ( __FUNCTION__ , ": не удалось создать трендовую линию! Код ошибки = " , GetLastError ()); return ( false ); } } else { ObjectMove (chart_ID,name, 0 ,time1,price1); ObjectMove (chart_ID,name, 1 ,time2,price2); } ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr); ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style); ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width); ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back); ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection); ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection); ObjectSetInteger (chart_ID,name, OBJPROP_RAY ,ray); ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden); ObjectSetString (chart_ID,name, OBJPROP_TOOLTIP ,tooltip); //---- return ( true ); } //+------------------------------------------------------------------+ Igor Zakharov 2019.04.23 08:50 #8168 kopeyka2:インディーズを書きました。動作はするが、Expertsセクションにしつこくエラーを書き込む。 私のログはクリーンで、任意にモードを切り替えています(EMAもテスト済み)。エラーが表示される可能性のある設定のバリエーションを教えてください。 動作とエラーが同時に発生するのはどうなんだろうと考えていました。 Maxim Kuznetsov 2019.04.23 09:20 #8169 yiduwi:これは貴重なもので、何が必要なのか)与えられた時間が任意の時間枠のバーの内側にあることを知るために、次のことを行う必要があります。 しかし、時間が偶数で、分なし"2019.04.23 01:00:00" の場合、矢印は、01:00:00 のバーと 00:00:00 の前のバーの2つのバーにある 余分なものを入れない方法は? if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) { // время time[i] попало внутрь бара открытого в time_m1 } kopeyka2 2019.04.23 10:01 #8170 Igor Zakharov:ログはきれいで、任意にモードを切り替えています(EMAもテスト済み)。エラーが発生する可能性のある設定値のオプションを指定します。 動作と同時にエラーも出るのが面白かったです。 EMAライン20 2019.04.23 00:00 オンライン接続がない状態でMT5を起動すると、すぐに「array out...」と表示される。 エラーは様々ですが、常に存在します。オンラインでも再現可能だが、MTのスイッチが入っている時の方が多い。 そんな "バミューダパラレップス "の謎に迫ります。 1...810811812813814815816817818819820821822823824...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
一つの式に対して、等式、減法、加算、不等式、乗法などをチェックするような小さな関数をたくさん追加すればいいのです。
PS/「引き算、足し算、掛け算のチェック」ってなんだよ、わかんねーよ :-(
M1のバーのオープンタイムを 上位のタイムフレームから見るにはどうしたらいいですか?
低いバーから高いバーを見たい場合は
M1のバーオープン 時間を上位のタイムフレームから見るにはどうしたらよいですか?
低いバーから高いバーを見たい場合は
ということです。
datetime time_h1=iTime(_Symbol,PERIOD_H1,1); // время открытия прошлого бара H1
int bar_m1=iBarShift(_Symbol,PERIOD_M1,time_h1); // соотв. ему бар периода M1
datetime time_m1=iTime(_Symbol,PERIOD_M1,bar_m1); // время его открытия
//追記 - 違いはh2からで、月曜日の朝だけです :-)
私の理解が正しければ、では。
datetime time_h1=iTime(_Symbol,PERIOD_H1,1); // время открытия прошлого бара H1
int bar_m1=iBarShift(_Symbol,PERIOD_M1,time_h1); // соотв. ему бар периода M1
datetime time_m1=iTime(_Symbol,PERIOD_M1,bar_m1); // время его открытия
//追記 - 違いはh2からで、月曜日の朝だけです :-)
最後のバーH 1の開始時刻が 01:00:00だとすると、01:01:00に開始したバーM1からtime_m1変数に時刻を取得 するにはどうすればよいでしょうか。
最後のH1バーが01:00:00に開いたと すると、01:01:00に開いたM1バーから時間をtime_m1変数に取得 するにはどうすればよいでしょうか。
time_m1_plus_1=time_h1 + 1 * PeriodSeconds(PERIOD_M1); // 突然ですが :-) 1 分 = 60 秒を足すだけです。
しかし、あなたは日/セッション/週またはエキゾチックな通貨/インデックス/ファンドの変更を危険にさらす場合は、確実にするために、iBarShift、iTimeを使用する - まともな場所でバーが最初の取引(ボリュームなしでバーがない)で形成されているので、取引がない場合は、 "クイック "になります。
time_m1_plus_1=time_h1 + 1 * PeriodSeconds(PERIOD_M1); // 突然ですが :-) 1 分 = 60 秒を足すだけです。
さて、これは貴重なものです。指定した時間が任意の時間枠のバーの中にあることを知るには、次のようにします。
しかし、時間が偶数で、分なし"2019.04.23 01:00:00" の 場合、矢印は2つのバーにあります、 01:00:00 のバーと 00:00:00 の前のバーに 余分なものを入れない方法は?
一日のすべての部分と季節に良い))
七面鳥によって書かれました。それは機能しますが、エキスパートセクションにエラーを永続的に書き込みます。
問題を解決しようとしています...「何を一番上に」..)))
教えてください、プリズ、私が経験不足で台無しにしたところ...。
コード内の問題のある場所を赤で強調表示しました...または緑の方が良いでしょう!?)))
PS MT5のハンドルの動作条件のため、原則としてハンドルオプションを拒否します
コードに重大なバグがある場合は、いくらかの賃金を支払う用意があります。
しかし、私は問題の本質に到達したいと思います!!!!
インディーズを書きました。動作はするが、Expertsセクションにしつこくエラーを書き込む。
私のログはクリーンで、任意にモードを切り替えています(EMAもテスト済み)。エラーが表示される可能性のある設定のバリエーションを教えてください。
動作とエラーが同時に発生するのはどうなんだろうと考えていました。
これは貴重なもので、何が必要なのか)与えられた時間が任意の時間枠のバーの内側にあることを知るために、次のことを行う必要があります。
しかし、時間が偶数で、分なし"2019.04.23 01:00:00" の場合、矢印は、01:00:00 のバーと 00:00:00 の前のバーの2つのバーにある 余分なものを入れない方法は?
if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) {
// время time[i] попало внутрь бара открытого в time_m1
}
ログはきれいで、任意にモードを切り替えています(EMAもテスト済み)。エラーが発生する可能性のある設定値のオプションを指定します。
動作と同時にエラーも出るのが面白かったです。
EMAライン20 2019.04.23 00:00
オンライン接続がない状態でMT5を起動すると、すぐに「array out...」と表示される。
エラーは様々ですが、常に存在します。オンラインでも再現可能だが、MTのスイッチが入っている時の方が多い。
そんな "バミューダパラレップス "の謎に迫ります。