初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 798

 

こんにちは!フォーラムの皆さん、お力を貸してください。インジケーターを書いているところです。処理するバーの開店 時間を教えてほしい。この時間をtime[]に格納すればよさそうなものですが、ちょっとナンセンスなところがあります。

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[])
  {
//---check for rates total


   if(rates_total<2)
      return(0);
//--- starting work
   int start=prev_calculated-1;
//--- correct position
   if(start<1) start=1;
//--- main cycle

CalculateVolume(start,rates_total,time);


//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateVolume(const int nPosition,
                     const int nRatesCount,
                     const long &tim[],
                     )
  {
  
MqlDateTime dat1;


for(int j=nPosition;j<nRatesCount && !IsStopped();j++)
{
    TimeToStruct(tim[j],dat1);

    Print("год ",dat1.year," ",dat1.day," ",dat1.hour," ",dat1.min)


 }
} 

2017.11.20 17:48:01.590 (RTS-12.17,M1) 年 2016 29 15 26

2017.11.20 17:48:01.734 (RTS-12.17,M1) 年 2016 29 15 27

2017.11.20 17:48:01.878 (RTS-12.17,M1) 年 2016 29 15 29

2017.11.20 17:48:02.022 (RTS-12.17,M1) 年 2016 29 15 33

2017.11.20 17:48:02.165 (RTS-12.17,M1) year 2016 29 15 45

2017.11.20 17:48:02.310 (RTS-12.17,M1) year 2016 29 21 12

2017.11.20 17:48:02.454 (RTS-12.17,M1) 年 2016 1 20 54

2017.11.20 17:48:02.599 (RTS-12.17,M1) 年 2016 2 12 52

2017.11.20 17:48:02.743 (RTS-12.17,M1) 年 2016 2 22 28

2017.11.20 17:48:02.887 (RTS-12.17,M1) year 2016 2 23 20

2017.11.20 17:48:03.031 (RTS-12.17,M1) 年 2016 3 11 47

2017.11.20 17:48:03.175 (RTS-12.17,M1) 年 2016 3 22 34

2017.11.20 17:48:03.320 (RTS-12.17,M1) 年 2016 3 22 35

2017.11.20 17:48:03.463 (RTS-12.17,M1) 年 2016 4 21 56

2017.11.20 17:48:03.609 (RTS-12.17,M1) year 2016 4 23 32

1日に数本しかないように感じます。ヒントplz、私の脳はすでに混乱しています。

 
fxsaber:

はい、でも、曲がっています。

pivomoe:
一見すると、CopyTickはテスターで動作しているように見えます。テスターでCopyTicksの操作に既知のバグはありますか?CopyTicksRangeの実稼働はバグなし?

次のビルドでは、テスターでTRADEフラグが正しく表示されるようにします。

fxsaber

テスターのティックタイムにバグがあります。その都度、一定の値を引き算していかなければならないのです。SDは問題意識を持っている。

この点について詳しく教えてください。
 
トレードリクエスト(MqlTradeRequest)の構造を様々なバリエーションで研究しています。https://www.mql5.com/ru/articles/100 から既製の my_first_ea.mq5 Expert Advisor を取り出し、ソースコードで SAR 交差点でポジションを開くように条件を変更してみたところ、うまくいったのです。そこで、MQL5からMqlTradeRequest構造 体を用いて、SARによるポジションの変更・修正というトレーリングコードを追加したのですが、「Invalid stops」というエラーが発生します。リクエストに何か問題があるのでは?要するに、位置修正の勉強で行き詰まったのです。何が間違っているのか、よくわからない。
ファイル:
SAR_SAR.mq5  27 kb
 
Alexey Kozitsyn:

そのあたりを詳しく教えてください。

void OnTick()
{
  MqlTick Ticks[];
  
  if (CopyTicksRange(_Symbol, Ticks) != -1)
  {
    ArrayPrint(Ticks);              
    
    ExpertRemove();
  }
}
 
自分のコードのコメントを読むのに疲れた.........................。
 
DCodec:
自分のコードのコメントを読むのに疲れた.........................。
コードなし、コメントなし。
 

価格のステップ(「チークサイズ」の仕様で)を調べる方法を教えてください。

 
Aleksey Vyazmikin:

価格のステップ(「チークサイズ」の仕様で)を調べる方法を教えてください。

ht

 

ありがとうございました。探したけど見つからなかった...。

では、次の質問ですが、ステップが25だとすると、25で割り切れる数への丸めをどうアレンジするか、もしかしたら関数があるのでは?

 
Aleksey Vyazmikin:

ありがとうございました。探したけど見つからなかった...。

では、次の質問ですが、ステップが25だとすると、25で割り切れる数への丸めをどうアレンジするか、もしかしたら関数があるのでは?


関数を作ってみたところ、うまくいったようです

//+------------------------------------------------------------------+
//|Функция округления числа до кратного целого                       |
//+------------------------------------------------------------------+
double Okr(double cifra)
  {
     double TickSize=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
     double Okruglenie=NormalizeDouble(cifra/TickSize,_Digits)*TickSize;
     Print ("До кратного округления=",DoubleToString(cifra,_Digits), " После кратного округления=",DoubleToString(Okruglenie,_Digits));
     return(Okruglenie);
  }  
理由: