[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 424

 
gyfto:

まあ、理論的には、追加のインジケータバッファを自己宣言して、さらにトレンドラインを使用すれば、うまくいくのでしょうが......。

ではなぜ、ドキュメントには「
バッファの数は8を超えてはいけない
」と書かれているのでしょうか。ここは明確 ではありません。メインバッファの数とは書いてない、全部とは書いてない。バッファの数が書いてあって、それで終わりです。これを読んでいると、あるインジケーターのバッファの総数に適用されるはずだと理解しているわけです。
 
gyfto:

いいえ、ObjectCreate()のことです、そこでウィンドウ番号を設定する必要があります。サブウィンドウである場合(つまりメインウィンドウであるゼロでない場合)の設定方法を紹介しました。

オブジェクトを作成 するときに、WindowOnDroppedという関数パラメータがありますが、これはすでに相対的にメインウィンドウのようなものなのですね。それとも、メインウィンドウはターミナルの一番左のウィンドウ なのでしょうか?
 

こんにちは!Buystopの注文が削除されない理由がわかりません。

extern double Lots       =0.01;
extern int    Magic      =333;

extern int    StopLoss      = 100;      // Размер фиксированного стопа
extern int    TakeProfit    = 100;       // Размер фиксированного тэйка
extern int    DistanceSet   = 160;      // Расстояние от рынка
extern int    Slippage      = 3;       // Проскальзывание цены
color  clOpenBuy     = LightBlue;    // Цвет ордера BuyStop
color  clOpenSell    = LightCoral;   // Цвет ордера SellStop
string Name_Expert   = "Scalp";

string Symb;
bool Work=true;

extern bool   UseSound       = True;  // Использовать звуковой сигнал
extern string NameFileSound  = "expert.wav";  // Наименование звукового файла
//============================================================================================
int start()
  {
   int
   Total,
   Tip=-1,
   Ticket,
   TicketB,
   TicketS,
   TicketMB,
   TicketMS,
   buys,
   sells,
   mbuys,
   msells;
   double
   OP_PriceSell,
   OP_PriceBuy, 
   Lot,
   Lts,
   Min_Lot,
   Max_Lot,
   Step,
   Free,
   One_Lot,
   Price,
   SL,
   TP,
   TP1,
   PriceB,
   PriceS,
   SLB,
   SLS;
   bool
   Ans  =false,
   Opn_B=false,
   Opn_S=false,
   Cls_B=false,
   Cls_S=false;
//============================================================================================
   // Учёт ордеров
   Symb=Symbol();
   Total=0;
   buys=0;
   sells=0;
   mbuys=0;
   msells=0;                                    
   for(int i=1; i<=OrdersTotal(); i++)
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true)
        {
         Total++;
         if(OrderType()==OP_BUYSTOP)  buys++;
         if(OrderType()==OP_SELLSTOP) sells++;
         if(OrderType()==OP_BUY)  mbuys++;
         if(OrderType()==OP_SELL) msells++;
         if(OrderType()==OP_BUYSTOP) TicketB=OrderTicket();
         if(OrderType()==OP_SELLSTOP) TicketS=OrderTicket(); 
         Ticket=OrderTicket();
         Tip   =OrderType();
         TP    =OrderTakeProfit();
         Lot   =OrderLots();
        }
     }
//============================================================================================
   // Открытие ордеров
   while(true)                                  
     {
      if (Total==0)            
        {                                      
         star();
        }
      break;                                   
     }
//============================================================================================
  while(true)
     {
      if(Total==2)
        {
         if(msells==1)
           {
            if(buys==1)
              {
               if(OrderType()==OP_BUYSTOP && OrderLots()==Lots)
                 {
                  OrderDelete(Ticket);
                 }
              }
           }
        }
      if(Total==2)
        {
         if(mbuys==1)
           {
            if(sells==1)
              {
               if(OrderType()==OP_SELLSTOP && OrderLots()==Lots)
                 {
                  OrderDelete(Ticket);
                 }
              }
           }
        }
      break;
     }  
//============================================================================================
   return;
  }
//============================================================================================
//+------------------------------------------------------------------+
void star() {
  double ldStop=0, ldTake=0;
  double pAsk=Ask+DistanceSet*Point;
  double pBid=Bid-DistanceSet*Point;

  if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
  if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
  SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake);

  if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
  if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
  SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake);
}

