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

 
MakarFX

ご返信ありがとうございます、松葉杖、悪い解決策ではありませんが、私の考えからすると、バランスが浮いているため、少し間違った動作をします、おそらく瞬時に行われず、いくつかのケースでは私の注文が何らかの理由でマイナスで終了し始めました。ただ、伸びはその通りなのですが、その分マイナスとのドローダウンも大きくなってしまいました。すべてをあきらめて、引き戻しのリミットを手動で設定することにしたので、毎日調整することになりました。

 
Порт-моне тв:

ご返信ありがとうございます、松葉杖、悪い解決策ではありませんが、私の考えからすると、 バランスが浮いているため、少し間違った動作を します、おそらく瞬時に行われず、いくつかのケースでは私の注文が何らかの理由でマイナスでクローズし始めました。ただ、伸びはその通りなのですが、その分マイナスとのドローダウンも大きくなってしまいました。あきらめて手動で取引制限を設定することにしたので、毎日調整する必要があります。

機能は正常に動作しています。

このように試してみてください。

//+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0;
   if(AccountBalance()>0) {b = AccountBalance()-DayProfit();}
   return(b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0; datetime st=iTime(_Symbol,PERIOD_D1,0);
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol() == _Symbol)
           { 
            if(OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return(p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

を追加し、注文終了関数に残高更新を追加

   if(OrderClose(бла бла бла))
     {
      StartBalance(); Print("Order Close");
     }
 
Maxim Kuznetsov:

をキャッチし、その瞬間の残高値を 計算します。

適切なインジケータを用意しろ」と言われたのは無駄ではありません。数行のコードに収まるものではありません。 なかなかキャパシティのあるアルゴリズムですね。

日付けが変わったことをキャッチするのは、「既知の日付けの数字が前日の数字と等しくない」ので簡単ですが、もっと複雑なんです


Alg.「D時点の残高を計算 する」(出金・補充を除く、スワップや手数料に関するバグあり)

残高:=当座預金残高それがAccountBalance()です。

履歴にある全ての成行注文が終了した場合。

終値がDと現在の間にある場合、Balance-= OrderProfit()+OrderSwap()+OrderCommision() となります。

列挙が完了すると、 Balanceが希望する 値になる...。

しかし、手数料はオープニングでチャージされ(つまりバランスラインに影響する)、我々はそれをクローズ時に考慮し、スワップは日替わりで取られ、我々は再びそれをクローズ時にのみ考慮することになる

と、大深度Dの場合、オーバーシュートで必要なオーダーが全て揃わない可能性があります

 
Порт-моне тв:

ご返信ありがとうございます、松葉杖、悪い解決策ではありませんが、私の考えからすると、バランスが浮いているため、少し間違った動作をします、おそらく即座にそれを行うことはできません、いくつかのケースでは私の注文は、なぜかマイナスで閉じ始めました。ただ、伸びはその通りなのですが、その分マイナスとのドローダウンも大きくなってしまいました。あきらめて、手動で取引制限を設定することにした。 毎日調整する必要があるからだ。

もう、皆さんの提案やアドバイスで迷っているので、私のアドバイスは全く的外れかもしれませんが、すみません...。

私はバランスを修正し、私は取引を継続するかどうかの決定を行う必要があるに従って、利益/損失をカウントするために、一日の初めに必要なものを理解しています...

そこで、次のように決定しました。

datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if(dayTime != iTime(_Symbol, PERIOD_D1, 0);
 {
  dayBalance = AccountInfoDouble(ACCOUNT_BALANCE));
  dayTime = iTime(_Symbol, PERIOD_D1, 0);
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

日中にExpert Advisorを再起動する場合は、スワップや手数料を考慮した本日の注文の損益計算を考慮し、OnInit()で日中開始時の残高を計算する必要があります。

マカーの能力を信じて、コードの中ですでにすべてを示すことができる......。

 

こんにちは。現在のバー番号を日の頭から判断する方法を教えてください。

現在のバーの番号を日の始まりから判断するにはどうしたらよいですか?

ありがとうございます。

 
prom18:

こんにちは。現在のバー番号を日の頭から判断する方法を教えてください。

現在のバーの番号を日の始まりから判断するにはどうしたらよいですか?

ありがとうございます。

      double BarNumber=NormalizeDouble((TimeCurrent()-iTime(_Symbol,PERIOD_D1,0))/60/Period()+0.5,0);

これは現在のバーであり、もし最後のバーが閉じていれば、-0.5となります。

 
MakarFX:

は現在のバーで、もし最後のバーが閉じていれば、-0.5となります。

ありがとうございます。試してみます。

 
MakarFX:

これは現在のバーで、最後に閉じた場合は、-0.5です。

分とエキゾチックで動作しません。

バーの数 != カウントの数

15分間に12分のバーがある場合もあります。

iBarShift()を使用するのがベターです。

 
Maxim Kuznetsov:

内蔵の iBarShift() を使用するのがよいでしょう。

どうしたらいいんだろう(

 
MakarFX:

どうしたらいいんだろう(

機能

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}