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

 
Andrey F. Zelinsky:
ここに少し書いてありますhttps://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

プリントする。

 
Andrey F. Zelinsky:
ここに少し書いてありますhttps://docs.mql4.com/ru/convert/normalizedouble
信じられないかもしれませんが、もともとデータはすべて正規化されていて、カンマの後にデジがあるんです。2倍値でも正規化する必要があることは承知しています。正規化された静的データを自分で再計算してみてください。コンパイラのエラーだと思いますが、間違っていればいいのですが。今のところ、MathRoundで解決しましたが、間違っているようです
 
arhipov-76:
信じられないかもしれませんが、もともとすべてのデータは正規化されており、デジは カンマの後でした。2倍値でも正規化する必要があることは承知しています。自分で正規化した静的データを再計算してみてください。コンパイラのエラーだと思うのですが、間違っていればいいのですが、これまでMathRound関数でこの問題を解決しましたが、間違っていました

Digisが何なのか分からないので、DoubleToString(...) 関数を試してみてください。

EA内部で今あるもので計算するのであれば、NormalizeDouble()でも計算は正しいのですが、例えばPrint, Alert, Commentのようにパラメータを外に出力したい場合は、DoubleToString(...) で正規化するようにしましょう。

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

0.0001という数字は、どのように正規化しても、5による除算があるため、2進数表現では無限周期分数のままです。コンピュータでは、この無限の分数を、収まる長さに切り詰めなければならない。それで割ると、また非常に長いものができてしまうので、これも切り捨てなければならない。を得るためには、結果の数値を10進数形式で、与えられた適当な桁数の小数を持つ文字列にプログラム内で変換する必要があります。すでにここに書かれているように、例えばDoubleToStringを使用する。

追伸:「結果の出力が10分の1になった」-そんなことはない、無駄な言いがかりである。1億分の1の差でそうなった...。

 
Timur1988:

こんにちは!アルゴリズムについて教えてください。
Pearsonの相関係数を計算する簡単なスクリプトを書きました。配列は、最初のバーから始まる終値に 基づくものである。

価格配列は、1本目から24本目までを取得します。
さて、24本のバーの相関を計算したいのですが、2本目(!)のバーから価格の配列を取ります。

アルゴリズムが分からないので、各価格配列を手動で入力しました。

24本では足手まといだし、100本の相関を知りたければ、1本1本配列を入力するのは面倒だ。
どうするんだ、みんな)

Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)) という文字列の平方根を修正した方が良いのでしょうかね。

 
Vladimir:

文字列計算の平方根も修正すべきだろう Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)))。

これは相関を計算するための関数です。

string Correlation1(double& CurOpen[], double& SubOpen[]) {
double sumXY2=0, sumX2=0, sumY2=0, sumXs2=0, sumYs2=0, res2=1;

int k=MathMin(ArraySize(CurOpen), ArraySize(SubOpen));
  if(k>2) {
   for(int i=0; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
  return(DoubleToStr(res2,2));
}
 
こんにちは!私は自分のロボットをデモ口座 に置き、2ヶ月目から稼働しています。今日、ターミナルを開くと、以前にも1つのシグナルで注文が出されていましたが、2つのシグナルで注文が出されています。注文数に制限があるのですが。その理由は何でしょうか。
 

私が使っているのは以下の通りです。

Вот что я использую

if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Buy<Low[1]&& sar>Close[1])
{SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);}
if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Sell>High[1] && sar<Close[1])
{SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//--------------------------------------------------------------------------------//


bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symb;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if ( OrderMagicNumber()==Magik_number) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Neron_76:

私が使っているのは以下の通りです。

サイクルは、OrdersTotal()-1 から 0 まで、逆順にカウントする必要があります。
 
Vitalie Postolache:
サイクルは、OrdersTotal()-1 から 0 まで、逆順に数えること。
ありがとうございます、やり直します。