//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake) {
  color  clOpen;
  string lsComm=GetCommentForOrder();

  if (op==OP_BUYSTOP) clOpen=clOpenBuy;
  else clOpen=clOpenSell;
  OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,0,0,clOpen);
  if (UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert+" "+GetNameTF(Period()));
}

//+------------------------------------------------------------------+
//| Возвращает наименование таймфрейма                               |
//+------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
        switch (TimeFrame) {
                case PERIOD_MN1: return("Monthly");
                case PERIOD_W1:  return("Weekly");
                case PERIOD_D1:  return("Daily");
                case PERIOD_H4:  return("H4");
                case PERIOD_H1:  return("H1");
                case PERIOD_M30: return("M30");
                case PERIOD_M15: return("M15");
                case PERIOD_M5:  return("M5");
                case PERIOD_M1:  return("M1");
                default:                     return("UnknownPeriod");
        }
}
//+------------------------------------------------------------------+
 
hoz:

では、なぜ「
バッファの数は8を超えてはいけない
」とドキュメントに書かれているのか、ここが不明確 です。メインバッファの数...全バッファとは書いてない。バッファの数が書いてあって、それで終わりです。それで読んでいると、ある指標のバッファの総数に適用さ れることになっているんです。

インジケーターバッファの話じゃなくて、インジケーターバッファのシミュレーションの話ね。IndicatorCounted()からラッパーにArrayResize(CustomBuffer, Bars)があり、右端のトレンドラインの端がbidで再描画されるはずです。

ホズ

オブジェクトを作成するときに、WindowOnDroppedという関数パラメータがありますが、これはすでに相対的にメインウィンドウのようなものなのです。それとも、メインウィンドウはターミナル内のウィンドウの中で 一番左にあるのでしょうか?
いや、私も最初は戸惑いましたよ。例えば、euronとgoldの2つのチャートを開いています。つまり、どちらもインデックスはゼロ。ただし、サブウィンドウがある場合は、1つから番号付けされます。例えば、ユーレンチャートで3つのインデックス、ゴールドで2つ、そして#property separate_windowで5つとも異なるサブウィンドウを投げています。そうすると、eureneはウィンドウ番号が0、1、2、3、ゴールドが0、1、2になります。
 

質問があります。正直、脳みそが沸騰しています。もし可能であれば、私を助けてください。

int n=1, limit=3;
double result;//или int result, что не столь сейчас важно
double temp[];
int start(){
        for(int slow=10; slow<=10*limit; slow++){
                for(int fast=10; fast<=slow; fast++){
                        for(int period=1; period<=slow/10; period++){
                                n++; Print(n-1, ": ", slow-9, ", ", fast-9, ", ", period);
                                //здесь идёт тестирование машки с параметрами slow, fast, period, а результаты тестирования заносим в массив:
                                ArrayResize(temp,n); temp[n-1]=result;
                        }
                }
        }
        //и находим максимальный результат:
        int max=ArrayMaximum(temp);
   return(0);
}

さて、質問ですが、slow、fast、periodの 値をmax(配列中の項目の位置)で復元するにはどうしたらよいでしょうか?temp[]に値を入れる順番は、Print()で指定します。リミットには3を入れましたが、そこは何個でもOKです。以下は、最初の77個の値(limit=2)である。

            10: 4, 4, 1  20: 6, 5, 1  30: 8, 2, 1  40: 9, 4, 1   50: 10, 5, 1   60: 11, 3, 1  70: 11, 8, 1
