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

 
novichok2018:

12分になってもメッセージが表示される。

Printを挿入し、配列が満たさ れる関数の最初にあること

Print("Range = ", ArrayRange(NewsArr,1));

を表示し、2次元の値の数を表示します。

 
Ilya Prozumentov:

全てからわかるのは、NomNewsはすでに999より大きい状態でWhileループに入るということです。それなら、なぜそうなるのかを調べて、この変数をどこかでリセットする必要があります。

これを確認するには、ループの最初に書きます。

はい、11分目でプリントは1000枚です。

 
Alekseu Fedotov:

Printを挿入し、配列が満たさ れる関数の最初にあること

を表示し、2次元の値の数を表示します。

Whileループの 最初に挿入したところ、infiniteRange = 1000となりました。 挿入する場所が悪かったのでしょうか

この数値(関数?)は何ですか: datetime TimeNewsFunck(int nomf)

{

文字列 s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4)) のようになります。

return((datetime)(StringToTime(time) + GMTplus*3600))

}

また、int nomfの値はどこから取得しているのでしょうか?見つからなかったんです。

 
novichok2018:

Whileループの 最初に挿入したら、infiniteRange = 1000となりました。 挿入する場所を間違えたのでしょうか

そして、この数値(関数?)は何なのか: datetime TimeNewsFunck(int nomf)

{

文字列 s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4)) のようになります。

return((datetime)(StringToTime(time) + GMTplus*3600))

}

また、int nomfの値はどこから取得しているのでしょうか?見つかっていません。

そして、試行錯誤の末にたどり着いたのが、この機能です。もしかして、それが元凶なのでしょうか?

bool CheckInvestingNews(int &pwr,datetime &mintime)
  {

   bool CheckNews=false; pwr=0; int maxPower=0;
   if(MidleNews || HighNews)
     {
      if(TimeCurrent()-LastUpd>=Upd){Print("Investing.com News Loading...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
      WindowRedraw();
      //---Draw a line on the chart news--------------------------------------------
      if(DrawNewsLines)
        {
         for(int i=0;i<NomNews;i++)
           {
            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
            if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][i])<0)continue;
            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;

            color clrf=clrNONE;
            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;
            if(MidleNews && StringFind(NewsArr[2][i],"Moderate")>=0)clrf=MidleColor;
   //         if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;

            if(clrf==clrNONE)continue;

            if(NewsArr[3][i]!="")
              {
               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);
               ObjectSet(Name,OBJPROP_COLOR,clrf);
               ObjectSet(Name,OBJPROP_STYLE,LineStyle);
               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);
               ObjectSetInteger(0,Name,OBJPROP_BACK,true);
              }
           }
        }
      //---------------event Processing------------------------------------
      int ii;
      for(ii=0;ii<NomNews;ii++)
        {
         int power=0;
         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }
         if(MidleNews && StringFind(NewsArr[2][ii],"Moderate")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }
 //        if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }
         if(NFPNews && StringFind(NewsArr[3][ii],"Nonfarm Payrolls")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }
         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && (!OnlySymbolNews || (OnlySymbolNews && StringFind(ValStr,NewsArr[1][ii])>=0)))
           {
            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }
              }else{
            CheckNews=false;
           }
        }
      if(maxPower>0){ CheckNews=true; oppoz=true; }
     }
   pwr=maxPower; 
   return(CheckNews);
  }
 
novichok2018:

そして、いくらやってもわからない機能があるんです。もしかして、そこに問題があるのでは?

それを自分で考えるのは作者だけです。OnTick()からコードを送信した方が良い。

 
novichok2018:

そう、11分目にプリント1000を出したのです。

置き換えてみてください

while(!IsStopped())

をこのセリフで。

while(NomNews<300 && !IsStopped())
 
Ilya Prozumentov:

式中の((2*psd*usd)*((2*psd*usd)-C))/(C-1)を超える場合。

指数関数的に計算する場合: ^0.5 は *0.5 ではない

ルックスルーのシンボルとマジックの取引が1件もない場合、または損益が1件もない場合、または1組しかない場合(C=1)には、0による除算が行われます。

計算式自体の前に、psd と usd が > 0 であることと、C !=1 であることを確認する必要があります。

利益が出ているペアは、利益>1、損失<1で計算され、利益=1のペアは分析されない、つまり1もこのグループかあのグループのどこかに含まれなければならない。

この関数では、まずシンボルとマジックナンバーに一致する取引番号を選択し、番号が変わったかどうかをチェックし、変わった場合は zn を再計算し、変わらない場合は zn を返すようにするとよいでしょう(この場合の zn はゼロ化せず、印刷時に != 0 をチェックする必要がありません)。

