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

 
Renat Akhtyamov:

ここで考慮すべきなのは、ループブロックi==xの後に

この場合、Array[i] after for(...){} は配列オーバーランエラーを返し、それで終了です。

例えば、コードの後半で変数jを指定し、誤ってそれをiと呼んでしまった場合などです。あるいは、配列のインデックス[1]の代わりに[i]などと書いてもよいでしょう。
ここに書いたのは、特定のコードについてではなく、それがどのようなものであるかの一例です。配列の境界がなく、エラーを発見するのが難しく、その場所を特定するために何分も貴重な時間を費やすことになることも十分あり得ます。
 

(ラグが出始めたのでヒントが欲しい)

こんな構造もあるんですね。

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

N本のローソク足で、レンジの高値・安値を 求めます。

質問:同じHigh/Lowでも影ではなく、体で探す方法はありますか?

 
Vitaly Muzichenko:

(ラグが出始めたのでヒントが欲しい)

こんな構造もあるんですね。

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

N本のローソク足で、レンジの高値・安値を 求めます。

質問:同じHigh/Lowでも影ではなく、体で探す方法はありますか?

ローソク足の上部のfmax(Open[i],Close[i])と下部のfmin(Open[i],Close[i])を求めたいのですが。
 
Artyom Trishkin:
トップはfmax(Open[i],Close[i])、ボトムはfmin(Open[i],Close[i])を探す必要があります。

つまり、High/Lowを探す2行ではなく、ループLoopをする?

HighRange =iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1))。

LowRange =iLow(シンボル,0,iLowest(シンボル,0,MODE_LOW,RangeBar,1))

これはインジケータではなくEAに必要で、EAでは正常に動作するのですが、ボディでどうやって範囲を求めるのか......それが思いつきません。

 
Vitaly Muzichenko:

つまり、High/Lowを探す2行ではなく、ループLoopをする?

HighRange =iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1))。

LowRange =iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

インジケータではなくExpert Advisorで必要なのですが、Expert Advisorでは正常に動作するのですが、bodyによる範囲の求め方がわかりません。

テストスクリプトを投げてみました。不正確かもしれません、私は作業していません。ぜひとも解明してほしい。

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
何か質問があれば聞いてください...
 
Artyom Trishkin:

テストスクリプトを組んでみました。その場で書いたので不正確な点があるかもしれません。コツをつかんでほしいですね。

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
何かあったら聞いてください...

ありがとうございます!効果抜群です

PS.これって5でも使えるんでしょ?

 
Vitaly Muzichenko:

ありがとうございます!効果抜群です

PS.これって、5でも使えるんですね?

ええ、クロスプラットフォームのコードに挑戦しています。あるいは5thのための最小限の改造で。
 
売り(Slevel)のストップロスを 追加するのを手伝ってください。
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool   result;
double stop;
int    cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
 
Artyom Trishkin:

テストスクリプトを添付します。不正確かもしれません、手を動かしていないのです。ぜひ理解してほしい。

何か質問があれば...

アルテムさんには申し訳ないのですが、この問題の解決策をもっとシンプルに示したいのです

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

皆さんもコードに書いて、必要なチェックを入れていただければと思います。mql4、mql5ともに機能は同じです。

 
Alexey Viktorov:

Artemさん、申し訳ありませんが、この問題に対してよりシンプルな解決策を示したいのです

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

皆さんもコードに書いて、必要なチェックを入れていただければと思います。mql4、mql5ともに機能は同じです。

О!ありがとうございます。朝、自分で当てたことがない...。たしかに、アレイが埋まっていないかチェックする必要がありますね。4倍では見たことがありませんし、5倍では過去の データがないため、初回では埋まらないことが多いようです。

ZS もっと寝たほうがいい。思考がその方向に働く。