1: 1, 1, 1  11: 5, 1, 1  21: 6, 6, 1  31: 8, 3, 1  41: 9, 5, 1   51: 10, 6, 1   61: 11, 3, 2  71: 11, 8, 2
2: 2, 1, 1  12: 5, 2, 1  22: 7, 1, 1  32: 8, 4, 1  42: 9, 6, 1   52: 10, 7, 1   62: 11, 4, 1  72: 11, 9, 1
3: 2, 2, 1  13: 5, 3, 1  23: 7, 2, 1  33: 8, 5, 1  43: 9, 7, 1   53: 10, 8, 1   63: 11, 4, 2  73: 11, 9, 2
4: 3, 1, 1  14: 5, 4, 1  24: 7, 3, 1  34: 8, 6, 1  44: 9, 8, 1   54: 10, 9, 1   64: 11, 5, 1  74: 11, 10, 1
5: 3, 2, 1  15: 5, 5, 1  25: 7, 4, 1  35: 8, 7, 1  45: 9, 9, 1   55: 10, 10, 1  65: 11, 5, 2  75: 11, 10, 2
6: 3, 3, 1  16: 6, 1, 1  26: 7, 5, 1  36: 8, 8, 1  46: 10, 1, 1  56: 11, 1, 1   66: 11, 6, 1  76: 11, 11, 1
7: 4, 1, 1  17: 6, 2, 1  27: 7, 6, 1  37: 9, 1, 1  47: 10, 2, 1  57: 11, 1, 2   67: 11, 6, 2  77: 11, 11, 2
8: 4, 2, 1  18: 6, 3, 1  28: 7, 7, 1  38: 9, 2, 1  48: 10, 3, 1  58: 11, 2, 1   68: 11, 7, 1
9: 4, 3, 1  19: 6, 4, 1  29: 8, 1, 1  39: 9, 3, 1  49: 10, 4, 1  59: 11, 2, 2   69: 11, 7, 2
 
gyfto:

質問があります。正直、脳みそが沸騰しています。もし可能であれば、私を助けてください。

さて、質問ですが、slow、fast、period by max(配列内の項目の位置)の値を復元するにはどうしたらよいでしょうか?temp[]に値を入れる順番は、Print()で指定します。制限に3を入れましたが、何個でもいいです。


n++」は結果が最大かどうかをチェックし、最大であればslow、fastなどの値を記憶する。
 
遅い、速い...でさらに3つの配列(または1つの3次元配列)を作ればいいんです。この方が、結果を何らかの方法でソートしたい場合に、常にテストパラメータが利用できるため、良い。
 
これらのアクションが頻繁にある場合、例えば、1バーまたは10バーごとに1回、initemで結果用の配列とパラメータ値で3つの配列をスケールし、これらのループをスクロールし、配列に期間の値を埋める方が良いです。そして、それを1ループでスクロールさせる。そして、ArrayMaximum関数を使って、物事を整理することができるようになります。そうすることで、少しでも早く作業ができるようになります。
 
gyfto:

いや、私も最初は戸惑いましたよ。例えば、ユーロと金という2つのチャートを開いています。つまり、どちらもインデックスはゼロ。ただし、サブウィンドウがある場合は、1つから番号付けされます。例えば、ユーレンチャートで3つのインデックス、ゴールドで2つ、そして#property separate_windowで5つとも異なるサブウィンドウを投げています。そうすると、エウレンはウィンドウ番号が0、1、2、3、ゴールドは0、1、2ということになります。

そのとおりです。ただ、私は七面鳥を扱う仕事が全くないので、ヘルプを勉強しているときに注意しなかったんです。すべてに意味がある。

ジフト

インジケーターバッファーの話ではなく、インジケーターバッファーのシミュレーションの話です。IndicatorCounted()のラッパーにArrayResize(CustomBuffer, Bars)があり、右端のトレンドラインの端がBidで再描画されるはずです。

そして、具体的にどうすれば6本以上の線をグラフに描けるのかを聞いていたのです。どのウィンドウで(0でもいいし、他でもいい)。それが私の一番の関心事であり、そもそも私があなたに尋ねたことでもあるのです。
 
Integer:

ここで、"n++"は結果が最大であるかどうかをチェックし、最大であれば、slow、fastなどの値を記憶する

考えてもみなかった。


Integer:
Slow、Fast...の3つの配列(または1つの3次元配列)をさらに作ることができます。その方が、結果を何らかの方法でソートしたい場合に、常にテストパラメータが利用できるからです。

3次元が理想ですが、ArrayMaximum()は 1次元でしか動作しないので、配列を線形に収束させる必要があり、また、すべてのものがどこにあるのか把握する必要があります。でも、fastMax=slowにしているので、そこが悩みどころです。しかし、3種類のアレイは...同じ結果になったので、立体かリニアのどちらかですね。


整数値
結果用のスケール配列

この用語がわからないのですが、説明してください。立方体の中に長さの線形配列を作る?


まあ、少なくとも選択肢はすでにあるわけですが。MathMax(result, resultPrev)を経由する。