Owlは、変数wwとnnに依存しているため、あなたの関数が動作すると、それらが変化してowlのアルゴリズムが壊れるので、動作しなくなります。

コードの設計ミスがあれば、何もコンパイルできなかったでしょう。

ありがとうございますとしか言いようがない。runetの中で唯一助けてもらった場所です。

これでプリンタは次のように「Stop_Ma_v_5.1 EURUSD,M15: == Z-count equals = -nan(ind) 」と生成します。その意味と、コードが返すべき数値をアドバイスしていただけませんか?

コード:

//+------------------------------------------------------------------+
//| Подсчёт z-вероятности. @axe44 Алексей Корольков                  |
//+------------------------------------------------------------------+
  
double Z()
  {
    zn=0;          // z-число
    psd=0;         // кол. положительных сделок
    usd=0;         // количество отрицательных сделок 
    www=0;         // боол переменная 
    nnn=0;         // боол переменная
    kolichestvo=0; // подсчёт закрытых ордеров открытых роботом
    C=0;          // C = количество чередований между отрицательными и положительными сделками
    index=OrdersHistoryTotal(); 
      if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделки
    //if(index<30) return(0);                 // берём не менее 30
    count=OrdersHistoryTotal();             // считаем от скольки 
    prom=count-index;                       // выделяем только последние сделки
    if (prom<0) prom=0;                     // исключаем ошибки
  
   for( i=prom;i<=count;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;www=1;nnn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;www=0;nnn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           kolichestvo++;
           }
        }
     }
    /*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
          */ 
            
            if(kolichestvo>30&&psd>0&&usd>0&&C!=1)
            zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);
      
     
     
   return(zn);
  }
ありがとうございました。
 
aleksandr bebishev:

Mql5の皆さん、ヘッジ口座のポジションを決済 する依頼をするのを手伝ってくれませんか?状況:買いポジションを持ち、売り指値で決済する必要がある。質問:選択したポジションを 正確に決済し、新規の売りロック買いを行わないようにするには、どのようにリクエストを書けばよいのでしょうか?コメント付きのコードを書いてくださいありがとうございました。

同じシンボルについて、ある新規注文が別の新規注文の反対方向で閉じること。

boolOrderCloseBy()
intticket,// 決済する注文の番号
intopposite,// 逆順の番号
arrow_color//
);

パラメータ

チケット

[クローズする注文の固有注文番号

対極

[逆順のユニークなシーケンス番号。

矢印の色

[チャート上の終値の矢印の色。このパラメータがない場合、または値がCLR_NONEの場合は、チャートに矢印は表示されません。

戻り値

関数が成功した場合はtrueを、エラーが発生した場合はfalseを返す。エラー 情報を取得するには、GetLastError() を呼び出します。

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)とする。
{
OrderCloseBy(order_id,opposite_id;)です。
return(0) です。
}

追伸:このスレッドではMQL4のみを解析しています。

 
Aliaksei Karalkou:

ありがとうございますとしか言いようがない。ルネットの中で、唯一、彼らが助けてくれた場所です。

ここでプリンタは次のように「Stop_Ma_v_5.1 EURUSD,M15: == Z-Account Equals = -nan(ind) 」と生成します。その意味と、コードが返すべき数値をアドバイスしていただけませんか?

コード:

ありがとうございました。
ナン - NaN - 数字ではない - 数字ではないZ計算の数値を正規化して みる
 
Aliaksei Karalkou:

ある未決済注文を、同じ商品の別の未決済注文が反対方向に決済すること。

boolOrderCloseBy()
intticket,// 決済する注文の番号
intopposite,// 逆順の番号
arrow_color//
);

パラメータ

チケット

[クローズされる注文のユニークな連番。

対極

[逆順のユニークなシーケンス番号。

矢印の色

[チャート上の終値の矢印の色。このパラメータがない場合、またはその値がCLR_NONEの場合は、チャートに矢印は表示されません。

戻り値

関数が成功した場合はtrueを、エラーが発生した場合はfalseを返す。エラー 情報を取得するには、GetLastError() を呼び出します。

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)とする。
{
OrderCloseBy(order_id,opposite_id;)です。
return(0) です。
}

追伸:このスレッドではMQL4のみを解析しています。

いいえ、mql4やmal5に関する質問はこのスレッドで扱います。アルゴリズムやコードだけでなく、mql4からmql5への移行を促進することが主な目的でしたから。