[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 402

 
belck:

それが、私のアイデアです。


サービスワークには アイデアを持って行かなければなりませんが、ここでは特定の状況に特定のコードで対処するのが通例です。
 

こんにちは。MASDやAOなどのインジケータにチャネルを表示するインジケータを作りたいのですが、どうすればよいでしょうか?この指標は、基本指標(MASD、AOなど)のウィンドウに重ねて表示され、0の上下に平行線が描かれています。この線は、指定された期間の最大ピーク(0以上)と最小トラフ(0以下)の平均値として定義されています。
AOインジケータを例にしているのですが、うまくいきません。
アルゴリズム:
インジケーターの読み取り値を配列に 書き込みます。
この配列を走査してピーク/トラフを探 します。
それらを特定の配列に 書き込みます。
ピーク、トラフの平均値を求めます
得られた 値を インジケーターバッファに 代入します。
このステップでは、コードで定義されるのはインジケータ上のチャネル(0に張り付く)ではなく、最大のピークの平均値と最小の谷の平均値です。
山と谷の定義は、コードから削除して関数として実行することもできますが、今のところ私はこのままにしています - 問題に変わりはありません。
問題点:
1.端末がハングする(かなり)
2.ラインが平均値で表示されず、一定期間の最大/最小値で表示さ れる。
時間がかかったが、問題の原因がわからない。私のコードを修正するか、同様の問題のソースコードへのリンクを教えていただければ、さらに修正を試みます。ありがとうございました。

int start(){
    int limit=Bars-IndicatorCounted();
    for(int i=limit;i>=0;i--){
//     if (IsNewBar()){
       int j=0;
       for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 
             AO[j]=AO(d);                            // Запишем данные инд. в цикле в массив
             Print("АО-",AO[j],"-",d,"-",i);
             j++;
       }             
       int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;      
       //собираем экстремумы выше 0
       for (int p=4;p<=period-1; p++){          
         if (AO[p]>AO[p+1] && AO[p]>AO[p-1] 
            && AO[p+1]>AO[p+2]
            && AO[p+2]>AO[p+3]
            && AO[p+3]>0
            && AO[p-1]>AO[p-2]
            && AO[p-2]>AO[p-3]
            && AO[p-3]>0){                           // Нашли макс
            ArrayResize(Up, k_up+1);                 // Размер массива донышек под кол-во найденных донышек
            Up[k_up]=AO(p);                          // Заносим значение пика в массив                 
            Print("значение пика-",Up[k_up],"-",p);           
            SUp=SUp+Up[k_up];
            P1=SUp/(k_up+1);            
            k_up++;                                  // Увеличиваем индекс массива донышек                                 
         }
         //собираем впадины ниже 0
         if (AO[p]<AO[p+1] && AO[p]<AO[p-1] 
            && AO[p+1]<AO[p+2]
            && AO[p+2]<AO[p+3]
            && AO[p+3]<0
            && AO[p-1]<AO[p-2]
            && AO[p-2]<AO[p-3]
            && AO[p-3]<0){                           // Нашли мин
            ArrayResize(Dw, k_dw+1);                 // Размер массива донышек под кол-во найденных донышек
            Dw[k_dw]=AO[p];                          // Заносим значение пика в массив                                            
            Print("значение донышка-",Dw[k_dw],"-",p);                                           
            SDw=SDw+Dw[k_dw];
            P2=SDw/(k_dw+1);           
            k_dw++;// Увеличиваем индекс массива донышек   
         }         
       }
       level1[i]=P1;
       level2[i]=P2;
    }
    return(0);
}
//+------------------------------------------------------------------+
double AO(int a){double AO=iAO( NULL, 0, a);
     return(AO);
}
 
Roll:

ExistInHistoryToDay()です。
ありがとうございます!とても助かりました。
 
LOA:

こんにちは。
問題点:

1. 端末がハングアップする(著しく)

for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 


ループの中で配列のサイズを 大きくするのは残酷だ、だからハングアップする。一度にサイズを大きくする。またはタイムスリップを一度に使用する


P.S. 個人的なメッセージを見る

 

文字列型の 変数をループ再生するにはどうすればよいですか?

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
この構造をループに置き換えるにはどうすればよいのでしょうか?
 
こんにちは、オープンオーダーの利益が1パンゲットになったら、そのオーダーをクローズするという条件の書き方を教えてください。
 
first_may:
こんにちは、オープンオーダーの利益が1パンゲットになったら、そのオーダーをクローズするという条件の書き方を教えてください。

機能を使用する。

https://www.mql5.com/ru/forum/131859/page3#434225

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

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
 
Rorschach:

文字列型の変数をループ再生するにはどうすればよいですか?

この構成をループに置き換えるにはどうしたらよいでしょうか。

   string asSymbols[3] = {"EURUSD", "GBPUSD", "AUDUSD"};
   double A[3] = {0};
   for (int i = 0; i < ArraySize( sSymbols) && i < ArraySize( A); i++) A[i]= iClose(asSymbols[i], 0, 0);
 
Zhunko:



ありがとうございました。
 
ターミナルがハングするのは、ティック ごとにオブジェクトが作成・削除されるような、不正なオブジェクト処理のためでしょうか?